Ansible:FortiGate のポリシーを設定する

ネットワーク

作業環境

■ Ansible 側

  • CentOS 8.0
  • Python 3.7.7
  • Ansible 2.9.6

■ FortiGate 側

  • 型番:FortiGate 60E
  • バージョン:v6.0.9

ポリシーの設定

fortios_firewall_policy モジュールを使用することで FortiGate のコンフィグにおける config firewall policy の各項目を設定することができます。

  • ポリシーの追加/変更/削除

に利用できます。

主なパラメータ

パラメータ必須選択肢/デフォルト説明
host対象機器のIPアドレス
usernameSSH用のユーザ
password・”” ←SSH用のパスワード
vdom・root ←対象機器のバーチャルドメイン
https・no
・yes ←
HTTPSを使用するかどうか
ssl_verify・no
・yes ←
対象機器の証明書を検証するかどうか
state・present
・absent
present ⇒ オブジェクト作成/変更
absent ⇒ オブジェクト削除
※Ansible 2.9 からはこのレベルで指定
firewall_policy各設定項目を子要素に指定
 – state・present
・absent
present ⇒ オブジェクト作成/変更
absent ⇒ オブジェクト削除
※Ansible 2.8 ではこのレベルで指定
 – policyidポリシー ID
 – nameオブジェクト名
 – srcintf送信元インターフェースをリストで指定
  – nameインターフェース名
 – dstintf宛先インターフェースをリストで指定
  – nameインターフェース名
 – srcaddr送信元アドレスをリストで指定
  – nameアドレス名
 – dstaddr宛先アドレスをリストで指定
  – nameアドレス名
 – action・accept
・deny
・ipsec
アクション
 – status・enable
・disable
ステータス
 – schedule・always
・none
など
スケジュール
 – serviceサービスをリストで指定
  – nameサービス名
 – logtraffic・all
・utm
・disable
ログ取得設定
 – logtraffic_start・enable
・disable
セッションの開始時と終了時にログ取得
 – commentsコメント
 – nat・enable
・disable
ソース IP NAT の使用

備考

  • Ansible 2.8 から追加されたモジュール
  • Legacy モードでの実行のためには fortiosapi が必要
  • httpapi での実行が可能

使用例

httpapi を使用してモジュールを実行する例です。

■ インベントリ:hosts

[forti]
10.1.10.100

[forti:vars]
ansible_user=admin
ansible_password=password
ansible_network_os=fortios
ansible_connection=httpapi
ansible_httpapi_use_ssl=yes
ansible_httpapi_validate_certs=no

10.1.10.100 は操作対象の FortiGate のIPアドレスです。
httpapi で使用する変数をグループ変数として定義しています。

ポリシーの追加(NAT 無し)

■ Playbook:policy_no_nat_present.yml

- hosts: forti
  gather_facts: no
  tasks:
    - name: "add policy (no nat)"
      fortios_firewall_policy:
        vdom: "root"
        state: "present"
        firewall_policy:
          policyid: "3"
          name: "test_policy"
          srcintf:
            - name: "internal1"
          dstintf:
            - name: "wan1"
          srcaddr:
            - name: "all"
          dstaddr:
            - name: "all"
          action: "accept"
          status: "enable"
          schedule: "always"
          service:
            - name: "ALL"
          logtraffic: "utm"
          logtraffic_start: "disable"
          comments: "test_policy"
          nat: "disable"

■ Playbook 実行

# ansible-playbook -i hosts policy_no_nat_present.yml

PLAY [forti] ********************************************************************************************************

TASK [add policy (no nat)] ******************************************************************************************
changed: [10.1.10.100]

PLAY RECAP **********************************************************************************************************
10.1.10.100                : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

■ 実行後の FortiGate のコンフィグ

FGT # show firewall policy
config firewall policy
    #略
    edit 3
        set name "test_policy"
        set uuid bcb77c6e-a23f-51ea-e86a-9e610b1732d5
        set srcintf "internal1"
        set dstintf "wan1"
        set srcaddr "all"
        set dstaddr "all"
        set action accept
        set schedule "always"
        set service "ALL"
        set comments "test_policy"
    next
end

ポリシーの削除

ポリシー ID 3 のポリシーを削除する例です。

■ Playbook:service_absent.yml

- hosts: forti
  gather_facts: no
  tasks:
    - name: "delete policy"
      fortios_firewall_policy:
        vdom: "root"
        state: "absent"
        firewall_policy:
          policyid: "3"

■ Playbook 実行

# ansible-playbook -i hosts policy_absent.yml

PLAY [forti] ********************************************************************************************************

TASK [delete policy] ************************************************************************************************
changed: [10.1.10.100]

PLAY RECAP **********************************************************************************************************
10.1.10.100                : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

―――――――――――――

タイトルとURLをコピーしました