Devasa ortamda ansible ile iptables yönetimi


20

Iptables'ı bir noktadan yönetmenin ve yerel sunucuda bir şeyi düzenleme yeteneğine sahip olmanın en iyi yolu nedir?

Tüm sunucularda merkezileştirilmiş bazı kurallar eklememiz gerekiyor, ancak kendi kuralları olan özel gereksinimleri olan belirli sunucularımız var.

Ben ansible ile merkezi yönetilen ve yerel sunucuda yönetilen içerir birden fazla dahil bash betiği düşündüm. İyi bir yaklaşım mı? Ya da belki daha iyi bir şey var mı?

Belirli ana makineler arasında çok fazla fark olduğundan, ansible için yml2 şablonları oluşturamayız.

Lütfen iptables'ın merkezi yönetimine örnekler verin.

Yanıtlar:


24

UFW

Ansiblegüvenlik duvarı kurallarını işlemek için bir ufwmodülü vardır. Gelen roles/common/tasks/main.ymltüm sunucuların dahildir, ben (diğer şeyler arasında) sahiptir:

- 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

Düzenleme : Varsayılan ilkeyi "reddetme" (başlangıçta yukarıda tersi) olarak ayarlamadan önce ssh'a izin vermek gerekir, aksi takdirde iki adım arasında kilitlenmiş olabilirsiniz.

Sonra, her bir rol için, bu rol için ek güvenlik duvarı kurallarım var. Örneğin, içinde roles/nginx/tasks/main.yml, (diğer şeylerin yanı sıra) bu var:

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

Yani tüm nginx sunucularımın 80 ve 443 numaralı portları açıldı.

Bu şekilde, istediğiniz genel yapılandırmayı oluşturabilir ve daha spesifik rollere ek kurallar ekleyebilirsiniz.

ferm

Eğer ufwbaşa çıkamayacak kurallarınız varsa , bence en iyi çözümlerden biri ferm; neredeyse her şeyi yapabilir ve siz gibi dizinleri kurallarını okumak için yapılandırabilirsiniz /etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/vb Sen yapabilir commonrol gerekli hazırlamak fermyapılandırma ve daha sonra diğer rolleri bu dizinlere dosyaları damla var.

düz iptables

ansibleBaşka bir şekilde belirtilen kurallara ek olarak kuralları belirtme gereksinimi olağandışıdır ve görünüşe göre kullanım noktasının çoğunu ortadan kaldırır ansible. Ne yazık ki bunu yapmak için herhangi bir yol göremiyorum iptables. Aşağıda roles/nginx/tasks/main.yml(denenmemiş) 80 numaralı bağlantı noktasını açma örneği :

- 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

Nerede çalışan Save iptablesbir işleyici iptables-save. Yukarıdakilerin hepsi yazmak oldukça sıkıcıdır, ancak özellikle yönetmek için sadece birkaç kuralınız varsa uygun olabilir ansible.


Bu yaklaşımla doğru hatırlıyorsam ipset kullanamıyorum ve çok özel bir şey yaratamıyorum. Biz iptables modül sahibi kullanıyoruz. Örneğin iptables -m owner --uid 0 -j KABUL EDİYORUZ. Bu modülü ansible ufw ile kullanamıyorum ve yerel sunucuda ansible olmadan bir şey düzenleyemiyorum.
Navern

Gerçekten de ufwgörünüşe göre ihtiyaçlarınızı karşılayamıyor; ancak "yerel sunucuda ansible olmadan bir şeyi düzenleyemeyeceğinizi" söylediğinizde ne anlama geliyor?
Antonis Christofides

Başka bir çözüm var mı? Bu davada sıkıştım, çözmek zor. Genel olarak ben sadece mevcut olanı kırmadan ansible ile YENİ kurallar eklemek gerekir demek. Tüm yapılandırmayı ansible ile sunucuda saklamayın. İngilizce benim ana dilim değil, bu yüzden umarım kendimi açıklığa kavuşturdum :)
Navern

Cevabımı bazı alternatiflerle güncelledim.
Antonis Christofides

Bu konuya, özellikle ferm'e bakacağım için çok teşekkür ederim.
Navern

12

lineinfile

İptables yapılandırmanızdaki kuralları mevcut kuralların üzerine yazmadan veya şablondaki iptables'ları merkezi olarak yönetmeden yönetmek istiyorsanız, Ansible'ın lineinfile modülünü kullanın:

- 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

İşte "iptables yeniden başlat" işleyicisi:

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

2

Aşağıdaki özelliklerle iptables kurallarını yönetmek için bir rol oluşturdum:

  • Hemen hemen tüm iptables kurallarını destekleyin
  • Belirli ana bilgisayarlar için ayrıntılı kurallar eklemeye / geçersiz kılmaya izin ver
  • Kurallara değişkenleri kolayca enjekte edin
  • Kural siparişine izin ver
  • Basitlik
  • Kalıcılık (önyükleme sırasında kuralları yeniden yükle)

Mikegleasonjr.firewall üzerinde göz atın yanıtlayıcı 'galaksi veya üzerinde github


0

Bunun için iptables_raw adlı iptables_raw'ı kolayca yönetmemizi sağlayan özel bir modül yazdık . Her şey bu blog yazısında açıklanmıştır . Modülün nasıl kullanılacağına dair bir örnek:

# 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


Ancak şu anda uygun bir belge yok. Nasıl çalıştığını açıklayabilir ve daha sonra cevap olarak gönderebilirim.
Navern
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.