KonnectのDev Portalの監査ログを取得する

今までKonnectの監査ログ（Audit Log）の対象範囲にはDev Portalは含まれていなかった。
Konnectの監査ログは取れるのだが、Dev Portalについては誰がいつログインしたかを追う方法がなかったので、開発者向けにも高いセキュリティ要件が求められる場合では使いづらかった。
今回、これがサポートされたので早速確認してみる。
公式ドキュメントとしては[この辺](https://docs.konghq.com/konnect/dev-portal/audit-logging/)になる。

## 検証の前提
以下の環境で確認する。
- Dev Portalは作成済み
- Dev Portalの認証は[OIDCを利用](https://qiita.com/ipppppei/items/7da1349bb50532b94f54)
- 監査ログの受取先は[Beeceptor](https://beeceptor.com/)を利用
- 管理者のPAT(トークン)は入手済み

Beeceptorは無料で利用できるMockサーバを提供するサービスで使い勝手がいいのでテストにはオススメ。

## 動作確認
以下の流れで設定する。

1. 各種設定値を環境変数に設定する
1. KonnectにAudit Logの転送先を登録
2. Dev PortalのWebhookを設定しAudit Logを転送する

今回は最初はAPIで設定し、後でUIの設定も確認する。

## APIによる設定
### 環境変数の設定
今回の検証は後々使い回せるよう、基本的な設定値は環境変数で定義する。
まずトークンを環境変数に設定する。
```sh
KONNECT_TOKEN=kpat_ERWxxxx
```
接続先リージョンを指定する。
```sh
REGION=us
```
ログの転送先を環境変数に設定する。
```sh
SIEM_ENDPOINT=https://xxxx.free.beeceptor.com
```
ログ転送先サーバの認証情報を設定する。今回利用するbeeceptorは無料版だと認証機能がないので、ここではダミーを設定する。
```sh
AUTORIZATION="Bearer dummy"
```
Dev PortalのIDを設定する。
```sh
PORTAL_ID="a0c7d46c-87a5-4ad9-beb4-9445d601c71b"
```
なお、Dev PortalのIDはKonnectのUIから確認できる（APIでも取れるが今回は省略）。
![20241002131819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/16db738b-8bd8-3ff0-7a97-d8a046d8d07c.png)


### Audit Logの転送先を登録

Audit Logの転送先を登録する。
APIのエンドポイントは`/audit-log-destinations`になる。（ちなみにKonnectのAudit Logの登録用APIのエンドポイントは`/audit-log-webhook`となる。同じではないので注意）
またこの設定はKonnect全体の設定であり、特定のエンティティに絡む設定でもないのでリージョンはglobalとなり、`htts://global.api.konghq.com`にリクエストを投げる。
```sh
curl -X POST https://global.api.konghq.com/v2/audit-log-destinations \
       -H "Content-Type: application/json" \
       -H "Authorization: Bearer $KONNECT_TOKEN" \
       -d '{
       "endpoint": "'"$SIEM_ENDPOINT"'",
       "authorization":"'"$AUTORIZATION"'",
       "log_format":"json",
       "name":"Webhook Endpoint for Dev Portal",
       "skip_ssl_verification": false
       }'
```
`skip_ssl_verification`はhttpを使っている時など証明書の検証をスキップしたい場合は`true`にする。

成功すると以下のような感じで登録した内容が返ってくる。
```json
{"id":"7be8f4bb-4690-4e1a-948a-f07472a7xxxx","name":"Webhook Endpoint for Dev Portal","endpoint":"https://xxxx.free.beeceptor.com","log_format":"json","skip_ssl_verification":false,"created_at":"2024-10-12T04:06:36Z"}
```

### Dev PortalのWebhookの設定
Dev PortalのWebhookに先ほど作成した転送先を登録する。
登録するにあたり、さきほど作成した転送先のIDが必要となるので取得する。
```sh
DEST_ID=$(curl -s -X GET https://global.api.konghq.com/v2/audit-log-destinations \
       -H "Content-Type: application/json" \
       -H "Authorization: Bearer $KONNECT_TOKEN" | jq -r ".data[0].id")
```
Dev Portalの`/audit-log-webhook`にリクエストを投げて登録する。

```sh
curl -X PATCH https://${REGION}.api.konghq.com/v2/portals/${PORTAL_ID}/audit-log-webhook \
       -H "Content-Type: application/json" \
       -H "Authorization: Bearer $KONNECT_TOKEN" \
       -d '{
       "audit_log_destination_id": "'"${DEST_ID}"'",
       "enabled": true
       }'
```
コマンドが成功すると以下のような出力が返ってくる。
```json
{"enabled":true,"audit_log_destination_id":"7be8f4bb-4690-4e1a-948a-f07472axxxxx"}
```

これでもう監査ログが取れるはずだ。
Dev Portalにアクセスしてみる。
アクセス後、beeceptorを見てみると以下のように何かがPOSTされたことが確認できる。
![20241002133822.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/4c4707f9-5051-03ba-84e5-98be4d845303.png)

中身を見てみると以下のような感じになっている。
```json
{
  "cef_version": "0",
  "event_class_id": "AUTHENTICATION_TYPE_SSO",
  "event_product": "Dev-Portal",
  "event_ts": "2024-10-12T04:37:42Z",
  "event_vendor": "KongInc",
  "event_version": "1.0",
  "name": "AUTHENTICATION_OUTCOME_SUCCESS",
  "org_id": "bbe3ced9-475c-4b55-8ea6-07018d7cxxxx",
  "portal_id": "a0c7d46c-87a5-4ad9-beb4-9445d601xxxx",
  "principal_id": "39b4d34c-56d1-4b24-8238-6c33d48fxxxx",
  "request": "/api/v2/developer/authenticate/oidc-callback?code\\=0.AS4...(省略)",
  "rt": 1727843862860,
  "severity": 0,
  "src": "224.216.36.247",
  "success": true,
  "trace_id": "15996394345079714525",
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
  "sig": "3Me8V0K4nJ6JNNmL93Kz-dWDBqtotL7_wbFRbZrcJKyDptk-p_hPPDHkTQw6XOY9kmGOOpNZrvv-xxxx"
}
```
どの組織(`org_id`)のどのPortal(`portal_id`)に対し、いつ(`event_ts`)誰が(principal_id)どこから(src)どの認証方法(`event_class_id`)で接続し、結果どうなったか(`name`)が確認できることが分かる。

## Replay Jobの確認
Dev Portalの監査ログでもReplay Jobが利用できる。
Replay Jobは最大7日前までの監査ログを再送する機能であり、Audit Logの転送先サーバがダウンしていた時などに利用すると便利な機能だ。
この機能はPortalの`/audit-log-replay-job`に対してリクエストを送ることで利用できる。
```sh
curl -X PUT https://${REGION}.api.konghq.com/v2/portals/${PORTAL_ID}/audit-log-replay-job \
       -H "Content-Type: application/json" \
       -H "Authorization: Bearer $KONNECT_TOKEN" \
       -d '{
       "start_at": "2024-09-27T20:00:00Z",
       "end_at": "2024-10-01T20:00:00Z"
       }'
```
`start_at`と`end_at`で期間を指定している。

成功すると以下のような出力が返ってくる。
```json
{"start_at":"2024-09-27T20:00:00Z","end_at":"2024-10-01T20:00:00Z","status":"accepted","updated_at":"2024-10-02T04:50:45Z"}
```

なお、期限を適切に設定しないと以下のようなエラーが返ってくる。
```json
{"status":400,"title":"Bad Request","instance":"konnect:trace:7888096506638149934","invalid_parameters":[{"field":"start_at","reason":"must be within the 7 day retention period."},{"field":"end_at","reason":"must be within the 7 day retention period."}]}
```
API発行後、beeceptorを見てみると以下のように過去にアクセスした際の監査ログがまとめてPOSTされることが確認できる。
![20241002135329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/bd0df769-9bc3-9ab4-7ff6-f3427a8597e6.png)
出力を見ると過去のログインのAudit Logが確認できる。
Replay Jobも問題なさそうだ。

## UIによる設定
UIでも監査ログの転送は簡単に設定できる。
最初にWebhookを登録する。
`Organization`->`Audit Log Setup`から`Webhook Destination`のタブの`New Webhook`をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/eaeb99da-8b5c-da7c-1091-8c7be7f93846.png)

APIの時と同じように`Name`、`Endpoint`、`Authorization Header`を指定してSaveする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/e33936a4-3408-6fa1-6421-7767c1754579.png)

次に`Dev Portal`のタブをクリックし、`New Dev Portal Audit Log`をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/0842be13-ee5e-d089-faf1-9772b7101471.png)

Dev PortalとEndpointを紐づける画面になるので、それぞれ選択し`Enabled`を有効にしてSaveする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/c27f2840-bbd4-a76a-b2db-51858d69ff13.png)

以上で設定は終了となる。非常に簡単。
Dev Portalにログインすると、APIで設定した時同様にアクセスが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/f7b10b74-df4e-283b-3a65-cf0e973c991b.png)

また作成したDev Portalの紐づけ設定をクリックすると設定のステータスやReplayが行える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/815b0323-40b4-681e-4471-6809a859892d.png)

## 所感
監査ログはPCI-DSSなどのセキュリティ基準などによっては必須になるため、今回の機能追加によってDev Portalがより幅広い人に使えるようになったと思う。
設定は簡単でログも分かりやすいので、利用する際に躓くこともあまりなさそうだ。