LoginSignup
0
0

KonnectのAudit LogをElasticsearchに飛ばして読む

Last updated at Posted at 2024-05-24

Kong KonnectのAudit Logはちょっとイケてなくて、現状Webhookで外部に飛ばすしか取得する手段がない。
またContent-Typetext/plainドキュメントではapplication/textとなってるが誤り)のみとなっていて、これが原因のためかElasticsearchへの転送が上手く行かなかった。
そのため、ここではKonnectのWebhookから飛んでくるログを受け取るアプリを用意し、以前立てたElasticsearch/Kibanaに転送することでAudit LogがKibanaで読めることを確認する。

なお、ここでの検証内容は個人的な検証であり、出てくるプログラムや手順については誰かしらに保証されるものではない点は注意。

Elasticseachの準備

構築自体はここでは触れない。こちらの記事で作成した環境で試しているので、構築から確認したい人は当該記事を参照するとよい。
今回はアプリからElasticsearchへの認証にAPIキーを利用する。
そのため、ElasticsearchにAPIキーでログインできるようAPIキーを作成する。
まずKubernetesクラスタからElasticsearchのパスワードとホスト名を取得する。

ELASTIC_PW=$(kubectl get secret -o yaml quickstart-es-elastic-user -o jsonpath={.data.elastic} -n efk | base64 -d)
ELASTIC_HOST=$(kubectl get ing -n efk quickstart-es -o jsonpath={.spec.rules[].host})

ElasticsearchにAPIキーをリクエストする。

curl -k -u "elastic:${ELASTIC_PW}" -X POST "https://${ELASTIC_HOST}/_security/api_key" -H "Content-Type: application/json" -d '{
  "name": "my-api-key",
  "role_descriptors": {
    "my_role": {
      "cluster": ["all"],
      "index": [
        {
          "names": ["*"],
          "privileges": ["all"]
        }
      ]
    }
  }
}'

問題なければ以下のようなレスポンスが返ってくる。

{"id":"pUIHo48BfzWzMG4cqZY6","name":"my-api-key","api_key":"WHv3i8rjRCCxxxxxx","encoded":"cFVJSG80OEJmeld6xxxxpSQ0N4UVdWR0ZVSXQ0dw=="}

encodedの値は後で転送アプリケーションに渡すので控えておく。

アプリケーションの用意

作成したものをこちらに用意した。
最初にリポジトリをcloneする。

git clone https://github.com/imurata/konnect2es.git

次にコンテナを作成してイメージレジストリに格納する。

MYREPO=myrepo/konnect2es
docker build --platform linux/amd64 -t $MYREPO .
docker push $MYREPO

次にManifestを修正する。
修正すべき箇所は以下となる。

  • deploy.yaml: コンテナイメージ名をpushしたものに変更
  • ing.yaml: ホスト名を自身のものに変更(2箇所)
  • issuer.yaml: メールアドレスを自身のものに変更
  • secret.yaml: Elasticsearchのホスト名、APIキーを設定(必要に応じてインデックスも変更)

なお、cert-managerを使ってHTTP01 Challangeで証明書を作成しているが、Ingressが不要な人はこのManifestは利用しなくてもOK(ただしHTTPSのみサポートな点に注意)。自己署名証明書を使う人はIssuerの内容を変更する。
また、Ingress ControllerにKong Ingress Controllerを使ってるので、別のものを使ってる人はその点も修正要となる。
変更が終わったらapplyする。

kubectl create ns konnect2es 
kubectl apply -f ./k8s -n konnect2es

問題なく起動すれば以下のようなPodのログが確認できる。

[2024-05-23 23:49:36 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2024-05-23 23:49:36 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
[2024-05-23 23:49:36 +0000] [1] [INFO] Using worker: sync
[2024-05-23 23:49:36 +0000] [7] [INFO] Booting worker with pid: 7

Konnectの設定

Konnectの設定はブラウザからも出来るが、ここではAPIを利用して更新してみる。
最初にAPIを発行するために自身のトークンを取得する。
Konnect上で右上の自分のアカウントをクリックし、Personal Access Tokens->Generate TokenからTokenを取得し環境変数に設定する。

KONNECT_TOKEN=kpat_ER1WQ0xxxx

次にAPIを発行してWebhookのエンドポイントを設定する。
curlコマンドの例はここにあるが、curlだとdata内に環境変数を渡すのが少し大変なので、httpieに含まれるhttpコマンドで代用する。

KONNECT2ES_HOST=$(kubectl get ing -n konnect2es konnect2es-ingress -o jsonpath={.spec.rules[].host})
http PATCH https://global.api.konghq.com/v2/audit-log-webhook \
    Content-Type:application/json \
    Authorization:"Bearer $KONNECT_TOKEN" \
    endpoint="https://${KONNECT2ES_HOST}/webhook" \
    enabled:=true \
    skip_ssl_verification:=true \
    authorization="" \
    log_format="json"

登録時は即ログ転送を行うので、その結果を見て設定が上手く行ったかを確認する。

http GET https://global.api.konghq.com/v2/audit-log-webhook/status \
    Authorization:"Bearer $KONNECT_TOKEN"

問題なければ以下のような出力が得られるはずだ。

{
    "last_attempt_at": "2024-05-24T00:45:59Z",
    "last_response_code": 200,
    "webhook_enabled": true,
    "webhook_status": "active"
}

ログの確認

Kibanaにログインし、左サイドバーのDiscoverからデータビューを作成する。
Index patternはSecretのIndexを変更していなければkonnectとなっているので以下のような感じで作ると問題ない。
20240524094957.png
作成すると以下のような感じでKonnectのAuditのログが確認できる。
20240524095134.png

なお、ログの項目の意味についてはLog Referenceを参考に確認するとよい(足りてない気もするが)。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0