Frage Iptables Management mit Ansible in riesiger Umgebung


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

Wir müssen einige Regeln auf allen Servern zentralisieren, aber wir haben spezifische Server mit spezifischen Anforderungen, die ihre eigenen Regeln haben sollten.

Ich dachte über Bash-Skript mit mehreren Include, die zentral verwaltet wird mit Ansible und umfasst verwaltet auf dem lokalen Server. Ist es ein guter Ansatz? Oder gibt es vielleicht etwas Besseres?

Wir können keine yml2-Vorlagen für ansible erstellen, da die Unterschiede zwischen bestimmten Hosts zu groß sind.

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


20
2017-08-14 08:40


Ursprung




Antworten:


ufw

Ansible hat ein ufw Modul um Firewall-Regeln zu behandeln. Im roles/common/tasks/main.yml, die 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 notwendig, ssh zuzulassen, bevor die Standardrichtlinie auf "leugnen" gesetzt wird (ursprünglich war es das Gegenteil oben), andernfalls könnten Sie zwischen den beiden Schritten ausgesperrt sein.

Dann habe ich in jeder Rolle zusätzliche Firewall-Regeln für diese Rolle. Zum Beispiel, in roles/nginx/tasks/main.ymlIch habe (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

Also haben alle meine Nginx-Server die Ports 80 und 443 geöffnet.

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

ferm

Wenn Sie Regeln haben, die ufw kann nicht umgehen, eine Lösung, die ich denke, würde gut funktionieren ferm; Es kann fast alles machen, und Sie können es konfigurieren, um Regeln aus Verzeichnissen wie /etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/usw. Du könntest deine machen common Rolle bereiten das Wesentliche vor ferm Konfiguration und dann andere Rollen Drop-Dateien in diesen Verzeichnissen.

einfache iptables

Ihre Anforderung zu haben ansible Regeln zu spezifizieren, zusätzlich zu Regeln, die auf eine andere Weise spezifiziert sind, ist ungewöhnlich und scheint den meisten Punkt für die Verwendung offensichtlich nicht zu erfüllen ansible. Leider sehe ich keinen anderen Weg, es als normal zu machen iptablesDas wäre ziemlich hässlich. 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

woher Save iptables ist ein Handler, der ausgeführt wird iptables-save. All das ist ziemlich mühsam zu schreiben, aber es könnte angebracht sein, besonders wenn Sie nur ein paar Regeln haben, mit denen Sie umgehen können ansible.


24
2017-08-14 10:16



Wenn ich mich mit diesem Ansatz richtig erinnere, kann ich ipset nicht verwenden und etwas sehr Spezifisches erstellen. Wir verwenden den Moduleigner in iptables. Zum Beispiel haben wir iptables -m Besitzer --uid 0 -j ACCEPT. Ich kann dieses Modul nicht mit ufw in ansible verwenden und kann nichts ohne ansible auf dem lokalen Server bearbeiten. - Navern
Tatsächlich, ufw vermag offenbar nicht mit deinen Bedürfnissen umzugehen; Aber was meinst du damit, wenn du sagst, dass du "etwas ohne Ansible auf dem lokalen Server nicht bearbeiten kannst"? - Antonis Christofides
Gibt es eine andere Lösung? Ich blieb bei diesem Fall, schwer zu lösen. Im Allgemeinen meine ich, dass ich nur NEUE Regeln mit ansible hinzufügen muss, ohne bestehende zu brechen. Speichern Sie nicht alle Konfigurationen auf dem Server mit ansible. Englisch ist nicht meine Muttersprache, also hoffe ich, dass ich mich klar gemacht habe :) - Navern
Meine Antwort wurde mit einigen Alternativen aktualisiert. - Antonis Christofides
Vielen Dank, veru, ich werde mir das genauer ansehen, besonders ferm. - Navern


Zeileneingabedatei

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 Anseilliniendateimodul:

- 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 "restart iptables" Handler:

- name: restart iptables
  service: name=iptables state=restarted

12
2017-08-27 16:32



Ok, danke, ich werde mir das ansehen. - Navern


Ich habe eine Rolle erstellt, um Iptables-Regeln mit den folgenden Funktionen zu verwalten:

  • Unterstützen Sie praktisch alle iptables-Regeln
  • Erlauben Sie das Hinzufügen / Überschreiben granularer Regeln für bestimmte Hosts
  • Fügen Sie Variablen einfach in die Regeln ein
  • Erlaube die Reihenfolge der Regeln
  • Einfachheit
  • Persistenz (Laden Sie die Regeln beim Booten neu)

Sieh dir mikegleasonjr.wall an ansible Galaxie oder weiter Github


2
2017-11-10 12:29





Wir haben dafür ein spezielles Modul geschrieben iptables_raw was es uns ermöglicht, iptables einfach zu verwalten. Alles wird darin erklärt Blogeintrag. 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
2017-07-07 08:41



Wir haben dieses Problem mit diesem Skript gelöst: github.com/SmilingNavern/iptables. - Navern
Aber es gibt derzeit keine ordnungsgemäße Dokumentation. Ich kann erklären, wie es funktioniert und post als Antwort später. - Navern