てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible/EDA] Palo Alto ファイアウォールの設定変更したらコンフィグを git にバックアップする仕組みを作ってみた

はじめに

以前の記事で、 paloaltonetworks.panos コレクションを含む Decision Environment (DE) をビルドしました。

せっかくなので、paloaltonetworks.panos コレクション内の logs イベントソースプラグインを使って、Palo Alto のファイアウォールと、 EDA な仕組みを作ってみたいと思います。

  • 環境
    • paloaltonetworks.panos コレクション 2.17.3
    • ansible-builder 3.0.0
    • EDA Controller 1.0.0
      • バージョン番号は rpm のファイル名から類推
      • AAP 2.4 のインストーラーで構築したもの
    • ansible-rulebook 1.0.0
    • PA-VM 10.1.9-h3

作るもの

Palo Alto 側で設定変更してコミットすると、EDA Controller へ HTTPS でログが飛び、Automation Controller のジョブテンプレートを実行され、Palo Alto のコンフィグを取得して git push するものです。

全体の流れ

いったん、paloaltonetworks.panos.logs ではなくて ansible.eda.webhook でもできそうとか、EDA を使わなくてもできそうとか、もっと他のいいやり方がある、といった考えは横においておきます。EDA を多少触ってみないとなんとも言えないなという感覚があって、ここでは手段を目的化します。また、全体的にとりあえず動くものレベルなので、実運用レベルではないことをご了承ください。

■ Palo Alto 側の設定

はじめに、ログの発生源である Palo Alto 側の設定をします。

HTTP サーバープロファイルの作成

Palo Alto から HTTP でログを出力させるために、まず HTTP サーバープロファイル を設定します。

画面上部の DEVICE タブをクリックし、左メニューの サーバープロファイル 配下の HTTP をクリックします。HTTP サーバープロファイル一覧画面で (+) 追加 ボタンをクリックします。

HTTP サーバープロファイル作成画面が開きます。

HTTP サーバープロファイル作成画面

HTTP サーバープロファイルの名前は eda-profile とします。

サーバー タブで、今回は以下の内容で追加します。

項目 今回の値 補足
名前 eda-server
アドレス (EDA Contorller のアドレス)
プロトコル HTTPS
ポート 443 Rulebook 上は 5000 で待ち受けるが、今回の環境ではポート変換の都合上、Palo Alto から見ると 443
TLS バージョン 1.2
証明書プロファイル None
HTTP 方式 POST
ユーザー名 (未指定)
パスワード abc 実際には不要だが必須のため適当な値

なお、サーバー接続のテスト を試すと GET でリクエストしていたため、設定内容を完全に反映したリクエストにならないようです。

続いて、ペイロードの形式 タブをクリックします。今回は、コンフィグのコミット完了のログを取れるログタイプ システム をクリックします。ペイロードの設定画面が表示されます。

ペイロード設定

この手の設定は初めてでしたが、URIペイロードをかなり柔軟に設定できるようです。

(このあたりで EDA なしでも事足りるのではないかと思いが強くなりましたが、続けます)

今回は、以下のように設定します。

項目 今回の値 補足
名前 eda-system-payload
URI の形式 /endpoint 何か指定しないと 405 Method Not Allowed になる(/GET のみ受け付けのため)
HTTP ヘッダー ヘッダー: Content-Type、値: application/json
ペイロード *1 形式が誤っていると 400 Bad Request になる

*1 ペイロード:

{
  "device_name": "$device_name",
  "receive_time": "$receive_time",
  "opaque": "$opaque"
} 

このペイロードには、Rulebook の condition や、ジョブテンプレートで必要な値を中心に詰め込みます。

(おまけ)個人的はまりポイント

当初、ペイロードの設定をしなくてもデフォルトでいろいろ送ってくれるものだと思って苦戦しました。試した限り明示的なペイロードの設定が必要でした。

ほか、ペイロード内の "opaque" の値として "$opaque" のようにダブルクォートで囲いました。ログタイプがシステムではなく設定の場合は $opacue のように囲わない形式が正しかったです。出力されるログによって $opacue 自身にクォーテーションが入ったり入らなかったりするのでしょうか・・・。

ログ設定

先ほどはプロファイルを作成しただけなので、今度はそれをどう割り当てるかという設定です。

左メニューから ログ設定 をクリックします。設定 セクションの (+) 追加 ボタンをクリックします。

ログタイプ「設定」の設定

ログ設定画面が開きます。

ログ設定

今回は、以下のように設定します。

項目 今回の値 補足
名前 eda-log-system
フィルタ ALL Logs デフォルトのまま
HTTP eda-profile (+) 追加 で先ほど作成した HTTP サーバープロファイルを選択

フィルタも設定できるということは、 Rulebook の condition がシンプルに、もっといえば Rulebook 自体が不要なレベルにもできるのではと思いましたが、今回はなるべく EDA / Rulebook 側の機能を使うことにして、フィルタは設定しません。

ここまでで Palo Alto 側の設定ができました。コミットを忘れずにしておきます。

EDA 側の設定

今度は EDA 側の設定です。

Rulebook の作成

以下のような Rulebook を利用します。

