はじめに
以前の記事で、 paloaltonetworks.panos
コレクションを含む Decision Environment (DE) をビルドしました。
せっかくなので、paloaltonetworks.panos
コレクション内の logs
イベントソースプラグインを使って、Palo Alto のファイアウォールと、 EDA な仕組みを作ってみたいと思います。
- 環境
作るもの
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 サーバープロファイルの名前は 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-python
、pan-os-python
、xmltodict
)と、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 上で設定しておきます。
■ 動作確認
準備ができたので、一連の流れを試します。流れは以下の通りです。
- (人の操作) Palo Alto 側で設定変更(今回はオブジェクト追加)してコミット
- Palo Alto から EDA Controller へ HTTPS でログが飛ぶ
- EDA Controller がログを受けて、コミット完了であれば Automation Controller のジョブテンプレートを実行
- Automation Controller からPalo Alto のコンフィグを取得して git push
設定変更して
コミットすると
ジョブが動いて
git push される
デモ動画 pic.twitter.com/mbVkcjBmzO
— よこち (@akira6592) 2023年7月27日
コミット時のみ反応するように 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 なしでやってみました。