0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

既存のEntra IDをKong Managerの認証に使う

Last updated at Posted at 2024-09-10

会社のEntra IDをKong Managerの認証に使ったところ、権限の設定が足りなくてdefaultのWorkspaceすら表示されず困ったことがあった。
20240910165448.png

ここでは、これでハマらないためのEntra IDとKong Managerの連携方法をメモしておく。

前提

ここでは以下を前提として進める。

  • Entra IDが使えてアプリの登録権限がある
  • Kong Gatewayは3.7を利用し、ライセンスも保有済み
  • Kong GatewayはDockerでlocalhostに起動する
  • Kong GatewayはDBありモードで起動する
  • ロールはカスタムロールを使用

連携手順の確認

連携手順としては以下の手順で行う。

  1. Entra IDの設定(アプリの登録、ロールの作成、ロールの紐づけ)
  2. Kong GatewayをRBACなしで起動し、ロールを作成
  3. Kong GatewayをRBACありで起動し、Entra IDと連携

EntraID設定

ここでは以下を行う。

  1. アプリの登録
  2. アプリ内でロールを作成
  3. ロールをログインするユーザに紐づけ

まずアプリを登録する。
登録手順については過去のこちらの記事で詳細手順を書いているためここでは省略する。
上記手順で実施する場合、リダイレクトURIはhttp://localhost:8001/authとなる点に注意。
グループ要求の設定まで終わったら、以下のようにIssuerやクライアントID、クライアントシークレットの値を環境変数に設定する。

export AZURE_ISSUER="https://login.microsoftonline.com/f177c1d6-50cf-49e0-818a-a0585cbaxxxx/v2.0"
export AZURE_TENANT_ID=$(sed "s@.*.com/\(.*\)/v2.0@\1@g" <<< "$AZURE_ISSUER")
export AZURE_CLIENT_ID="28563a31-11d2-49ed-90a7-5e5a5753xxxx"
export AZURE_CLIENT_SECRET="BdB8Q~O8ed3yfGzycyqsLIKoDnKFGta9rcxixxxx"

クライアントシークレットについてはIDではなく値である点に注意。
またリダイレクトに関するURIも合わせて設定しておく。

export AZURE_REDIRECT_URI="http://localhost:8001/auth"
export AZURE_LOGIN_REDIRECT_URI="http://localhost:8002"
export AZURE_LOGOUT_REDIRECT_URI="http://localhost:8002"

ここで設定した環境変数はDocker起動時にOIDCの設定値として利用する。
アプリの登録が終わったら、アプリ内にロールを作成する。
作成したアプリを選択後、アプリロール->アプリロールの作成をクリックする。
20240910170930.png

ロールの作成画面が出てくるので、全ての項目を埋める。
20240910170827.png
値のところが要注意で、公式ドキュメントにも記載があるが、<Kongのworkspace名>:<Kongのrole名>で指定しなければならない。
デフォルトではsuper-adminadminread-onlyが用意されていて、それと紐づけるのであればKong側でロールを用意する必要がないが、ここでは独自のロールを作るものとして進める。
上記のスクリーンショットの例では値にdefault:myroleと指定することでdefaultのWorkspaceにあるmyroleというKongのロールをこのアプリのロールとマッピングさせる設定となる。

次にロールを自身のアカウントに割り当てる。
EntraIDのエンタープライズアプリケーションから作成したアプリケーションを選択する。(アプリの登録からではない点に注意)
20240910153051.png

ユーザーとグループ->ユーザーまたはグループの追加をクリックし、ユーザーを選択して割り当てをクリックする。
ユーザーとグループの画面をリロードすると、作成したロールが表示され、割り当てられていることが分かる。
20240910172137.png

以上でEntraID側の設定は終了となる。
なお、Kong Managerの認証には3.5以降でOIDC Pluginを使って認証しているようだが、OIDC Pluginの説明にあるaccessTokenAcceptedVersion2に変更する設定はなくても動作したのでここでは実施していない。

Kong Gatewayの設定

ここでは以下を行う。

  1. ロールを作成するためにKong GatewayをRBACなしで起動
  2. ロールを作成
  3. Kong GatewayをRBACありで起動

Kong Gatewayの起動(RBACなし)

以下の手順でネットワークの作成とDBの起動・初期化を実施する。

docker network create kong-net
docker run -d --name kong-database \
  --network=kong-net \
  -p 5432:5432 \
  -e "POSTGRES_USER=kong" \
  -e "POSTGRES_DB=kong" \
  -e "POSTGRES_PASSWORD=kongpass" \
  postgres:13
docker run --rm --network=kong-net \
  -e "KONG_DATABASE=postgres" \
  -e "KONG_PG_HOST=kong-database" \
  -e "KONG_PG_PASSWORD=kongpass" \
  -e "KONG_PASSWORD=test" \
  kong/kong-gateway:3.7.1.2 kong migrations bootstrap

ライセンスファイルを環境変数に読み込む。

export KONG_LICENSE_DATA=$(cat license.json)

Kong Gatewayを起動する。

