Bonnes règles de démarrage iptables pour un serveur web?


12

J'installe un nouveau serveur centos 5.4 et je voudrais avoir un ensemble de règles propres pour le démarrage de iptables mu.

Quelles seraient les bonnes règles pour commencer?

Est-ce un bon point de départ:

# Allow outgoing traffic and disallow any passthroughs

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow traffic already established to continue

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

# Allow ssh, ftp and web services

iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT

# Allow local loopback services

iptables -A INPUT -i lo -j ACCEPT

# Allow pings

iptables -I INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -I INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -I INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

Pour quelle est cette règle:

iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT

MISE À JOUR :

Ce sera un serveur web avec FTP (requis), apache, SSH, mysql.


J'utilise cette règle simple .... Fermez tout et travaillez à l'envers et ouvrez ce qui est nécessaire. Pour un serveur Web, le port 80/443 sont généralement les seuls services accessibles au public. Bloquez tout le reste ou limitez l'accès - par exemple, limitez ssh aux adresses IP spécifiées ou au réseau privé.
jeffatrackaid

Réponses:


13

Vos règles IPTables semblent être principalement appropriées pour votre serveur. Mais je suggérerais quelques changements possibles:

  • À moins que vous ne deviez autoriser l'accès SSH, MySQL et FTP à partir d'Internet entier, il serait beaucoup plus sûr d'utiliser l'option '--source' pour restreindre l'accès à ces ports à partir de certaines adresses IP approuvées uniquement. Par exemple, pour autoriser uniquement l'accès SSH à partir de l'adresse IP 71.82.93.101, vous devez modifier la 5ème règle en 'iptables -A INPUT -p tcp --dport ssh --source 71.82.93.101 -i eth0 -j ACCEPT'. Vous devrez probablement ajouter une règle distincte pour chaque adresse IP individuelle que vous souhaitez autoriser, consultez cette question pour plus d'informations à ce sujet: iptables plusieurs sources IP .

  • Sauf si cette machine exécute un serveur DNS, vous voudrez probablement bloquer l'accès au port «domaine» (53). Pour ce faire, supprimez simplement la ligne 'iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT'. (Cela devrait également répondre à votre dernière question, BTW.) Si vous utilisez un serveur DNS, laissez cette règle en place.

  • Si vous devez autoriser l'accès client à distance MySQL sur le réseau, vous devrez ajouter la ligne 'iptables -A INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT' pour ouvrir l'accès externe au port MySQL standard . Mais ne faites pas cela sauf si c'est vraiment nécessaire - si vous n'avez besoin que d'un accès MySQL local (pour une application PHP fonctionnant sous Apache, par exemple), vous n'avez pas besoin de fournir un accès MySQL distant. Et à moins que vous ne vouliez risquer d'être piraté, si vous ouvrez le port 3306 au réseau, assurez-vous que vous avez besoin de mots de passe forts pour tous les comptes d'utilisateurs MySQL et que vos packages de serveur MySQL sont à jour.

  • L'un de vos commentaires («Autoriser les services ssh, dns, ldap, ftp et web») mentionne les services LDAP, mais il n'y a pas une telle règle dans votre configuration. Cela m'arrive beaucoup lorsque je copie un exemple de configuration et le modifie. Cela n'affectera pas la fonction, mais je corrigerais le commentaire, car les commentaires trompeurs peuvent causer indirectement en vous confondant, vous ou un autre administrateur, à l'avenir.

D'après mon expérience, il est difficile de trouver un ensemble parfait de règles IPTables, mais je pense que vous êtes définitivement sur la bonne voie. En outre, bonne chance pour en savoir plus sur IPTables - ces règles peuvent sembler complexes au début, mais c'est une compétence très utile pour tout administrateur système Linux.


1
Au lieu d'autoriser l'accès à distance à MySQL via le pare-feu, vous pouvez simplement vous assurer que tous ceux qui ont besoin d'accéder au serveur MySQL ont le droit de transférer le port SSH.
ptman

