Gerenciamento de Iptables com ansible em ambiente enorme

20

Qual é a melhor maneira de gerenciar o iptables a partir de um ponto e ter a capacidade de editar algo no servidor local.

Precisamos adicionar algumas regras centralizadas em todos os servidores, mas temos servidores específicos com requisitos específicos que devem ter seu próprio conjunto de regras.

Pensei no script bash com várias inclusões, que é gerenciado centralizado com ansible e inclui gerenciado no servidor local. É uma boa abordagem? Ou talvez haja algo melhor?

Não podemos criar modelos yml2 para ansible porque há muita diferença entre hosts específicos.

Por favor, forneça exemplos de gerenciamento centralizado de iptables.

    
por Navern 14.08.2014 / 10:40

4 respostas

24

ufw

Ansible tem um % móduloufw para lidar com regras de firewall. Em roles/common/tasks/main.yml , que está incluído em todos os meus servidores, tenho (entre outras coisas):

- 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 : É necessário permitir que o ssh antes de configurar a política padrão para "negar" (originalmente era o oposto acima), caso contrário você pode ser bloqueado entre as duas etapas.

Em seguida, em cada função, tenho regras de firewall adicionais para essa função. Por exemplo, em roles/nginx/tasks/main.yml , tenho (entre outras coisas) isso:

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

Portanto, todos os meus servidores nginx têm as portas 80 e 443 abertas.

Dessa forma, você pode criar qualquer configuração comum desejada e adicionar outras regras em funções mais específicas.

ferm

Se você tem regras que o ufw não pode manipular, uma solução que eu acho que funcionaria bem é ferm ; ele pode fazer quase tudo, e você pode configurá-lo para ler regras de diretórios como /etc/ferm/input.d/ , /etc/ferm/output.d/ , /etc/ferm/forward.d/ , etc. Você poderia fazer sua função common preparar a configuração essencial ferm e depois ter outras funções soltam arquivos nesses diretórios.

simples iptables

Seu requisito de ter ansible especificar regras além das regras especificadas de outra maneira é incomum e, aparentemente, desafia a maior parte do ponto de uso de ansible . Infelizmente eu não vejo nenhuma maneira de fazer isso a não ser com iptables , o que seria bastante feio. Aqui está um exemplo de abertura da porta 80 em roles/nginx/tasks/main.yml (não testado):

- 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

em que Save iptables é um manipulador que executa iptables-save . Tudo o que foi dito acima é muito tedioso para escrever, mas pode ser apropriado, especialmente se você tiver apenas algumas regras para gerenciar com ansible .

    
por 14.08.2014 / 12:16
12

lineinfile

Se você quiser gerenciar regras em sua configuração do iptables sem sobrescrever regras existentes ou gerenciar centralmente o iptables em um template, use o módulo lineinfile do 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

Aqui está o manipulador "restart iptables":

- name: restart iptables
  service: name=iptables state=restarted
    
por 27.08.2014 / 18:32
2

Eu criei uma função para gerenciar regras do iptables com os seguintes recursos:

  • Suporta virtualmente todas as regras do iptables
  • Permitir adição / substituição de regras granulares para hosts específicos
  • Injete facilmente variáveis nas regras
  • Permitir ordenação de regras
  • Simplicidade
  • Persistência (recarregar as regras na inicialização)

Confira o mikegleasonjr.firewall em ansible galaxy ou em github

    
por 10.11.2015 / 13:29
0

Nós escrevemos um módulo especial para isso chamado iptables_raw que nos permite gerenciar facilmente o iptables. Tudo é explicado nesta postagem no blog . Aqui está um exemplo de como usar o 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
    
por 07.07.2016 / 10:41