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 em bash script com vários include 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.

Forneça exemplos de gerenciamento centralizado de iptables.

Respostas:


24

ufw

Ansiblepossui um ufwmódulo para lidar com regras de firewall. No 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 definir a política padrão "negue" (originalmente era o oposto acima), caso contrário, você pode ficar bloqueado entre as duas etapas.

Em cada função, tenho regras de firewall adicionais para essa função. Por exemplo, em roles/nginx/tasks/main.yml, eu 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 que desejar e adicionar regras adicionais em funções mais específicas.

ferm

Se você tem regras que ufwnão conseguem lidar, uma solução que acho que funcionaria bem é ferm; ele pode fazer quase qualquer coisa, e você pode configurá-lo para ler as regras de diretórios tais como /etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/, etc. Você poderia fazer o seu commonpapel preparar o essencial fermde configuração e depois ter outros papéis soltar arquivos nestes diretórios.

iptables simples

Seu requisito de ansibleespecificar regras além de regras especificadas de outra maneira é incomum e aparentemente desafia a maior parte do ponto de uso ansible. Infelizmente, não vejo outra maneira de fazê-lo a não ser com planície iptables, o que seria bastante feio. Aqui está um exemplo de abertura da porta 80 em roles/nginx/tasks/main.yml(não testada):

- 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

Onde Save iptablesé um manipulador que é executado iptables-save. Tudo o que foi dito acima é bastante entediante de escrever, mas pode ser apropriado, especialmente se você tiver apenas algumas regras para gerenciar ansible.


Se bem me lembro com essa abordagem, não posso usar o ipset e criar algo muito específico. Estamos usando o proprietário do módulo no iptables. Por exemplo, temos o iptables -m owner --uid 0 -j ACCEPT. Não posso usar este módulo com o ufw no ansible e não consigo editar algo sem o ansible no servidor local.
Navern

De fato, ufwaparentemente não pode lidar com suas necessidades; mas o que você quer dizer quando diz que "não pode editar algo sem o ansible no servidor local"?
Antonis Christofides

Existe outra solução? Eu fiquei com esse caso, difícil de resolver. Em geral, eu quero dizer que eu preciso adicionar apenas NOVAS regras com ansible sem quebrar uma existente. Não armazene toda a configuração no servidor com ansible. Inglês não é minha língua nativa, então eu espero que eu fiz claro :)
Navern

Atualizei minha resposta com algumas alternativas.
Antonis Christofides

Muito obrigado veru vou olhar para isso, especialmente ferm.
Navern

12

lineinfile

Se você deseja gerenciar regras na configuração do iptables sem substituir as regras existentes ou gerenciar centralmente o iptables em um modelo, 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

2

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

  • Suporte virtualmente a 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 (recarregue as regras na inicialização)

Confira mikegleasonjr.firewall na galáxia ansible ou no github


0

Nós escrevemos um módulo especial para isso chamado iptables_raw que nos permite gerenciar facilmente o iptables. Tudo é explicado nesta postagem do 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

resolvemos esse problema com este script: github.com/SmilingNavern/iptables .
Navern

Mas não há documentação adequada atualmente. Eu posso explicar como funciona e postar como resposta mais tarde.
Navern
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.