Назад | Перейти на главную страницу

Возможность добавления правил в брандмауэр только при наличии службы

Хотя я пытаюсь описать мой сервер в Ansible, мне очень нравится идея сформировать правила брандмауэра, чтобы включить только порты / протоколы, которые используются в группах хост / хост.

Представьте, что у меня есть брандмауэр на базе Linux, а за ним - веб-сервер, сервер mysql и ящик openvpn. Когда я настраиваю веб-сервер, я применяю к нему некоторые роли (http / https, ntp и т.д.), и я хотел бы добавить требуемые порты / протоколы в определение iptables окна брандмауэра. И если позже я отключу ntp, я бы хотел отключить связанные с ntp строки в iptables для этого поля.

Идея состоит в том, чтобы настроить брандмауэр, подключенный к включенным службам на ящиках за брандмауэром.

Итак, вопрос: можно ли сделать это красиво и элегантно?

Я почти всегда создаю свои собственные роли для развертывания служб и обычно помещаю правила брандмауэра для этих служб непосредственно в роль.

Вот пример для nginx:

В roles/nginx/tasks/firewall.yml:

- name: Open ports with system-config-securitylevel
  command: "lokkit -q -p {{item}}:tcp"
  with_items: "{{nginx_firewall_open_services}}"
  when: ansible_os_family == 'RedHat' and ansible_distribution_major_version|int == 5
  tags: firewall

- name: Open ports with system-config-firewall
  command: "lokkit -s {{item}}"
  with_items: "{{nginx_firewall_open_services}}"
  when: ansible_os_family == 'RedHat' and ansible_distribution_major_version|int == 6
  tags: firewall

- name: Open ports with firewalld
  firewalld: "service={{item}} permanent=true immediate=true state=enabled"
  with_items: "{{nginx_firewall_open_services}}"
  when: ansible_os_family == 'RedHat' and ansible_distribution_major_version|int >= 7
  tags: firewall

В roles/nginx/defaults/main.yml:

nginx_firewall_open_ports: [80, 443]
nginx_firewall_open_services: ["http", "https"]

Ты можешь использовать в when заявление. Определите переменную, которая указывает, должна ли служба быть включена или нет, позже проверьте эту переменную в задаче.

Пример:

vars:
  enable_ntpd: yes
tasks:
- name: enable ntpd service
  service:
    name: ntpd
    enabled: yes
    state: started
  when: enable_ntpd
- name: disable ntpd service
  service:
    name: ntpd
    enabled: no
    state: stopped
  when: not enable_ntpd
- name: enable firewall for ntpd
  iptables:
    chain: INPUT
    protocol: udp
    destination_port: 123
    jump: ACCEPT
  when: enable_ntpd
- name: disable firewall for ntpd
  iptables:
    chain: INPUT
    protocol: udp
    destination_port: 123
    jump: DROP
  when: not enable_ntpd

Примечание: я не очень хорошо знаком с модулем ansibles iptables, это может быть не лучший способ, но вы должны понять