Управление Iptables с ansible в огромной среде

20

Каков наилучший способ управлять iptables из одной точки и иметь возможность редактировать что-то на локальном сервере.

Нам нужно добавить некоторые правила, централизованные на всех серверах, но у нас есть конкретные серверы с особыми требованиями, которые должны иметь свой собственный набор правил.

Я подумал о bash-скрипте с несколькими включениями, который управляется централизованно с ansible и включает управление на локальном сервере. Это хороший подход? Или, может быть, есть что-то лучше?

Мы не можем создавать шаблоны yml2 для ansible, потому что между конкретными хостами слишком большая разница.

Пожалуйста, приведите примеры централизованного управления iptables.

Navern
источник

Ответы:

24

UFW

Ansibleимеет ufwмодуль для обработки правил брандмауэра. В roles/common/tasks/main.yml, который входит во все мои серверы, у меня есть (среди прочего):

- 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

Редактировать : необходимо разрешить ssh перед установкой политики по умолчанию «deny» (изначально это было наоборот), в противном случае вы можете быть заблокированы между двумя шагами.

Затем в каждой роли у меня есть дополнительные правила брандмауэра для этой роли. Например, у roles/nginx/tasks/main.ymlменя есть (среди прочего) это:

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

Так что на всех моих серверах nginx открыты порты 80 и 443.

Таким образом, вы можете создать любую обычную конфигурацию и добавить дополнительные правила в более конкретные роли.

FERM

Если у вас есть правила, которые ufwне могут быть обработаны, я думаю, что одно решение будет работать хорошо ferm; он может делать почти все, и вы можете настроить его для чтения правил из каталогов , такие как /etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/и т.д. Вы можете сделать вашу commonроль подготовить необходимую fermконфигурацию и затем другие роли перетаскивать файлы в этих каталогах.

простые iptables

Ваше требование иметь ansibleопределенные правила в дополнение к правилам, указанным другим способом, является необычным и, по-видимому, не поддается большинству пунктов использования ansible. К сожалению, я не вижу никакого способа сделать это, кроме как с обычным iptables, что было бы довольно некрасиво. Вот пример открытия порта 80 roles/nginx/tasks/main.yml(непроверенный):

- 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 iptablesобработчик, который выполняет iptables-save. Все вышеперечисленное довольно утомительно писать, но это может быть уместно, особенно если у вас есть только несколько правил для управления ansible.

Антонис Христофидес
источник
Если я правильно помню с этим подходом, я не могу использовать ipset и создать что-то очень конкретное. Мы используем владельца модуля в iptables. Например, у нас есть владелец iptables -m --uid 0 -j ПРИНЯТЬ. Я не могу использовать этот модуль с UFW в ansible и не могу редактировать что-то без ansible на локальном сервере.
Наверн
Действительно, по- ufwвидимому, не может удовлетворить ваши потребности; но что вы имеете в виду, когда говорите, что «не можете редактировать что-либо без ansible на локальном сервере»?
Антонис Христофидес
Есть ли другое решение? Я застрял с этим делом, трудно решить. В общем, я имею в виду, что мне нужно только добавить НОВЫЕ правила с ansible, не нарушая существующие. Не храните всю конфигурацию на сервере с ansible. Английский не мой родной язык, поэтому я надеюсь, что прояснился :)
Navern
Обновил мой ответ с некоторыми альтернативами.
Антонис Христофидес
Спасибо, veru большое, я посмотрю на это, особенно Ferm.
Наверн
12

lineinfile

Если вы хотите управлять правилами в вашей конфигурации iptables без перезаписи существующих правил или централизованного управления iptables в шаблоне, используйте модуль linesfile от 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

Вот обработчик перезапуска iptables:

- name: restart iptables
  service: name=iptables state=restarted
Филип Уилсон
источник
2

Я создал роль для управления правилами iptables со следующими функциями:

  • Поддержка практически всех правил iptables
  • Разрешить детальное добавление / переопределение правил для определенных хостов
  • Легко вводить переменные в правила
  • Разрешить правила заказа
  • Простота
  • Постоянство (перезагрузите правила при загрузке)

Проверьте mikegleasonjr.firewall на галактике ansible или на github

Майк Глисон младший кутюрье
источник
0

Для этого мы написали специальный модуль под названием iptables_raw, который позволяет нам легко управлять iptables. Все объясняется в этом блоге . Вот пример того, как использовать модуль:

# 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
Страхиня Кустудич
источник
мы решили эту проблему с помощью этого скрипта: github.com/SmilingNavern/iptables .
Наверн
Но в настоящее время нет надлежащей документации. Я могу объяснить, как это работает, и опубликовать ответ позже.
Наверн