Gestione di iptabili con ansible in un ambiente enorme


20

Qual è il modo migliore per gestire iptables da un punto e avere la possibilità di modificare qualcosa sul server locale.

Dobbiamo aggiungere alcune regole centralizzate su tutti i server, ma abbiamo server specifici con requisiti specifici che dovrebbero avere il proprio set di regole.

Ho pensato allo script bash con include multiple che è gestito centralmente con ansible e include gestito sul server locale. È un buon approccio? O forse c'è qualcosa di meglio?

Non è possibile creare modelli yml2 per ansible perché c'è troppa differenza tra host specifici.

Fornisci esempi di gestione centralizzata di iptables.

Risposte:


24

ufw

Ansibleha un ufwmodulo per gestire le regole del firewall. In roles/common/tasks/main.yml, che è incluso in tutti i miei server, ho (tra le altre cose):

- 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

Modifica : È necessario consentire a ssh prima di impostare la politica di default su "nega" (originariamente era l'opposto sopra), altrimenti potresti essere bloccato tra i due passaggi.

Quindi, in ogni ruolo, ho regole firewall aggiuntive per quel ruolo. Ad esempio, in roles/nginx/tasks/main.yml, ho (tra le altre cose) questo:

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

Quindi tutti i miei server nginx hanno le porte 80 e 443 aperte.

In questo modo è possibile creare qualsiasi configurazione comune desiderata e aggiungere regole aggiuntive in ruoli più specifici.

ferm

Se hai regole che ufwnon sono in grado di gestire, penso che una soluzione funzionerebbe bene ferm; si può fare quasi tutto, ed è possibile configurarlo per leggere le regole di directory come /etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/, ecc Si potrebbe rendere il vostro commonruolo essenziale preparare la fermconfigurazione e poi altri ruoli rilasciare i file in queste directory.

iptables semplici

Il tuo requisito di avere ansibleregole specifiche oltre alle regole specificate in un altro modo è insolito e apparentemente sfugge alla maggior parte del punto per l'utilizzo ansible. Sfortunatamente non vedo altro modo di farlo se non con Plain iptables, il che sarebbe abbastanza brutto. Ecco un esempio di apertura della porta 80 in roles/nginx/tasks/main.yml(non testato):

- 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

dove Save iptablesè un gestore che esegue iptables-save. Tutto quanto sopra è abbastanza noioso da scrivere, ma potrebbe essere appropriato, soprattutto se hai solo poche regole da gestire ansible.


Se ricordo bene con questo approccio non posso usare ipset e creare qualcosa di molto specifico. Stiamo usando il proprietario del modulo in iptables. Ad esempio abbiamo iptables -m proprietario --uid 0 -j ACCEPT. Non posso usare questo modulo con ufw in ansible e non posso modificare qualcosa senza ansible sul server locale.
Navern

In effetti, ufwapparentemente non è in grado di gestire le tue esigenze; ma cosa intendi quando dici che "non puoi modificare qualcosa senza ansible sul server locale"?
Antonis Christofides,

C'è un'altra soluzione? Mi sono bloccato con questo caso, difficile da risolvere. In generale, intendo dire che devo solo aggiungere NUOVE regole con ansible senza infrangere quelle esistenti. Non memorizzare tutta la configurazione sul server con ansible. L'inglese non è la mia lingua madre, quindi spero di
essermi

Aggiornato la mia risposta con alcune alternative.
Antonis Christofides,

Grazie mille esaminerò questo, specialmente ferm.
Navern

12

lineinfile

Se si desidera gestire le regole nella configurazione di iptables senza sovrascrivere le regole esistenti o gestire centralmente iptables in un modello, utilizzare il modulo lineinfile di 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

Ecco il gestore "riavvia iptables":

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

2

Ho creato un ruolo per gestire le regole di iptables con le seguenti funzionalità:

  • Supporta praticamente tutte le regole di iptables
  • Consenti aggiunta / sostituzione di regole granulari per host specifici
  • Iniettare facilmente le variabili nelle regole
  • Consenti l'ordinamento delle regole
  • Semplicità
  • Persistenza (ricaricare le regole all'avvio)

Dai un'occhiata a mikegleasonjr.firewall su ansible galaxy o su github


0

Abbiamo scritto un modulo speciale per questo chiamato iptables_raw che ci consente di gestire facilmente iptables. Tutto è spiegato in questo post sul blog . Ecco un esempio di come utilizzare il modulo:

# 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

abbiamo risolto questo problema con questo script: github.com/SmilingNavern/iptables .
Navern

Ma al momento non esiste una documentazione adeguata. Posso spiegare come funziona e pubblicare come risposta in seguito.
Navern
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.