Iptable pour serveur web apache 2 sous debian 4.0

IOP,
je vais mettre en ligne un serveur web qui hebergera notre site (http), puis notre extranet (https).
Mon serveur web sera une debian avec le minimum d’installé (juste les pack
et par defaut sans interface graphique). je vais rajouter apache + tout le “bordel” de php, myql… ainsi que openssh-server (avec fail2ban).
Ce server est dans une DMZ deriere un Netasq F200 (pas trop mal configuré :wink: ). Il y a quelque port ouvert pour aller sur l’exterieur genre http, https,smtp,pop,imap,dns. Et de l’exterieur vers la DMZ il y a seulemnt http et https. Donc j’amerai savoir i il faut regler le netfilter de la debian malgré cette securité :bulb:

Merki

PS : je vais administrer par ssh le serveur depuis le LAN vers la DMZ… directement

Alu,
Si ton FW NetAsq est bien paramétré no problemo.
Mais par secu je ferais un chti iptables sur ton serveur web, autorisant seulement les ports 80,22,443.
A+
Royal Kebab

IOP,
oki :smiley:

heuuu, y a dse pro de netfilter ici??? j’ai fait un truc vite fait et j’aimerai des avis :stuck_out_tongue:

[code]# On fait le menage
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

On rejete tout par defaut

iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t nat -P PREROUTING DROP
iptables -t nat -P POSTROUTING DROP
iptables -t nat -P OUTPUT DROP
iptables -t mangle -P PREROUTING DROP
iptables -t mangle -P INPUT DROP
iptables -t mangle -P OUTPUT DROP
iptables -t mangle -P FORWARD DROP
iptables -t mangle -P POSTROUTING DROP

On accepte tout sur l’interface loopback

iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUPUT -i lo -j ACCEPT

On accepte les packets d’une connexion deja etablie

iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A OUPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

On rejete les packets invalide

iptables -t filter -A INPUT -m state --state INVALID -j DROP
iptables -t filter -A OUPUT -m state --state INVALID -j DROP

Connexions autorisees en entre

iptables -t filter -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT

Connexions autorisees en sortie

iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 20 -j ACCEPT
iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -i eth0 -p udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 443 -j ACCEPT
[/code]

Y a des truc qui servent pas peut etre…? des choses qui manque…?

Voilà mon avis, vite fait.

  • Le filtrage, c’est dans la table ‘filter’ puisque chaque paquet rencontre forcément une des chaînes de cette table d’où qu’il vienne et où qu’il aille. Donc il vaut mieux régler la politique par défaut des chaînes des autres tables à ACCEPT. Autrement il faut ajouter des règles ACCEPT dans ces chaînes, sinon rien ne passe. On peut aussi carrément ne pas charger ces tables si on ne s’en sert pas.

  • Les trois règles dans INPUT peuvent être remplacées par une seule avec la correspondance ‘multiport’. Idem avec les règles pour les ports TCP dans OUTPUT.

  • La règle dans OUTPUT qui accepte le port destination 20 est inutile puisque c’est le port source des demandes de connexion de données en mode actif émises par un serveur FTP. Par contre il faut s’assurer que le module de suivi de connexion pour le protocole FTP, nommé ip_conntrack_ftp ou nf_conntrack_ftp selon la version du noyau, est chargé.

  • Les requêtes DNS peuvent aussi utiliser le port 53 en TCP et pas seulement en UDP.

  • Pour un serveur, j’autoriserais le ping (ICMP echo-request) en entrée et en sortie, éventuellement avec des limites de taille (correspondance ‘length’) et de fréquence (correspondance ‘limit’). Ça peut toujours servir pour tester la connectivité.

  • J’éviterais de bloquer le port IDENT (TCP 113) en entrée avec DROP, ça peut provoquer des délais lors de connexions sortantes à des serveurs SMTP ou autres. Au pire tu peux le rejeter “proprement” avec ‘REJECT --reject-with tcp-reset’.

  • Si la machine se synchronise sur un serveur de temps NTP, il faut autoriser le port 123 en UDP en sortie.

IOP,

Pour le point 1 : Heuuu ha bon, t’es sur?
Mais si on les charge pas, ca equivaudrais pas un un DROP?

Pour le point 2 : OKI, mais bon vu que j’ai tres peu de regle je peut me permetre d’en ecrire 3 ligne :stuck_out_tongue:

