Ansibleを使用してNW機器設定を自動化する(FortiGate-ファイアウォールポリシー編①)

はじめに

  • 当記事は、日常の運用業務(NW機器設定)の自動化により、運用コストの削減 および 運用品質の向上 を目標に
    「Ansible」を使用し、様々なNW機器設定を自動化してみようと 試みた記事です。
  • Ansibleは、OSS版(AWX)+OSS版(Ansible)を使用しております。

 

FortiGateの「ファイアウォールポリシー」の登録/変更/削除を実施してみた

事前設定

  • Templateを作成し、インベントリーと認証情報を設定する。
  • インベントリー:対象機器(ホスト)の接続先/接続方法/使用プラグインを設定する
    ---
    ansible_host: xxx.xxx.xxx.xxx ← 接続先IPを指定
    ansible_connection: httpapi ← FortiGateは、デフォルト接続方式(ssh)ではなく、HTTP/HTTPS(API)を使用
    ansible_httpapi_use_ssl: yes ← HTTP/HTTPS(API)を使用する際、HTTPSを使用
    ansible_httpapi_validate_certs: no ← HTTP/HTTPS(API)を使用する際、証明書のチェックを無視(証明書が信頼できないエラーを回避)
    ansible_network_os: fortinet.fortios.fortios ← 接続方式(httpapi)を使用する場合、使用するプラグインを指定
  • 認証情報:対象機器へのログイン情報(ユーザ名/パスワード)を設定。
    ユーザ名は  変数:ansible_user   に保持される
    パスワードは 変数:ansible_password に保持される

 

Playbook作成(YAML)

使用モジュール
  • fortinet.fortios.fortios_firewall_policy を使用。
    ※参考ページ:https://docs.ansible.com/projects/ansible/latest/collections/fortinet/fortios/fortios_firewall_policy_module.html

 

ファイアウォールポリシーの登録
  • 接続情報とポリシー(送信元/宛先/サービス)を指定して登録(state: ‘present’)を行う。
    - name: Firewall_Policy(Add)
      fortios_firewall_policy:
        vdom: "root"
        state: "present"
        firewall_policy:
          policyid: "50"
          name: "test_policy001"
          srcintf:              ← 送信元インタフェース
            - name: "port4"
          dstintf:              ← 宛先インタフェース
            - name: "port6"
          srcaddr: [{name: "test_add001"}] ← 送信元アドレス
          dstaddr: [{name: "test_add002"}] ← 宛先アドレス
          service: [{name: "test_ser001"}] ← サービス
          action: "accept"
          schedule: "always"
          nat: "enable"
      register: wk_result
  • 実行結果:対象のファイアウォールポリシーが登録された。 ※Ansibleの実行結果を抜粋
    "msg": {
      "meta": {
        "results": [
          {
            "policyid": 50,
            "name": "test_policy001",
            "srcintf": [{"name": "port4"}],
            "dstintf": [{"name": "port6"}],
            "srcaddr": [{"name": "test_add001"}],
            "dstaddr": [{"name": "test_add002"}],
            "service": [{"name": "test_ser001"}],
            "action": "accept",
            "schedule": "always",
            "nat": "enable"
          }
        ],
        "status": "success",
        "vdom": "root"
      }
    }
 
