Quản lý Iptables với ansible trong môi trường rộng lớn


20

Cách tốt nhất để quản lý iptables từ một điểm và có khả năng chỉnh sửa một cái gì đó trên máy chủ cục bộ.

Chúng tôi cần thêm một số quy tắc tập trung vào tất cả các máy chủ, nhưng chúng tôi có các máy chủ cụ thể với các yêu cầu cụ thể cần có bộ quy tắc riêng.

Tôi đã nghĩ về bash script với nhiều bao gồm được quản lý tập trung với ansible và bao gồm quản lý trên máy chủ cục bộ. Đó có phải là cách tiếp cận tốt? Hoặc có thể có một cái gì đó tốt hơn?

Chúng tôi không thể tạo các mẫu yml2 cho ansible vì có quá nhiều sự khác biệt giữa các máy chủ cụ thể.

Vui lòng cung cấp các ví dụ về quản lý tập trung của iptables.

Câu trả lời:


24

ufw

Ansiblecó một ufwmô-đun để xử lý các quy tắc tường lửa. Trong roles/common/tasks/main.yml, được bao gồm trong tất cả các máy chủ của tôi, tôi có (trong số những thứ khác):

- 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

Chỉnh sửa : Cần phải cho phép ssh trước khi đặt chính sách mặc định thành "từ chối" (ban đầu nó ngược lại ở trên), nếu không bạn có thể bị khóa ở giữa hai bước.

Sau đó, trong mỗi vai trò, tôi có các quy tắc tường lửa bổ sung cho vai trò đó. Ví dụ, trong roles/nginx/tasks/main.yml, tôi có (trong số những thứ khác) này:

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

Vì vậy, tất cả các máy chủ nginx của tôi có cổng 80 và 443 được mở.

Bằng cách này, bạn có thể xây dựng bất kỳ cấu hình phổ biến nào bạn muốn và thêm các quy tắc bổ sung trong các vai trò cụ thể hơn.

ferm

Nếu bạn có các quy tắc ufwkhông thể xử lý, một giải pháp tôi nghĩ sẽ hoạt động tốt là ferm; nó có thể làm hầu hết mọi thứ, và bạn có thể cấu hình nó để đọc quy tắc từ thư mục như /etc/ferm/input.d/, /etc/ferm/output.d/, /etc/ferm/forward.d/, vv Bạn có thể làm cho bạn commonvai trò chuẩn bị cần thiết fermcấu hình và sau đó có vai trò khác thả tập tin trong các thư mục này.

iptables đơn giản

Yêu cầu của bạn để có ansiblecác quy tắc cụ thể ngoài các quy tắc được chỉ định theo cách khác là không bình thường và dường như bất chấp hầu hết các điểm để sử dụng ansible. Thật không may, tôi không thấy cách nào để làm điều đó ngoài việc đơn giản iptables, điều này sẽ khá xấu xí. Dưới đây là một ví dụ về việc mở cổng 80 trong roles/nginx/tasks/main.yml(chưa được kiểm tra):

- 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

nơi Save iptablesxử lý mà thực thi iptables-save. Tất cả những điều trên là khá tẻ nhạt để viết, nhưng nó có thể phù hợp, đặc biệt nếu bạn chỉ có một vài quy tắc để quản lý ansible.


Nếu tôi nhớ chính xác với phương pháp này, tôi không thể sử dụng ipset và tạo ra một cái gì đó rất cụ thể. Chúng tôi đang sử dụng chủ sở hữu mô-đun trong iptables. Ví dụ: chúng tôi có chủ sở hữu iptables -m --uid 0 -j CHẤP NHẬN. Tôi không thể sử dụng mô-đun này với ufw trong ansible và không thể chỉnh sửa một cái gì đó mà không có khả năng trên máy chủ cục bộ.
Navern

Thật vậy, ufwrõ ràng không thể xử lý nhu cầu của bạn; nhưng ý bạn là gì khi bạn nói rằng bạn "không thể chỉnh sửa thứ gì đó mà không có khả năng trên máy chủ cục bộ"?
Antonis Christofides

Có giải pháp nào khác không? Tôi mắc kẹt với trường hợp này, khó giải quyết. Nói chung, tôi có nghĩa là tôi chỉ cần thêm các quy tắc MỚI với ansible mà không phá vỡ quy tắc hiện có. Không lưu trữ tất cả các cấu hình trên máy chủ với ansible. Tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi, vì vậy tôi hy vọng tôi đã làm cho mình rõ ràng :)
Navern

Cập nhật câu trả lời của tôi với một số lựa chọn thay thế.
Antonis Christofides

Cảm ơn bạn veru nhiều tôi sẽ xem xét điều này, đặc biệt là ferm.
Navern

12

đường truyền

Nếu bạn muốn quản lý các quy tắc trong cấu hình iptables của mình mà không ghi đè các quy tắc hiện có hoặc quản lý tập trung iptables trong một mẫu, hãy sử dụng mô-đun lineinfile của 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

Đây là trình xử lý "restart iptables":

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

2

Tôi đã tạo một vai trò để quản lý các quy tắc iptables với các tính năng sau:

  • Hỗ trợ hầu như tất cả các quy tắc iptables
  • Cho phép thêm / ghi đè quy tắc chi tiết cho các máy chủ cụ thể
  • Dễ dàng chèn các biến trong các quy tắc
  • Cho phép quy tắc đặt hàng
  • Sự đơn giản
  • Kiên trì (tải lại các quy tắc khi khởi động)

Kiểm tra mikegleasonjr.firewall trên thiên hà ansible hoặc trên github


0

Chúng tôi đã viết một mô-đun đặc biệt cho cái này được gọi là iptables_raw cho phép chúng tôi dễ dàng quản lý iptables. Tất cả mọi thứ được giải thích trong bài viết trên blog này . Dưới đây là một ví dụ về cách sử dụng mô-đun:

# 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

chúng tôi đã giải quyết vấn đề này với tập lệnh này: github.com/SmilingNavern/iptables .
Navern

Nhưng hiện tại không có tài liệu phù hợp. Tôi có thể giải thích cách nó hoạt động và đăng như câu trả lời sau.
Navern
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.