Zarządzanie Iptables z ansible w ogromnym środowisku

20

Jaki jest najlepszy sposób zarządzania iptables z jednego miejsca i możliwość edycji czegoś na lokalnym serwerze.

Musimy dodać niektóre reguły scentralizowane na wszystkich serwerach, ale mamy określone serwery o określonych wymaganiach, które powinny mieć własny zestaw reguł.

Myślałem o skrypcie bash z wieloma włączeniami, który jest zarządzany scentralizowany za pomocą ansible i obejmuje zarządzanie na lokalnym serwerze. Czy to dobre podejście? A może jest coś lepszego?

Nie możemy tworzyć szablonów yml2 dla ansible, ponieważ istnieje zbyt duża różnica między konkretnymi hostami.

Podaj przykłady scentralizowanego zarządzania iptables.

Navern
źródło

Odpowiedzi:

24

ufw

Ansiblema ufwmoduł do obsługi reguł zapory. W roles/common/tasks/main.yml, który jest zawarty na wszystkich moich serwerach, mam (między innymi):

- 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

Edycja : Należy zezwolić ssh przed ustawieniem domyślnej zasady na „odmawianie” (pierwotnie było odwrotnie powyżej), w przeciwnym razie możesz zostać zablokowany pomiędzy dwoma krokami.

Następnie w każdej roli mam dodatkowe reguły zapory dla tej roli. Na przykład, roles/nginx/tasks/main.ymlmam (między innymi) to:

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

Więc wszystkie moje serwery nginx mają otwarte porty 80 i 443.

W ten sposób możesz zbudować dowolną wspólną konfigurację i dodać dodatkowe reguły w bardziej szczegółowych rolach.

ferm

Jeśli masz zasady, których ufwnie możesz sobie poradzić, jedno rozwiązanie, które moim zdaniem dobrze by działało, to ferm; Można to zrobić niemal wszystko, i można go skonfigurować, aby przeczytać zasady z katalogów takich jak /etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/, itd. Można zrobić swoją commonrolę przygotować podstawową fermkonfigurację, a następnie mają inne role upuścić pliki w tych katalogach.

proste iptables

Twoje wymaganie, aby ansibleokreślić reguły oprócz reguł określonych w inny sposób, jest niezwykłe i najwyraźniej przeczy większości punktów za używanie ansible. Niestety nie widzę innego sposobu niż zwykły iptables, co byłoby dość brzydkie. Oto przykład otwarcia portu 80 w roles/nginx/tasks/main.yml(niesprawdzony):

- 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

gdzie Save iptablesjest program obsługi, który wykonuje iptables-save. Wszystko powyższe jest dość żmudne w pisaniu, ale może być odpowiednie, szczególnie jeśli masz tylko kilka reguł do zarządzania ansible.

Antonis Christofides
źródło
Jeśli dobrze pamiętam przy takim podejściu, nie mogę użyć ipset i stworzyć czegoś bardzo konkretnego. Używamy właściciela modułu w iptables. Na przykład mamy iptables -m właściciel --uid 0 -j AKCEPTUJĘ. Nie mogę używać tego modułu z ufw w ansible i nie mogę edytować czegoś bez ansible na lokalnym serwerze.
Navern
Rzeczywiście, ufwnajwyraźniej nie może zaspokoić twoich potrzeb; ale co masz na myśli mówiąc, że „nie możesz edytować czegoś bez odpowiedzi na lokalnym serwerze”?
Antonis Christofides
Czy jest inne rozwiązanie? Utknąłem z tą sprawą, trudną do rozwiązania. Ogólnie mam na myśli, że muszę dodawać NOWE reguły z ansible, bez zerwania z istniejącą. Nie przechowuj całej konfiguracji na serwerze z ansible. Angielski nie jest moim ojczystym językiem, więc mam nadzieję, że wyraziłem się jasno :)
Navern
Zaktualizowałem moją odpowiedź o kilka alternatyw.
Antonis Christofides
Dziękuję bardzo, przyjrzę się temu, szczególnie fermowi.
Navern,
12

lineinfile

Jeśli chcesz zarządzać regułami w konfiguracji iptables bez nadpisywania istniejących reguł lub centralnego zarządzania iptables w szablonie, skorzystaj z modułu infiltracji linii 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

Oto procedura obsługi „restart iptables”:

- name: restart iptables
  service: name=iptables state=restarted
Philip Wilson
źródło
2

Utworzyłem rolę do zarządzania regułami iptables z następującymi funkcjami:

  • Obsługuje praktycznie wszystkie reguły iptables
  • Zezwalaj na szczegółowe dodawanie / zastępowanie reguł dla określonych hostów
  • Łatwo wstrzykuj zmienne do reguł
  • Zezwalaj na porządkowanie reguł
  • Prostota
  • Trwałość (przeładuj reguły przy rozruchu)

Sprawdź mikegleasonjr.firewall w ansible galaxy lub na github

Mike Gleason jr Couturier
źródło
0

Napisaliśmy specjalny moduł dla tego iptables_raw, który pozwala nam łatwo zarządzać iptables. Wszystko zostało wyjaśnione w tym poście na blogu . Oto przykład korzystania z modułu:

# 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
źródło
rozwiązaliśmy ten problem za pomocą tego skryptu: github.com/SmilingNavern/iptables .
Navern
Ale obecnie nie ma odpowiedniej dokumentacji. Mogę wyjaśnić, jak to działa, i opublikować jako odpowiedź później.
Navern