BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Ansible】Ansibleでファイアウォールを設定する

 こんにちは!
 BFT名古屋支店の佐野です。

 突然ですが、ファイアウォールの管理というのはシステム運用における重要なタスクのひとつとして必ずと言っていいほどあるものだと筆者は考えています。
 そして同時に失敗するとネットワーク疎通の断絶という結果になりかねないタスクでもあるため、できれば確実に、それこそ決まった設定を繰り返し行なうのであれば自動化したいものかと思います。
 今回はそのファイアウォールの管理をAnsibleから行なう方法と、使用するモジュールについて解説を致します。


はじめに:ファイアウォールの設定に使うモジュール

 AnsibleのPlaybookにてファイアウォールの管理を行なう場合は、RHELCentOS)であればfirewalldUbuntuであればufwというモジュールを使用します。
 それぞれ機能はfirewalldコマンドおよびufwコマンドでできることに準じており、モジュールのオプションを用いることで従来のコマンド利用の動きを実装することができます。

 注意点として、どちらのモジュールも一度に複数のルールを設定するといったことはできません。
 複数回にわたって閉塞・開放などの処理、ルール設定を行なう場合は、そのルールごとにモジュールを使用し、実装する必要があります。

 なお、firewalldモジュールの公式ドキュメントについてはこちらufwモジュールについてはこちらから参照できます。

 ここからは、例として、firewalldモジュールおよびufwモジュールでファイアウォールのルールの設定を行なうPlaybookを紹介します。


例:firewalldモジュールを使用し、デフォルト(public)ゾーンにhttpsサービスでの通信許可と、「work」ゾーンに5432(PostgreSQL)ポートでの通信許可を設定する

 firewalldモジュールを使用したファイアウォール管理を行なうPlaybookの例は以下のようになります。
 最初にhttpsサービスの通信許可設定をデフォルトとなるpublicゾーンに設定し、その後ルールを設定するゾーンの指定をworkゾーンとし、PostgreSQLの使用ポートである5432/tcpポートの通信許可ルールを設定しています。

- hosts: all

  tasks:
  - name: https postgreSQL open
    firewalld:
      service: https
      permanent: yes
      state: enabled

    firewalld:
      zone: work
      port: 5432/tcp
      permanent: yes
      state: enabled

 主に使用するオプションは許可するサービスやポートを指定するserviceport、設定した内容を再起動後も保持するか選択するpermanent、その通信を許可するか拒否するか選択するstateの4つです。
 serviceに関しては/usr/lib/firewalld/services/または/etc/firewalld/servicesにあるサービスが指定でき、portで指定する場合は対象ポートと通信プトロコル(サービス名ではありません)を上例のように記述します。
  permanentとstateは指定必須項目で、permanentはyesを選択することで再起動を挟んでも設定が保持され、stateはserviceやportで指定した通信を許可(enabled)するか拒否(disabled)するかを選択します。

 またzoneではルールを設定する対象となるゾーンを指定できます。
 初期設定されているゾーンのwork、drop、internal、external、trusted、home、dmz、publicが指定できる他、別途作成したゾーンの指定も可能です。
(ただし、指定する前にゾーンが作成されている必要はあります)

/etc/ufw/applications.d


ufwモジュールを使用し、デフォルトポリシーを無効化し、5432(PostgreSQL)ポートの通信を許可する

 ufwモジュールを使用したファイアウォール管理を行なうPlaybookの例は以下のようになります。
 最初にファイアウォールのリロードおよび有効化を行ない、デフォルトポリシーを無効化。その後PostgreSQLの使用ポートである5432/tcpポートの通信許可ルールを設定しています。

- hosts: all

  tasks:
  - name: ufw setting
    ufw:
      state: enabled
      policy: deny

  - name: allow all access to port 5432
    ufw:
      rule: allow
      port: '5432'

 主に使用するオプションは、ファイアウォールの状態そのものを操作するstate、ルールの許可・拒否を設定するrule、ルールの対象となるポートを指定するportの3つです。
 stateオプションをenabledにすることで、ファイアウォールのリロードと有効化が同時に行なわれます。
 またpolicy(またはdefault)オプションにてdenyを指定することで、デフォルトポリシーの無効化を行なうことができます。


さいごに

 以上がAnsibleによるファイアウォール管理の方法、およびそれに使用するfirewalldモジュールとufwモジュールの解説になります。  注意点として、Ansibleは基本的にSSHにより管理対象に接続し、処理を行ないます。
 ので管理対象のファイアウォールSSH接続を拒否してしまうと、特別に設定をしていない限り、それ以降のAnsibleによる管理ができなくなります。

 また管理を行なうためにはSSH接続を行なえる必要がありますので、PlaybookによってSSHの許可設定を行なうというのはあまり現実的ではありません。
 しかしその他の解放・閉塞管理であれば、Playbookを使用して円滑に管理ができるかと思いますので、是非ご活用していただきたいと思います。
 以上、お読みいただきありがとうございました。