it-swarm.com.de

Iptables Management mit Ansible in einer riesigen Umgebung

Was ist der beste Weg, um iptables von einem Punkt aus zu verwalten und etwas auf dem lokalen Server zu bearbeiten?.

Wir müssen einige Regeln hinzufügen, die auf allen Servern zentralisiert sind, aber wir haben bestimmte Server mit bestimmten Anforderungen, die ihre eigenen Regeln haben sollten.

Ich dachte an ein Bash-Skript mit mehreren Includes, das zentral mit ansible verwaltet wird und auf einem lokalen Server verwaltet wird. Ist es ein guter Ansatz? Oder gibt es vielleicht etwas Besseres?

Wir können keine yml2-Vorlagen für ansible erstellen, da zwischen bestimmten Hosts zu viele Unterschiede bestehen.

Bitte geben Sie Beispiele für die zentrale Verwaltung von iptables.

20
Navern

ufw

Ansible hat ein ufw -Modul , um mit Firewall-Regeln umzugehen. In roles/common/tasks/main.yml, Das in allen meinen Servern enthalten ist, habe ich (unter anderem):

- 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

Bearbeiten : Es ist erforderlich, ssh zuzulassen, bevor die Standardrichtlinie auf "Verweigern" gesetzt wird (ursprünglich war es oben umgekehrt), da Sie sonst möglicherweise dazwischen gesperrt werden die zwei Schritte.

Dann habe ich in jeder Rolle zusätzliche Firewall-Regeln für diese Rolle. Zum Beispiel habe ich in roles/nginx/tasks/main.yml (Unter anderem) Folgendes:

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

Alle meine Nginx-Server haben also die Ports 80 und 443 geöffnet.

Auf diese Weise können Sie jede gewünschte allgemeine Konfiguration erstellen und zusätzliche Regeln in spezifischeren Rollen hinzufügen.

ferm

Wenn Sie Regeln haben, mit denen ufw nicht umgehen kann, ist eine Lösung, die meiner Meinung nach gut funktionieren würde, ferm. Es kann fast alles, und Sie können es so konfigurieren, dass Regeln aus Verzeichnissen wie /etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/ usw. gelesen werden. Sie können Ihre common Rolle Bereiten Sie die grundlegende ferm -Konfiguration vor und lassen Sie dann andere Rollen Dateien in diesen Verzeichnissen ablegen.

einfache iptables

Ihre Anforderung, dass ansible zusätzlich zu den auf andere Weise angegebenen Regeln Regeln angeben muss, ist ungewöhnlich und widerspricht anscheinend dem größten Teil der Verwendung von ansible. Leider sehe ich keine andere Möglichkeit, als mit einfachem iptables, was ziemlich hässlich wäre. Hier ist ein Beispiel für das Öffnen von Port 80 in roles/nginx/tasks/main.yml (Ungetestet):

- 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

dabei ist Save iptables ein Handler, der iptables-save ausführt. All das oben Genannte ist ziemlich mühsam zu schreiben, aber es könnte angemessen sein, insbesondere wenn Sie nur wenige Regeln haben, die Sie mit ansible verwalten müssen.

24

lineinfile

Wenn Sie Regeln in Ihrer iptables-Konfiguration verwalten möchten, ohne vorhandene Regeln zu überschreiben oder iptables in einer Vorlage zentral zu verwalten, verwenden Sie das Lineinfile-Modul von 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

Hier ist der Handler "iptables neu starten":

- name: restart iptables
  service: name=iptables state=restarted
12
Philip Wilson

Ich habe eine Rolle zum Verwalten von iptables-Regeln mit den folgenden Funktionen erstellt:

  • Unterstützt praktisch alle iptables-Regeln
  • Ermöglichen das Hinzufügen/Überschreiben granularer Regeln für bestimmte Hosts
  • Fügen Sie einfach Variablen in die Regeln ein
  • Regeln bestellen lassen
  • Einfachheit
  • Persistenz (Laden Sie die Regeln beim Booten neu)

Schauen Sie sich mikegleasonjr.firewall auf ansible galaxy oder auf github an

Wir haben dafür ein spezielles Modul namens iptables_raw geschrieben, mit dem wir iptables einfach verwalten können. Alles wird in diesem Blog-Beitrag erklärt. Hier ist ein Beispiel für die Verwendung des Moduls:

# 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
0