Gestión de iptables con ansible en un entorno inmenso

20

¿Cuál es la mejor manera de administrar iptables desde un punto y tener la capacidad de editar algo en el servidor local?

Necesitamos agregar algunas reglas centralizadas en todos los servidores, pero tenemos servidores específicos con requisitos específicos que deberían tener su propio conjunto de reglas.

Pensé en el script bash con inclusión múltiple que se administra centralizado con ansible e incluye administrado en el servidor local. ¿Es un buen enfoque? O tal vez hay algo mejor?

No podemos crear plantillas yml2 para ansible porque hay demasiada diferencia entre hosts específicos.

Proporcione ejemplos de gestión centralizada de iptables.

Navern
fuente

Respuestas:

24

ufw

Ansibletiene un ufwmódulo para manejar las reglas del firewall. En roles/common/tasks/main.yml, que está incluido en todos mis servidores, tengo (entre otras cosas):

- 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

Editar : es necesario permitir ssh antes de configurar la política predeterminada para "denegar" (originalmente era lo opuesto más arriba), de lo contrario, puede quedar bloqueado entre los dos pasos.

Luego, en cada rol, tengo reglas de firewall adicionales para ese rol. Por ejemplo, en roles/nginx/tasks/main.yml, tengo (entre otras cosas) esto:

- name: Allow nginx firewall
  ufw: proto=tcp port=80 rule=allow
- name: Allow nginx ssl firewall
  ufw: proto=tcp port=443 rule=allow

Entonces, todos mis servidores nginx tienen los puertos 80 y 443 abiertos.

De esta forma, puede crear la configuración común que desee y agregar reglas adicionales en roles más específicos.

ferm

Si tiene reglas que ufwno pueden manejar, una solución que creo que funcionaría bien es ferm; que puede hacer casi cualquier cosa, y se puede configurar para leer las reglas de directorios como /etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/, etc Usted puede hacer su commonfunción esencial preparar la fermconfiguración y luego tener otros papeles caen archivos en estos directorios.

iptables simples

Su requisito de tener ansiblereglas específicas además de las reglas especificadas de otra forma es inusual y aparentemente desafía la mayor parte del uso ansible. Desafortunadamente, no veo otra manera de hacerlo que no sea con plain iptables, lo que sería bastante feo. Aquí hay un ejemplo de apertura del puerto 80 en roles/nginx/tasks/main.yml(no probado):

- 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

donde Save iptableshay un controlador que se ejecuta iptables-save. Todo lo anterior es bastante tedioso de escribir, pero puede ser apropiado, especialmente si solo tiene unas pocas reglas para manejar ansible.

Antonis Christofides
fuente
Si recuerdo correctamente con este enfoque, no puedo usar ipset y crear algo muy específico. Estamos utilizando el propietario del módulo en iptables. Por ejemplo, tenemos iptables -m propietario --uid 0 -j ACEPTAR. No puedo usar este módulo con ufw en ansible y no puedo editar algo sin ansible en el servidor local.
Navern
De hecho, ufwaparentemente no puede manejar sus necesidades; pero, ¿qué quieres decir cuando dices que "no puedes editar algo sin ansible en el servidor local"?
Antonis Christofides
¿Hay otra solución? Me quedé con este caso, difícil de resolver. En general, quiero decir que solo necesito agregar NUEVAS reglas con ansible sin romper una existente. No almacene toda la configuración en el servidor con ansible. El inglés no es mi lengua materna, así que espero haberme aclarado :)
Navern
Actualicé mi respuesta con algunas alternativas.
Antonis Christofides
Muchas gracias, voy a investigar esto, especialmente ferm.
Navern
12

archivo de línea

Si desea administrar reglas en su configuración de iptables sin sobrescribir las reglas existentes o administrar centralmente iptables en una plantilla, use el módulo lineinfile de 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

Aquí está el controlador "reiniciar iptables":

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

Creé un rol para administrar las reglas de iptables con las siguientes características:

  • Admite prácticamente todas las reglas de iptables
  • Permitir la adición / anulación de reglas granulares para hosts específicos
  • Inyecte fácilmente variables en las reglas
  • Permitir ordenar reglas
  • Sencillez
  • Persistencia (recargue las reglas en el arranque)

Echa un vistazo a mikegleasonjr.firewall en galaxia ansible o en github

Mike Gleason jr Couturier
fuente
0

Escribimos un módulo especial para esto llamado iptables_raw que nos permite administrar fácilmente iptables. Todo se explica en esta publicación de blog . Aquí hay un ejemplo de cómo usar el módulo:

# 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
fuente
Hemos resuelto este problema con este script: github.com/SmilingNavern/iptables .
Navern
Pero actualmente no hay documentación adecuada. Puedo explicar cómo funciona y publicar como respuesta más tarde.
Navern