docker run -d --name kong-gateway \
  --network=kong-net \
  -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" \
  -e "KONG_PG_USER=kong" -e "KONG_PG_PASSWORD=kongpass" \
  -e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
  -e "KONG_ADMIN_GUI_URL=http://localhost:8002" \
  -e KONG_LICENSE_DATA \
  -p 8000:8000 \
  -p 8001:8001 \
  -p 8002:8002 \
  kong/kong-gateway:3.7.1.2

ロールの作成

ロールの作成はAPIでも可能だが、ここではKong Managerから行う。
今時点ではRBACを設定していないので、Kong Managerには認証なしでログインできる。
Kong Managerに入り、Teams->RolesでWorkspaceが表示されるのでdefaultを選択する。
(ライセンスがない場合は表示されない)
20240910174011.png
右上のAdd Roleを選択し、NameにEntraIDで作成した値(先程の例だとmyrole)を入力する。
20240910174131.png

下のAdd Permissionでこのロールに許可される操作を追加する。
ここでは動作検証用に以下のように設定した(他はデフォルト値のまま)。

  • Endpoint:*
  • Actions:create,read,update

Add Permission to Roleをクリックし、Createをクリックして作成する。
作成したロールは以下のようになった。
20240910174420.png

ロールの作成が終わったら、Kong Gatewayのみ停止する。

docker stop kong-gateway
docker rm kong-gateway

DBは削除していないため先ほど設定したロールの設定は残っており、後ほどDBに接続して改めて利用する。

Kong Gatewayの起動(RBACあり)

次にKong GatewayをRBACありで起動する。
ここではこちらのドキュメントに従って設定する。
必要なパラメータは以下の3つである。

パラメータ 意味
enforce_rbac RBACの有効化指定(例:on)
admin_gui_auth 認証方法の指定(例:openid-connect
admin_gui_auth_conf 認証方法固有の設定を指定

admin_gui_auth_confはここでは以下のように設定した。

export KONG_ADMIN_GUI_AUTH_CONF=$(echo -n '{
  "issuer": "'"$AZURE_ISSUER"'",
  "issuers_allowed": ["'"https://sts.windows.net/$AZURE_TENANT_ID/"'"],
  "client_id": ["'"$AZURE_CLIENT_ID"'"],
  "client_secret": ["'"$AZURE_CLIENT_SECRET"'"],
  "redirect_uri": ["'"$AZURE_REDIRECT_URI"'"],
  "scopes": ["openid", "email", "offline_access","'"${AZURE_CLIENT_ID}/.default"'"],
  "login_redirect_uri": ["'"$AZURE_LOGIN_REDIRECT_URI"'"],
  "logout_redirect_uri": ["'"$AZURE_LOGOUT_REDIRECT_URI"'"],
  "admin_claim": "email",
  "authenticated_groups_claim": ["roles"]
}')

設定値についていくつか補足する。
issuers_allowedこちらのナレッジベースに従って設定している。設定しないとナレッジベースと同じエラーが出る。
${AZURE_CLIENT_ID}/.defaultをscopeに指定しているのはこちらのドキュメントを参考に指定している。

Kong GatewayをRBACありで起動する。

docker run -d --name kong-gateway \
  --network=kong-net \
  -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" \
  -e "KONG_PG_USER=kong" -e "KONG_PG_PASSWORD=kongpass" \
  -e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
  -e "KONG_ADMIN_GUI_URL=http://localhost:8002" \
  -e KONG_ENFORCE_RBAC=on \
  -e KONG_ADMIN_GUI_AUTH=openid-connect \
  -e KONG_ADMIN_GUI_AUTH_CONF="${KONG_ADMIN_GUI_AUTH_CONF}" \
  -e KONG_LICENSE_DATA \
  -p 8000:8000 \
  -p 8001:8001 \
  -p 8002:8002 \
  kong/kong-gateway:3.7.1.2

localhost:8002にアクセスすると、OIDCの認証が有効になっていることが分かる。
20240910180520.png
クリックすると組織の認証画面に移動する。
20240910180624.png
認証突破後、defaultのWorkspaceが表示されればOK。
20240910180705.png
ロールが上手く当たっていない場合は、冒頭で紹介したようなWorkspaceが何も表示されないような画面になるので、その場合は設定を見直す必要がある。

ロールが上手く当たっているか確認する。
Teams->Adminsからログインしたユーザを選択すると、myroleがアタッチされていることが確認できる。
20240910181211.png

先ほど設定した権限だと、削除は出来ないため作成→削除と行って作成に成功して削除に失敗することを確認する。
適当にServiceを作成したところ、作成に成功した。
20240910180906.png

これを削除してみる。
削除しようとGateway Service actionsを選択するが、Deleteが表示されない。

20240910181019.png

問題なさそうだ。

まとめ

ロールのマッピングを適切にしないとKong ManagerのOIDC認証は上手く動かず、特にRBACがない状態でカスタムロールとマッピングさせようと思うと、一度RBACなしでロールを作らないと上手く行かない点はハマりそうなので利用時は気をつけると良さそう。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?