การจัดการที่คล่องแคล่วและไม่น่าเชื่อในสภาพแวดล้อมขนาดใหญ่


20

เป็นวิธีที่ดีที่สุดในการจัดการ iptables จากจุดหนึ่งและมีความสามารถในการแก้ไขบางอย่างบนเซิร์ฟเวอร์ท้องถิ่นคืออะไร

เราจำเป็นต้องเพิ่มกฎบางอย่างที่รวมศูนย์ไว้บนเซิร์ฟเวอร์ทั้งหมด แต่เรามีเซิร์ฟเวอร์เฉพาะที่มีข้อกำหนดเฉพาะซึ่งควรมีชุดกฎของตนเอง

ฉันคิดเกี่ยวกับ bash script ที่มีการรวมหลายรายการซึ่งถูกจัดการจากส่วนกลางด้วย ansible และรวมถึงการจัดการบนเซิร์ฟเวอร์ภายใน มันเป็นวิธีการที่ดีหรือไม่? หรืออาจจะมีสิ่งที่ดีกว่า

เราไม่สามารถสร้างเทมเพลต yml2 สำหรับ ansible ได้เนื่องจากมีความแตกต่างระหว่างโฮสต์ที่เฉพาะเจาะจงมากเกินไป

โปรดให้ตัวอย่างของการจัดการแบบรวมศูนย์ของ iptables

คำตอบ:


24

ufw

Ansibleมีufwโมดูลเพื่อจัดการกฎไฟร์วอลล์ ในroles/common/tasks/main.ymlซึ่งรวมอยู่ในเซิร์ฟเวอร์ทั้งหมดของฉันฉันมี (เหนือสิ่งอื่นใด):

- 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

แก้ไข : มีความจำเป็นที่จะต้องอนุญาตให้ ssh ก่อนตั้งค่านโยบายเริ่มต้นเป็น "ปฏิเสธ" (แต่เดิมตรงกันข้ามกับด้านบน) มิฉะนั้นคุณอาจถูกล็อคเอาไว้ระหว่างสองขั้นตอน

จากนั้นในแต่ละบทบาทฉันมีกฎไฟร์วอลล์เพิ่มเติมสำหรับบทบาทนั้น ตัวอย่างเช่นในroles/nginx/tasks/main.ymlฉันมี (เหนือสิ่งอื่นใด) นี้:

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

ดังนั้นเซิร์ฟเวอร์ nginx ของฉันทั้งหมดจึงเปิดพอร์ต 80 และ 443

วิธีนี้คุณสามารถสร้างการกำหนดค่าทั่วไปที่คุณต้องการและเพิ่มกฎเพิ่มเติมในบทบาทที่เฉพาะเจาะจงมากขึ้น

Ferm

ถ้าคุณมีกฎที่ufwไม่สามารถจัดการแก้ปัญหาหนึ่งที่ผมคิดว่าจะทำงานอย่างเป็นferm; มันสามารถทำเกือบทุกอย่างและคุณสามารถกำหนดค่าให้อ่านกฎจากไดเรกทอรีเช่น/etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/ฯลฯ คุณจะทำให้คุณcommonมีบทบาทที่สำคัญเตรียมความพร้อมfermการกำหนดค่าแล้วมีบทบาทอื่น ๆ วางไฟล์ในไดเรกทอรีเหล่านี้

iptables ธรรมดา

ความต้องการของคุณที่จะมีการระบุกฎนอกเหนือไปจากกฎระเบียบที่ระบุไว้ในอีกทางหนึ่งเป็นเรื่องผิดปกติและเห็นได้ชัดอย่างหวุดหวิดที่สุดของจุดในการใช้ansible ansibleน่าเสียดายที่ฉันไม่เห็นวิธีที่จะทำนอกเหนือจากที่เรียบง่ายiptablesซึ่งน่าเกลียดมาก นี่คือตัวอย่างของการเปิดพอร์ต 80 ในroles/nginx/tasks/main.yml(ยังไม่ทดลอง):