Les transferts de port SSH sont une alternative potentielle à l'ouverture du port et au verrouillage des autorisations MySQL. Mais à moins qu'il ne traite des données sensibles et / ou qu'il ne soit une cible de haut niveau (ce qui rendrait les fonctionnalités de cryptage de SSH utiles), je ne vois pas l'avantage. Après tout, la tunnellisation SSH a ses propres inconvénients, notamment: les problèmes de configuration / configuration; augmentation de l'utilisation du processeur et limitation de la bande passante (en raison de la taille du tampon statique d'OpenSSH). Et que faire s'il ne veut pas que tous ses clients MySQL distants aient des connexions locales?
Ryan B.Lynch

En ce qui concerne les commentaires ne correspondant pas aux règles, les règles ICMP autorisent les traceroutes, la découverte PMTU et d'autres messages utiles, mais ils n'autorisent pas les pings (echo-request et echo-reply).
Gerald Combs

Gerald, c'est une bonne prise, je ne l'ai même pas remarqué. Il devrait probablement soit modifier le commentaire pour noter que le ping n'est PAS autorisé, soit ajouter des règles autorisant le trafic de demande / réponse d'écho ICMP.
Ryan B.Lynch

4

Essayez également de restreindre votre trafic sortant.

J'ai vu de nombreux cas où des exploits PHP conduisent quelqu'un à utiliser 'curl' ou 'wget' pour récupérer du code malveillant ailleurs, puis l'exécuter sur votre serveur pour se joindre à un botnet.

Si vous ne vous attendez pas à ce qu'Apache (par exemple) ait besoin de parler à d'autres sites Web lui-même, limitez le trafic et épargnez-vous un peu de douleur en fin de compte!


2

Ces règles sont prêtes à être importées via "iptables-restore":

*filter
:INPUT DROP [20:2036]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [93:16260]
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -m comment --comment "allow ICMP: echo-reply"
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "allow ICMP: echo-request"
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -m comment --comment "allow ICMP: destination-unreachable"
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -m comment --comment "allow ICMP: source-quench"
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT  -m comment --comment "allow ICMP: time-exceeded"
-A INPUT -i lo -j ACCEPT -m comment --comment "allow input from the loop-back adapter"
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -m comment --comment "allow SSH: ssh"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m udp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p udp -m udp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p udp -m udp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT -m comment --comment "allow MariaDB/MySQL: mysql"
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "allow HTTP (apache/nxing/lighttpd)"
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "allow HTTPS (apache/nxing/lighttpd)"
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -m comment --comment "allow already established connections"
COMMIT

Et juste pour mémoire ... ces politiques par défaut devraient également être définies, SI l'iptables-restore ci-dessus n'est pas utilisé:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

J'ai modifié votre message - StackOverflow est un format de question / réponse. Veuillez lire la FAQ: stackoverflow.com/faq
89c3b1b8-b1ae-11e6-b842-48d705

Cela entraînera des problèmes de performances, car la règle avec état apparaît en dernier ici, et devrait apparaître en premier car elle correspond à la grande majorité des paquets.
Michael Hampton

0

Pourquoi autorisez-vous ftp et dns? Votre serveur fournit-il ces services? Le FTP ne devrait pas vraiment être utilisé, sauf pour certains cas d'utilisation très spécifiques, utilisez plutôt SFTP (pas FTPS). Aussi, pourquoi spécifier tous les autres ports par des noms symboliques et http par un 80 numérique? Vous venez de copier cela ailleurs? Aucune copie et aucun conseil ne compenseront le manque de compréhension. Assurez-vous de bien comprendre TCP, IP, les pare-feu et les protocoles des services que vous allez fournir.


Je ne veux pas offenser, ptman, mais je pense que votre réponse pourrait être considérée comme quelque peu discourtoise et condescendante. De plus, vous ne répondez pas vraiment à la question. Si le demandeur manque de compréhension, ne pensez-vous pas qu'il vaudrait mieux parler respectueusement et lui donner une formation spécifique sur le sujet?
Ryan B.Lynch

Vous avez probablement raison. Mes commentaires peuvent sembler négatifs, mais n'étaient pas destinés à cela. J'essayais d'énumérer des questions qui déclencheraient des processus de réflexion pertinents. Et comme je ne connais pas le niveau de compréhension de base, je n'ai pas commencé à écrire un manuel. Mais vous avez absolument raison sur le ton inutile. Heureusement, vous avez écrit une réponse beaucoup plus utile.
ptman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.