巨大な環境でのansibleによるiptables管理


20

1つのポイントからiptablesを管理し、ローカルサーバー上で何かを編集する機能を持つ最良の方法は何ですか。

すべてのサーバーに集中するいくつかのルールを追加する必要がありますが、独自のルールセットを持つ特定の要件を持つ特定のサーバーがあります。

ansibleで一元管理され、ローカルサーバーで管理される複数のincludeを持つbashスクリプトについて考えました。それは良いアプローチですか?それとももっと良いものがありますか?

特定のホスト間で差が大きすぎるため、ansible用のyml2テンプレートを作成できません。

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が開いています。

このようにして、必要な一般的な構成を構築し、より具体的なロールにルールを追加できます。

フェルム

ufw処理できないルールがある場合、うまくいくと思う解決策は次のとおりですferm。それはほとんど何もすることができ、そして次のようなディレクトリからルールを読み取るために、それを構成することができ/etc/ferm/input.d//etc/ferm/output.d//etc/ferm/forward.d/あなたが作ることができるなど、common役割が不可欠準備ferm設定をして、他の役割は、これらのディレクトリ内のファイルをドロップしています。

プレーンなiptables

ansible別の方法で指定された規則に加えて規則を指定するというあなたの要件は珍しくて、どうやらを使用するためのポイントのほとんどを無視しansibleます。残念ながら、plain以外の方法はありませんがiptables、これは非常にugいものです。次に、ポート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があります。このモジュールをansibleのufwで使用することはできません。また、ローカルサーバーではansibleなしでは編集できません。
ナバーン

確かに、ufw明らかにあなたのニーズを処理することはできません。しかし、「ローカルサーバーでansibleなしでは編集できない」と言うとき、どういう意味ですか?
アントニスクリスト

別の解決策はありますか?私はこのケースにこだわって、解決するのが難しい。一般的に、既存のルールを壊すことなく、ansibleを使用して新しいルールを追加するだけでよいということです。すべての構成をansibleでサーバーに保存しないでください。英語は私の母国語ではないので、自分自身を明確にしたいと思います:)
Navern

私の答えをいくつかの選択肢で更新しました。
アントニ

私はこれ、特にフェルムについて詳しく調べます。
ナバーン

12

lineinfile

既存のルールを上書きしたり、テンプレートでiptablesを一元管理したりせずにiptables構成のルールを管理する場合は、Ansibleのlineinfileモジュールを使用します。

- 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

「iptablesの再起動」ハンドラーは次のとおりです。

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

2

次の機能を使用して、iptablesルールを管理するロールを作成しました。

  • 事実上すべてのiptablesルールをサポート
  • 特定のホストに対して詳細なルールの追加/オーバーライドを許可する
  • ルールに変数を簡単に挿入する
  • ルールの順序を許可する
  • シンプルさ
  • 永続性(ブート時にルールをリロード)

ansible galaxyまたはgithubmikegleasonjr.firewallをチェックしてください


0

このために、iptablesを簡単に管理できるiptables_rawという特別なモジュールを作成しました。すべてがこのブログ投稿で説明されています。モジュールの使用方法の例を次に示します。

# 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でこの問題を解決しました
ナバーン

しかし、現在、適切なドキュメントはありません。どのように機能するかを説明し、後で回答として投稿できます。
ナバーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.