ファイアウォールポリシーの登録 ※ファイアウォールポリシーが既に存在する場合
  • 接続情報とポリシー(送信元/宛先/サービス)を指定して登録(state: ‘present’)を行う。 ※ファイアウォールポリシーが既に存在する場合は、既存設定の置き換えとなる
    - name: Firewall_Policy(Add)
      fortios_firewall_policy:
        vdom: "root"
        state: "present"
        firewall_policy:
          policyid: "50"
          name: "test_policy001"
          srcintf:                 ← 送信元インタフェース
            - name: "port4"
          dstintf:                 ← 宛先インタフェース
            - name: "port6"
          srcaddr: [{name: "test_add001"}]    ← 送信元アドレス
          dstaddr: [{name: "test_addgroup001"}] ← 宛先アドレス
          service: [{name: "test_sergroup001"}] ← サービス
          action: "accept"
          schedule: "always"
          nat: "enable"
      register: wk_result
  • 実行結果:対象のファイアウォールポリシーが上書き更新された。 ※Ansibleの実行結果を抜粋
    "msg": {
      "meta": {
        "results": [
          {
            "policyid": 50,
            "name": "test_policy001",
            "srcintf": [{"name": "port4"}],
            "dstintf": [{"name": "port6"}],
            "srcaddr": [{"name": "test_add001"}],
            "dstaddr": [{"name": "test_addgroup001"}],
            "service": [{"name": "test_sergroup001"}],
            "action": "accept",
            "schedule": "always",
            "nat": "enable"
          }
        ],
        "status": "success",
        "vdom": "root"
      }
    }

 

ファイアウォールポリシーの変更 ※登録のつづき
  • 接続情報とポリシー(送信元/宛先/サービス)を指定して登録(state: ‘present’)を行う。 ※ファイアウォールポリシーが既に存在する場合は、既存設定の置き換えとなる
    - name: Firewall_Policy(Change)
      fortios_firewall_policy:
        vdom: "root"
        state: "present"
        firewall_policy:
          policyid: "50"
          name: "test_policy001"
          srcintf:                 ← 送信元インタフェース
            - name: "port4"
          dstintf:                 ← 宛先インタフェース
            - name: "port6"
          srcaddr: [{name: "test_add001"}]                ← 送信元アドレス
          dstaddr: [{name: "test_add002"},{name: "test_addgroup001"}] ← 宛先アドレス
          service: [{name: "test_ser001"},{name: "test_sergroup001"}] ← サービス
          action: "accept"
          schedule: "always"
          nat: "enable"
        register: wk_result
  • 実行結果:対象のファイアウォールポリシーが上書き更新された。 ※Ansibleの実行結果を抜粋
    "msg": {
      "meta": {
        "results": [
          {
            "policyid": 50,
            "name": "test_policy001",
            "srcintf": [{"name": "port4"}],
            "dstintf": [{"name": "port6"}],
            "srcaddr": [{"name": "test_add001"}],
            "dstaddr": [{"name": "test_addgroup001"},{"name": "test_add002"}],
            "service": [{"name": "test_sergroup001"},{"name": "test_ser001"}],
            "action": "accept",
            "schedule": "always",
            "nat": "enable"
          }
        ],
        "status": "success",
        "vdom": "root"
      }
    }
 
  • fortinet.fortios.fortios_firewall_policyには、登録処理(state: ‘present’)と削除処理(state: ‘absent’)しか ありません。その為、変更したい場合は、登録処理を活用して上書き更新を行うこととなります!! 

 

ファイアウォールポリシーの削除 ※変更のつづき
  • 接続情報とポリシーを指定して削除(state: ‘absent’)を行う。
    - name: Firewall_Policy(Delete)
      fortios_firewall_policy:
        vdom: "root"
        state: "absent"
        firewall_policy:
          policyid: "50"    ← ポリシーID
      register: wk_result
  • 実行結果:対象のファイアウォールポリシーが削除された。  ※削除後のサービスグループ情報なし
  • ポイント:ポリシーの削除の場合は、policyidでの指定が必要な為、事前にポリシー名からpolicyidを特定しておく必要があります。

 

最後に

  • 「Ansible」の「fortinet.fortios.fortios_firewall_policy」を使用し、「ファイアウォールポリシー」の登録/変更/削除ができたことは良かった。何らかの変更申請の仕組みと連携することで、より 設定変更の自動化 が活用できるようになると考える。
  • 現状 設定情報がベタ書きで使い勝手が悪いので、今後 設定内容をINPUTする仕組みを試みたいと思います。
    また、引続き 他にも様々なNW機器設定を自動化してみようと思います。
×
タイトルとURLをコピーしました