- 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

ที่เป็นตัวจัดการที่รันSave iptables iptables-saveทั้งหมดข้างต้นค่อนข้างน่าเบื่อในการเขียน แต่อาจเหมาะสมโดยเฉพาะถ้าคุณมีกฎเพียงไม่กี่ข้อเท่านั้นที่จะจัดการansibleได้


ถ้าฉันจำได้อย่างถูกต้องด้วยวิธีนี้ฉันไม่สามารถใช้ ipset และสร้างสิ่งที่เฉพาะเจาะจงมาก เรากำลังใช้เจ้าของโมดูลใน iptables ตัวอย่างเช่นเรามี iptables -m owner --uid 0 -j ACCEPT ฉันไม่สามารถใช้โมดูลนี้กับ ufw ใน ansible และไม่สามารถแก้ไขบางอย่างโดยไม่ต้อง ansible บนเซิร์ฟเวอร์ภายใน
Navern

อันที่จริงufwเห็นได้ชัดว่าไม่สามารถจัดการกับความต้องการของคุณ แต่คุณหมายความว่าอย่างไรเมื่อคุณพูดว่า "ไม่สามารถแก้ไขบางอย่างหากไม่มีเซิร์ฟเวอร์ในเครื่อง"
Antonis Christofides

มีวิธีแก้ไขปัญหาอื่นอีกหรือไม่ ฉันติดอยู่กับกรณีนี้ยากที่จะแก้ปัญหา โดยทั่วไปแล้วฉันหมายถึงว่าฉันต้องเพิ่มกฎใหม่ด้วยคำว่า ansible โดยไม่ทำลายกฎที่มีอยู่เดิม อย่าเก็บการกำหนดค่าทั้งหมดบนเซิร์ฟเวอร์ด้วย ansible ภาษาอังกฤษไม่ใช่ภาษาแม่ของฉันดังนั้นฉันหวังว่าฉันจะทำให้ชัดเจน :)
Navern

อัปเดตคำตอบของฉันด้วยทางเลือกอื่น
Antonis Christofides

ขอบคุณ veru มากฉันจะตรวจสอบเรื่องนี้โดยเฉพาะอย่างยิ่ง ferm
Navern

12

lineinfile

หากคุณต้องการจัดการกฎในการกำหนดค่า iptables ของคุณโดยไม่เขียนทับกฎที่มีอยู่หรือจัดการ iptables จากส่วนกลางในแม่แบบให้ใช้โมดูล lineinfile ของ 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

นี่คือตัวจัดการ "restart iptables":

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

2

ฉันสร้างบทบาทเพื่อจัดการกฎ iptables ด้วยคุณสมบัติต่อไปนี้:

  • สนับสนุนกฎ iptables แทบทั้งหมด
  • อนุญาตการเพิ่ม / ลบล้างกฎแบบละเอียดสำหรับโฮสต์ที่ระบุ
  • ฉีดตัวแปรในกฎได้อย่างง่ายดาย
  • อนุญาตการสั่งซื้อกฎ
  • ความง่าย
  • ความคงทน (โหลดกฎตอนบู๊ต)

ลองชม mikegleasonjr.firewall บนกาแลคซีที่ตรวจพบได้หรือบนGitHub


0

เราเขียนโมดูลพิเศษสำหรับiptables_rawนี้ซึ่งช่วยให้เราจัดการ iptables ได้อย่างง่ายดาย ทุกอย่างถูกอธิบายในโพสต์บล็อกนี้ นี่คือตัวอย่างของวิธีการใช้โมดูล:

# 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

เราได้แก้ปัญหานี้กับสคริปต์นี้: github.com/SmilingNavern/iptables
Navern

แต่ปัจจุบันยังไม่มีเอกสารที่เหมาะสม ฉันสามารถอธิบายวิธีการทำงานและโพสต์เป็นคำตอบในภายหลัง
Navern
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.