てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible/EDA] ansible.eda.webhook イベントソースプラグインでトークンによる認証をかける

はじめに

これまで何度かansible.eda.webhook イベントソースプラグインを使って、Webhook 経由で何かを動かすということを試してみました。

このイベントソースプラグインは認証機能を持たせることもできるので、トークンによる認証を試してみました。

  • 検証環境
    • ansible.eda コレクション 1.4.2
    • EDA Controller 1.0.0
      • バージョン番号は rpm のファイル名から類推
      • AAP 2.4 のインストーラーで構築したもの

Rulebook

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

ポイントは token オプションです。

---
- name: Hello Events
  hosts: all

  sources:
    - ansible.eda.webhook:
        host: 0.0.0.0
        port: 5000
        token: 72232ecb-8b5f-15ed-5d28-597840a98608   # ポイント

  rules:
    - name: Say Hello
      condition: event.payload is defined
      action:
        debug:
          msg: "{{ event }}"

ここでは分かりやすさのためにべた書きしていますが、本来は変数化したほうがよいと思います。

リクエストおためし

EDA Controller で上記 Rulebook を利用したアクティベーションを作成し、さっそくリクエストを試します。

認証 OK 例

リクエスト:

curl -X POST http://192.168.1.144:5000/endpoint \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 72232ecb-8b5f-15ed-5d28-597840a98608' \
  -d '{"message": "sakana"}'

レスポンス:

endpoint

ansible.eda.webhook の仕様として、エンドポイントの文字列がレスポンスの body になります。

認証 NG 例

せっかくなので、認証が正常でないパターンもためします。

なお、HTTP ステータスコードはすべて 401 で、アクティベーションのログとしては以下のようなログになります。

2023-08-08 12:31:05,530 - aiohttp.access - INFO - 10.0.2.100 [08/Aug/2023:12:31:05 +0000] "POST /endpoint HTTP/1.1" 401 188 "-" "curl/7.88.1"

Authorization ヘッダーフィールドなし

リクエスト:

curl -X POST http://192.168.1.144:5000/endpoint \
  -H 'Content-Type: application/json' \
  -d '{"message": "sakana"}'

レスポンス:

401: Missing authorization token

トークン間違い

リクエスト:

curl -X POST http://192.168.1.144:5000/endpoint \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer xxinvalidxx' \
  -d '{"message": "sakana"}'

レスポンス:

Invalid authorization token

Basic 認証(未サポート)

リクエスト:

curl -X POST http://192.168.1.144:5000/endpoint \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Basic hogehoge' \
  -d '{"message": "sakana"}'

レスポンス:

Only Bearer type is accepted

おわりに

ansible.eda.webhook イベントソースプラグインを、トークンによる認証とあわせて使ってみました。認証なしの Webhook を許可させたくないときには便利そうです。

今回の token に指定するような値を管理するための、認証情報の機能を作るのはどうかという issue がありました。

github.com