Quelle est la meilleure façon de gérer iptables à partir d'un point et d'avoir la possibilité de modifier quelque chose sur le serveur local.
Nous devons ajouter des règles centralisées sur tous les serveurs, mais nous avons des serveurs spécifiques avec des exigences spécifiques qui devraient avoir leur propre ensemble de règles.
J'ai pensé au script bash avec plusieurs inclusions qui est géré de manière centralisée avec ansible et qui est géré sur le serveur local. Est-ce une bonne approche? Ou peut-être qu'il y a quelque chose de mieux?
Nous ne pouvons pas créer de modèles yml2 pour ansible car il y a trop de différence entre des hôtes spécifiques.
Veuillez fournir des exemples de gestion centralisée d'iptables.
Ansible
a un module ufw
pour gérer les règles de pare-feu. Dans roles/common/tasks/main.yml
, qui est inclus dans tous mes serveurs, j'ai (entre autres):
- name: Install ufw
apt: name=ufw
- name: Allow ssh through firewall
ufw: proto=tcp port=22 rule=allow
- name: Set ufw policy
ufw: state=enabled direction=incoming policy=deny
Edit : Il est nécessaire d'autoriser ssh avant de définir la stratégie par défaut sur "deny" (à l'origine c'était ci-dessus ci-dessus), sinon vous pourriez être verrouillé entre les deux les deux étapes.
Ensuite, dans chaque rôle, j'ai des règles de pare-feu supplémentaires pour ce rôle. Par exemple, dans roles/nginx/tasks/main.yml
, J'ai (entre autres) ceci:
- name: Allow nginx firewall
ufw: proto=tcp port=80 rule=allow
- name: Allow nginx ssl firewall
ufw: proto=tcp port=443 rule=allow
Donc, tous mes serveurs nginx ont les ports 80 et 443 ouverts.
De cette façon, vous pouvez créer la configuration commune de votre choix et ajouter des règles supplémentaires dans des rôles plus spécifiques.
Si vous avez des règles que ufw
ne peut pas gérer, je pense qu'une solution qui fonctionnerait bien est ferm
; il peut faire presque n'importe quoi, et vous pouvez le configurer pour lire les règles des répertoires tels que /etc/ferm/input.d/
, /etc/ferm/output.d/
, /etc/ferm/forward.d/
, etc. Vous pouvez faire en sorte que votre rôle common
prépare la configuration essentielle ferm
et que d'autres rôles déposent des fichiers dans ces répertoires.
Votre exigence d'avoir ansible
spécifier des règles en plus des règles spécifiées d'une autre manière est inhabituelle et défie apparemment la plupart du point d'utiliser ansible
. Malheureusement, je ne vois aucun moyen de le faire autrement qu'avec plain iptables
, ce qui serait assez moche. Voici un exemple d'ouverture du port 80 dans roles/nginx/tasks/main.yml
(non testé):
- name: Check if port 80 is allowed
Shell: iptables -L | grep -q "Allow http" && echo -n yes || echo -n no
register: check_allow_http
changed_when: no
always_run: yes
- name: Allow port 80
command: >
iptables -A INPUT -p tcp -m tcp --dport 80
-m comment --comment "Allow http" -j ACCEPT
when: check_allow_http.stdout == "no"
notify:
- Save iptables
où Save iptables
est un gestionnaire qui exécute iptables-save
. Tout ce qui précède est assez fastidieux à écrire, mais cela peut être approprié, surtout si vous n'avez que quelques règles à gérer avec ansible
.
Si vous souhaitez gérer les règles dans votre configuration iptables sans écraser les règles existantes ou gérer de manière centralisée iptables dans un modèle, utilisez le module lineinfile d'Ansible:
- name: ensure iptables allows established and related traffic
lineinfile:
dest=/etc/sysconfig/iptables
state=present
regexp="^.*INPUT.*ESTABLISHED,RELATED.*ACCEPT"
insertafter="^:OUTPUT " line="-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT"
backup=yes
notify: restart iptables
- name: ensure iptables is configured to allow ssh traffic (port 22/tcp)
lineinfile:
dest=/etc/sysconfig/iptables
state=present
regexp="^.*INPUT.*tcp.*22.*ACCEPT"
insertafter="^.*INPUT.*ESTABLISHED,RELATED.*ACCEPT" line="-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT"
backup=yes
notify: restart iptables
Voici le gestionnaire de "redémarrage d'iptables":
- name: restart iptables
service: name=iptables state=restarted
J'ai créé un rôle pour gérer les règles iptables avec les fonctionnalités suivantes:
Découvrez mikegleasonjr.firewall sur galaxie ansible ou sur github
Nous avons écrit un module spécial pour cela appelé iptables_raw qui nous permet de gérer facilement iptables. Tout est expliqué dans ce article de blog . Voici un exemple d'utilisation du module:
# Allow all IPv4 traffic coming in on port 80
- iptables_raw:
name=allow_tcp_80
rules='-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT'
# Delete the above rule
- iptables_raw:
name=allow_tcp_80
state=absent