Iptables Management mit Ansible in riesiger Umgebung


20

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

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

Ich dachte an ein Bash-Skript mit mehreren Include-Dateien, 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 es zu viele Unterschiede zwischen bestimmten Hosts gibt.

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

Antworten:


24

ufw

Ansiblehat ein ufwModul , 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 notwendig, ssh zuzulassen, bevor die Standardrichtlinie auf "Verweigern" gesetzt wird (ursprünglich war es das Gegenteil von oben), sonst können Sie zwischen den beiden Schritten gesperrt werden.

Dann habe ich in jeder Rolle zusätzliche Firewall-Regeln für diese Rolle. Zum Beispiel habe roles/nginx/tasks/main.ymlich in (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 von Ihnen gewünschte allgemeine Konfiguration erstellen und zusätzliche Regeln in spezifischeren Rollen hinzufügen.

ferm

Wenn Sie Regeln haben, mit denen Sie ufwnicht umgehen können, ist eine Lösung, die meiner Meinung nach gut funktioniert ferm. es kann fast alles tun, und Sie können es so konfigurieren , Regeln aus Verzeichnissen wie zu lesen /etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/etc. Sie könnten Ihre machen commonRolle die wesentliche Vorbereitung fermKonfiguration und haben dann andere Rollen Dateien in diesen Verzeichnissen löschen.

einfache Iptables

Ihre Forderung ansible, Regeln zusätzlich zu Regeln festzulegen, die auf andere Weise festgelegt wurden, ist ungewöhnlich und widerspricht anscheinend den meisten Verwendungszwecken ansible. Leider sehe ich keinen anderen Weg, als dies mit der Ebene zu tun 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

wo Save iptablesist ein Handler, der ausführt iptables-save. Das alles ist ziemlich mühsam zu schreiben, aber es könnte angebracht sein, besonders wenn Sie nur ein paar Regeln haben, mit denen Sie umgehen müssen ansible.


Wenn ich mich bei diesem Ansatz richtig erinnere, kann ich ipset nicht verwenden und etwas sehr Spezifisches erschaffen. Wir verwenden Modulinhaber in iptables. Zum Beispiel haben wir iptables -m owner --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

In der Tat kann ufwoffenbar nicht mit Ihren Bedürfnissen umgehen; aber was meinst du, wenn du sagst, dass du etwas nicht bearbeiten kannst, ohne es auf dem lokalen Server zu bearbeiten?
Antonis Christofides

Gibt es eine andere Lösung? Ich blieb bei diesem Fall, schwer zu lösen. Im Allgemeinen bedeute ich, dass ich nur NEUE Richtlinien mit ansible addieren muss, ohne vorhandene zu brechen. Speichern Sie nicht die gesamte Konfiguration auf dem Server mit ansible. Englisch ist nicht meine Muttersprache, daher hoffe ich, dass ich mich klar
ausgedrückt

Meine Antwort wurde mit einigen Alternativen aktualisiert.
Antonis Christofides

Vielen Dank, ich werde mich darum kümmern, besonders um Ferm.
Navern

12

lineinfile

Wenn Sie Regeln in Ihrer iptables-Konfiguration verwalten möchten, ohne vorhandene Regeln zu überschreiben, oder iptables in einer Vorlage zentral verwalten möchten, 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 "restart iptables" -Handler:

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

2

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

  • Unterstützt praktisch alle Iptables-Regeln
  • Hinzufügen / Überschreiben von granularen Regeln für bestimmte Hosts zulassen
  • Fügen Sie einfach Variablen in die Regeln ein
  • Reihenfolge der Regeln zulassen
  • Einfachheit
  • Persistenz (Regeln beim Booten neu laden)

Sehen Sie sich mikegleasonjr.firewall auf Ansible Galaxy oder Github an


0

Wir haben dafür ein spezielles Modul namens iptables_raw geschrieben , mit dem wir iptables einfach verwalten können. Alles wird in diesem Blogbeitrag 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

Wir haben dieses Problem mit dem folgenden Skript behoben: github.com/SmilingNavern/iptables .
Navern

Derzeit gibt es jedoch keine ordnungsgemäße Dokumentation. Ich kann erklären, wie es funktioniert und später als Antwort posten.
Navern
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.