---
- name: Pan Config Backup
  hosts: localhost

  sources:
    - name: Listen logs via HTTP server Profile
      paloaltonetworks.panos.logs:
        host: 0.0.0.0
        port: 5000

  rules:
    - name: Run Job Template
      condition: event.payload.opaque is match("Commit job succeeded")
      action:
        run_job_template:
          name: paloalto_config_backup    # 実行したいジョブテンプレート名
          organization: Default

イベントソースプラグインには paloaltonetworks.panos.logs を利用しています。

アクションに対する条件は、ログメッセージに Commit job succeeded が含まれていたら、としています。

アクションは、run_job_template を利用して、Automation Controller の コンフィグをバックアップするジョブテンプレートを起動します。

EDA Controller 側の設定

先ほどの Rulebook を利用したアクティベーションを作成しておきます。

ほか、EDA Controller には、Automation Controller との連携の設定をあらかじめしておきます。

参考 https://tekunabe.hatenablog.jp/entry/2023/06/29/aap24-eda-ac

■ Automation Controller 側の設定

Playbook の作成

ジョブテンプレートで実行する Playbook は以下のとおりです。

---
- name: Config Backup
  hosts: pan
  gather_facts: false

  tasks:
    # コンフィグバックアップリポジトリの clone
    - name: Execute git clone
      ansible.builtin.git:
        repo: git@example.com/pan-config-backup.git
        dest: pan-config-backup

    # Palo Alto から コンフィグエクスポート
    - name: Export a configuration
      paloaltonetworks.panos.panos_export:
        provider: "{{ provider }}"
        category: configuration
        filename: pan-config-backup/export.xml  # ほぼ改行無し
    
    # XML のフォーマット(改行)
    - name: Pretty prrint XML
      ansible.builtin.xml:
        xmlstring: "{{ lookup('file', 'pan-config-backup/export.xml') }}"
        pretty_print: true
      register: res_xml

    # フォーマット済み XML の書き出し
    - name: Write a pretty XML 
      ansible.builtin.copy:
        content: "{{ res_xml.xmlstring }}"
        dest: pan-config-backup/export.xml

    # git commit
    - name: Execute git commit
      ansible.builtin.command:
        cmd: "{{ item }}"
        chdir: pan-config-backup
      loop:
        - git add .
        - git commit -m "{{ ansible_eda.event.payload.opaque }}"
        - git push

EE には paloaltonetworks.panos コレクション(と、依存Python パッケージ pan-pythonpan-os-pythonxmltodict )と、ansible.builtin.xml モジュールが使う Python パッケージ lxml を入れておきます。

コミットメッセージには、EDA Controller から渡ってきた変数 ansible_eda の中にある、ログの内容(コメント的なもの、元をたどると Palo Alto 側の HTTP サーバープロファイルのペイロードに仕込んだ opaque)を流用するようにしています。Palo Alto 側のコミットした日時やユーザー名が含まれます。

Automation Controller 側の設定

先ほど作成した Playbook の実行するジョブテンプレートの名前を paloalto_config_backup とします(Rulebook のアクションで指定した名前と同じ)。

EDA Controller から起動する(つまりAPI)ときのイベントの情報は ansible_eda という変数名の追加変数で渡ってきます。ジョブテンプレートでAPI 経由で追加変数を受け付けるように、追加変数の「起動プロンプト」を有効にしておきます。

忘れずに起動プロンプトを有効にする

ほか、インベントリや認証情報の設定も Automation Controller 上で設定しておきます。

■ 動作確認

準備ができたので、一連の流れを試します。流れは以下の通りです。

  1. (人の操作) Palo Alto 側で設定変更(今回はオブジェクト追加)してコミット
  2. Palo Alto から EDA Controller へ HTTPS でログが飛ぶ
  3. EDA Controller がログを受けて、コミット完了であれば Automation Controller のジョブテンプレートを実行
  4. Automation Controller からPalo Alto のコンフィグを取得して git push

設定変更して

設定変更

コミットすると

コミット

ジョブが動いて

バックアップジョブの実行

git push される

git push

コミット時のみ反応するように Rulebook で condition を指定しているので、ほかのログの時には特にアクションは発生しません。

やり残し・・

condition の条件がマッチしなかったときの以下の警告が表示されましたが、解決できませんでした。Rulebook 書き方や paloaltonetworks.panos.logs イベントソースプラグインの使い方がまだまだです。

2023-07-26 08:29:31,995 - <run_path> - WARNING - KeyError occurred while processing the payload

あとは、ログに含まれるホスト名を利用してインベントリを制限かけたり、git commit のメッセージをもう少し気を利かせたり・・。

おわりに

Palo Alto の設定変更をすると EDA 経由で、コンフィグを git push する仕組みを試してみました。

はじめにでも述べましたが、今回は EDA という手段を使うことを目的としました。軽く試して、振り返ってみると EDA を使わなくてできそうだなという思いと、じゃあどういう使い分けがいいのだろうという思いが湧きました。

今回の仕組みに限って言えば、コンフィグを変更したらバックアップではなくて、別の構成管理的なものを変更したら(履歴も管理される)コンフィグを変更する、というアプローチもあると思います。

参考

Palo Alto の HTTP でのログ転送の設定は以下のページを参考にさせていただきました。

2023/08/02 追記

同じことを EDA Controller なしでやってみました。

tekunabe.hatenablog.jp