Gestion des Iptables avec ansible dans un environnement énorme

20

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 y a-t-il 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.

Navern
la source

Réponses:

24

ufw

Ansiblepossède un ufwmodule 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

Modifier : Il est nécessaire d'autoriser ssh avant de définir la stratégie par défaut sur "refuser" (à l'origine, c'était ci-dessus), sinon vous risquez d'être verrouillé entre 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.

ferm

Si vous avez des règles qui ufwne peuvent pas être gérées, je pense qu'une solution qui fonctionnerait bien est ferm; il peut presque tout faire, et vous pouvez le configurer pour lire les règles de répertoires tels que /etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/, etc. Vous pouvez rendre votre commonrôle essentiel de préparer la fermconfiguration et avoir d' autres rôles fichiers dans ces répertoires laissent tomber.

iptables simples

Votre exigence d'avoir des ansiblerègles spécifiées en plus des règles spécifiées d'une autre manière est inhabituelle et défie apparemment la plupart du point d'utilisation ansible. Malheureusement, je ne vois aucun moyen de le faire autrement qu'avec de la plaine 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

Save iptablesest un gestionnaire qui s'exécute iptables-save. Tout ce qui précède est assez fastidieux à écrire, mais cela pourrait être approprié, surtout si vous n'avez que quelques règles à gérer ansible.

Antonis Christofides
la source
Si je me souviens bien de cette approche, je ne peux pas utiliser l'ipset et créer quelque chose de très spécifique. Nous utilisons le propriétaire du module dans iptables. Par exemple, nous avons iptables -m owner --uid 0 -j ACCEPT. Je ne peux pas utiliser ce module avec ufw dans ansible et ne peux pas éditer quelque chose sans ansible sur le serveur local.
Navern
En effet, ufwne peut apparemment pas répondre à vos besoins; mais que voulez-vous dire lorsque vous dites que vous "ne pouvez pas modifier quelque chose sans ansible sur le serveur local"?
Antonis Christofides
Y a-t-il une autre solution? Je suis resté avec cette affaire, difficile à résoudre. En général, je veux dire que je dois seulement ajouter de nouvelles règles avec ansible sans en casser une existante. Ne stockez pas toute la configuration sur le serveur avec ansible. L'anglais n'est pas ma langue maternelle, donc j'espère que je me suis bien fait comprendre :)
Navern
Mise à jour de ma réponse avec quelques alternatives.
Antonis Christofides
Merci beaucoup, je vais examiner cela, en particulier ferm.
Navern
12

lineinfile

Si vous souhaitez gérer des 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 "restart iptables":

- name: restart iptables
  service: name=iptables state=restarted
Philip Wilson
la source
2

J'ai créé un rôle pour gérer les règles iptables avec les fonctionnalités suivantes:

  • Prend en charge pratiquement toutes les règles iptables
  • Autoriser l'ajout / le remplacement de règles granulaires pour des hôtes spécifiques
  • Injectez facilement des variables dans les règles
  • Autoriser l'ordre des règles
  • Simplicité
  • Persistance (rechargez les règles au démarrage)

Découvrez mikegleasonjr.firewall sur ansible galaxy ou sur github

Mike Gleason jr Couturier
la source
0

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 billet 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
Strahinja Kustudic
la source
nous avons résolu ce problème avec ce script: github.com/SmilingNavern/iptables .
Navern
Mais il n'y a actuellement aucune documentation appropriée. Je peux expliquer comment cela fonctionne et poster comme réponse plus tard.
Navern