Pour le point 3 : Hummm, OKi, donc je la suprime et noralement ca marchera le ftp grace a :
iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Pour le point 4 : Ce n’est pas un sreveur DNS… pas de transfert de zone, et je pense pas que mes requete depasse les 512 octets :stuck_out_tongue:

Pour le point 5 : :open_mouth: pas de ping

Pour le point 6 : hummmm faut que je regarde ca…

Pour le point 7 : Pas de synchro avec ntp

Alors qu’est ce qu’ils en disent…?

Plutôt, oui. :slightly_smiling:
Si tu ne me crois pas tu n’as qu’à lancer ton script et constater par toi-même que rien ne passe à cause des politiques DROP dans les chaînes des tables ‘nat’ et ‘mangle’.

Non, au contraire ça équivaut à ACCEPT. Sinon rien ne passerait par défaut lorsqu’aucune table n’est chargée.

Cette suggestion est évidemment totalement facultative.

[quote]Pour le point 3 : Hummm, OKi, donc je la suprime et noralement ca marchera le ftp grace a :
iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT[/quote]
Et aussi grâce à

à condition que le module de conntrack FTP soit chargé. A propos, je n’ai pas relevé les quelques fautes de frappe (T manquant dans OUTPUT).

On ne sait jamais, une requête pour un enregistrement MX qui provoque une réponse longue comme le bras… Et puis ça ne gêne pas.

C’est toi qui vois. L’essentiel est que tu définisses ta politique de filtrage en toute connaissance de cause. En fait on ne devrait jamais soumettre un jeu de règles pour avis sans indiquer en même temps quelle politique de filtrage on souhaite appliquer.

IOP,
OKI en gros ca donerai a peu pres ca:…?

[code]# On fait le menage
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

On rejete tout par defaut

iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
ACCEPT -t mangle -P POSTROUTING ACCEPT

On accepte tout sur l’interface loopback

iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -i lo -j ACCEPT

On accepte les packets d’une connexion deja etablie

iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

On rejete les packets invalide

iptables -t filter -A INPUT -m state --state INVALID -j DROP
iptables -t filter -A OUTPUT -m state --state INVALID -j DROP

Connexions autorisees en entre

iptables -t filter -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT

Connexions autorisees en sortie

iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -i eth0 -p udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -i eth0 -p tcp --dport 443 -j ACCEPT[/code]

Ça me paraît pas mal.

Un firewall dans une DMZ ke j’ai fais pour montaf

################Done By R.KEBAB FLUSH & DEFAULT RULEZ #######################

iptables -F
iptables -t nat -F
iptables -X

iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP

Log de ce ki ce passe en DROP

iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix '[DROP] : '
iptables -A LOG_DROP -j DROP

log du traffic ki passe en ACCEPT

iptables -N LOG_ACCEPT
iptables -A LOG_ACCEPT -j LOG --log-prefix '[ACCEPT] : '
iptables -A LOG_ACCEPT -j ACCEPT

Open Full pour le FW localement

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Log de ce ki ce passe en DROP

iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix '[DROP] : '
iptables -A LOG_DROP -j DROP

log du traffic ki passe en ACCEPT

iptables -N LOG_ACCEPT
iptables -A LOG_ACCEPT -j LOG --log-prefix '[ACCEPT] : '
iptables -A LOG_ACCEPT -j ACCEPT

On maintient la Connexion si autorisation

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

##################################### INPUT #######################################

Autorise le ssh venant du LAN

iptables -A INPUT -i eth0 -p tcp --destination-port 22 -m state --state NEW -j LOG_ACCEPT

Autorise en Input le WEB sur le port 80

iptables -A INPUT -i eth0 -p tcp --destination-port 80 -m state --state NEW -j ACCEPT

Autorise en Input le HTTPS sur le port 443

iptables -A INPUT -i eth0 -p tcp --destination-port 443 -m state --state NEW -j ACCEPT

############## Drop Les Mechants ##########################################

iptables -A FORWARD -j LOG_DROP
iptables -A INPUT -j LOG_DROP
iptables -A OUTPUT -j LOG_DROP

Voili Voila

Ouups j’ai mis deux fois les traces logs aprés “# Open Full pour le FW localement”.
Sorry :unamused: