J'ai essayé de mettre en place un script iptables de serveur de base qui fonctionnera pour la plupart des sites exécutant simplement un serveur Web de base en utilisant HTTP (S) et SSH (ports 80, 443 et 22). Après tout, la plupart des VPS n'ont besoin que de ces règles de ports de démarrage et peuvent ajouter des ports de messagerie ou de jeu plus tard selon les besoins.
Jusqu'à présent, j'ai le jeu de règles suivant et je me demandais si quelqu'un connaissait un meilleur script ou des améliorations qui pourraient être ajoutées.
*filter
# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allows all outbound traffic
# You can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# Allows SSH connections (only 4 attempts by an IP every 3 minutes, drop the rest)
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 4 --name DEFAULT --rsource -j DROP
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
iptables est l'une des parties les plus importantes de la sécurisation de votre box (voir aussi fail2ban) et pourtant il y a beaucoup de gens comme moi qui ont du mal à comprendre tout ce qui est nécessaire pour créer un pare-feu de base sécurisé pour nos serveurs.
Quel est le moyen le plus sûr d'ouvrir uniquement les ports de base nécessaires à un serveur Web?
Mise à jour: cyberciti.biz a un autre script iptables qui semble assez bon.
De plus, plutôt que d'utiliser Denyhosts ou fail2ban, vous pouvez utiliser iptables lui-même pour bloquer les mauvaises tentatives répétées de SSH .
modprobe
n'est pas installé (ou s'il y a une autre erreur avant d'ouvrir le port 22), vous vous verrouillerez hors du serveur.Réponses:
La façon la plus sûre de travailler avec iptables est de tout fermer et d'ouvrir uniquement ce dont vous avez besoin. Je suis un peu distrait, donc j'essaie toujours d'être aussi paresseux que possible, donc je ne fais pas d'erreurs qui peuvent conduire le serveur à ne pas être sécurisé.
J'utilise celui-ci, seulement un peu d'affectation variable doit être effectuée afin de le faire fonctionner.
Je l'utilise depuis un certain temps, et tout type de modification sera très apprécié s'il est plus facile à administrer.
la source
Cela semble assez bon, mais vous pourriez resserrer les choses un peu plus. L'indicateur -s est l'IP source ou le nom de domaine, et vous ajoutez "-s 198.23.12.32" ou quelle que soit votre adresse IP pour n'autoriser SSH qu'à partir de votre IP source. Vous pouvez également choisir une plage d'adresses IP source en utilisant la notation de style CIDR .
Vous devez être prudent lors de la journalisation des appels refusés. L'adresse IP de votre serveur sera analysée par les robots, les script kiddies, etc., et le fichier journal pourrait devenir volumineux assez rapidement. À moins que vous n'essayiez de diagnostiquer un problème spécifique qui, selon vous, pourrait être lié à quelqu'un qui tente de briser votre pare-feu, je supprimerais cette option.
Vous pouvez également lier fail2ban à iptables pour un pseudo-IDS. fail2ban analysera vos fichiers journaux et peut bloquer une adresse IP s'ils tentent de pénétrer de force dans votre système. Par exemple, si une certaine adresse IP ne parvient pas à se connecter à SSH 5 fois, vous pouvez les verrouiller pendant une journée entière. Il fonctionne également sur FTP et beaucoup d'autres (y compris les mauvais robots qui frappent Apache). Je l'utilise sur tous mes serveurs pour fournir un coussin supplémentaire contre les attaques par force brute.
la source
Jetez un œil à Shorewall. La configuration par défaut à interface unique serait un bon point de départ. Il est facile à configurer et possède des macros pour des choses comme SSH et l'accès Web. Il peut être configuré pour verrouiller le serveur au niveau souhaité lorsque le pare-feu est arrêté. Avec Shorewall-lite, vous pouvez exécuter une construction de pare-feu sur un autre serveur. La journalisation est facile à configurer au niveau souhaité.
Pour un serveur HTTP de base, vous souhaitez ouvrir l'accès entrant au port 80 et au port 443 si vous utilisez HTTPS. L'accès entrant SSH à partir de quelques adresses restreintes est généralement souhaité. Vous pouvez également verrouiller l'accès sortant. Ouvrez le pare-feu uniquement aux serveurs et services requis. NTP et DNS doivent être ouverts, ainsi qu'un canal pour récupérer les correctifs.
la source
Je dirais que c'est un assez bon pare-feu, sauf qu'il est conçu pour arrêter le trafic entrant, et non pas axé sur le trafic sortant ou sortant. Dans de nombreux cas, il est tout aussi important de se concentrer sur les connexions sortantes d'une boîte que celles entrantes. Dans le cas malheureux où la machine est réellement exploitée, il serait bien de pouvoir empêcher le téléchargement de kits racine supplémentaires, ou la connexion à des nœuds de commande et de contrôle, ou autre.
BillThor a commencé à en parler ci-dessus, mais je ne fais que répondre avec des exemples spécifiques. L'une des bonnes choses à propos d'iptables est qu'il peut se souvenir de l'état de la connexion, cela peut avoir des implications sur les performances des sites très fréquentés, mais vous pouvez modifier votre accès entrant sur http / https pour autoriser uniquement la réponse sur les connexions établies par exemple, ou limiter spécifiquement certaines zones non privilégiées utilisateurs d'avoir un accès sortant du tout. Vos règles sortantes auraient alors des clauses RELATED, ESTABLISHED qui empêcheraient toute une série d'attaques auxiliaires et ralentiraient celles qui nécessitent une étape secondaire pour exploiter réellement une boîte, ce qui est très courant.
Enfin, je dirais qu'il est préférable de définir votre politique iptables -P DROP plutôt que d'avoir un REJECT en annexe à la fin. C'est principalement une question de préférence, mais peut réduire les erreurs lors de l'ajout aux chaînes avec des règles existantes au lieu d'insérer ou de vider / réinitialiser.
la source
-A INPUT -j REJECT
pour-A INPUT -P DROP
?