0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OktaをKong Managerの認証に使う

Posted at

前回、EntraIDをKong Managerの認証に使ったが、今回はKong Managerの認証をOktaでやってみたいと思う。

前提

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

  • OktaのDeveloper Portalが使えてアプリの登録権限がある
  • Kong Gatewayは3.7を利用し、ライセンスも保有済み
  • Kong GatewayはDockerでlocalhostに起動する
  • Kong GatewayはDBありモードで起動する
  • ロールは既存のsuper-adminを使用
  • ログインユーザは新規に作成する

今回はロールはカスタムではなく最初からあるロールであるsuper-adminを使用する。
もしカスタムロールを最初から割り当てたい人は前回と同じように一度RBACなしで起動してカスタムロールを作成後にKong GatewayをRBACありで起動しなおせば上手く行くと思う。
ログインユーザは後述の制約により上手く行かなかった(ログインするとリダイレクトURIではなくDeveloper Portalに飛んでしまう)ため、新規に作成している。

連携手順の確認

Oktaの設定

ユーザとグループの作成

まず最初にユーザとグループを作成する。
ユーザに関してはStatusActiveになっていればおそらくログインユーザとして利用出来ると思うのだが、私の場合はPassword resetとなっていて、ここの状態が自分でActiveに変更できないように見えていた。
これのせいかOkta認証後、リダイレクトURIではなくOktaのDeveloper Portalに飛んで認証が上手く行かなかったため、別途ユーザを作成している。
ユーザ作成のためにOktaのDeveloper Portalにログインし、Directory->PeopleからAdd personを選択する。
ここでは以下のような感じで作成した。
20240913145028.png

作成後、グループを作成する。
Directory->PeopleからAdd groupを選択する。
グループ名が非常に重要で、Apply OIDC auth mapping to Kong Gatewayに記載がある、<workspace_name>:<role_name>のルールはこのグループ名に適用される。
そのため、作成するグループ名はdefault:super-adminとなる。
20240913145259.png

カスタムロールを作成する場合はそのロール名を含めた名前にする。
作成後、グループをクリックして先ほど作成したユーザをAssign peopleからグループに追加する。

アプリケーションの作成

次にアプリケーションを作成する。
Applications->Applications->Create App Integrationをクリックする。
20240912115751.png

Create a new app integrationの画面では以下を選択する。

  • Sign-in method:OIDC
  • Application type: Web Application

次にアプリの設定になるので、以下のように設定する。

  • App integration name: kong-ee-auth
  • Sign-in redirect URIs: http://localhost:8001/auth
  • Sign-out redirect URIs: http://localhost:8002
  • Controlled access: Limit access to selected groups
  • Selected group(s): default:super-admin

20240913145805.png

作成後、Client IDとClient Secretが表示されるのでコピーして環境変数に設定する。

export OKTA_CLIENT_ID="0oajl9s2w4hTWTM2A5d7"
export OKTA_CLIENT_SECRET="WZ9v8A5pQKBqOTPfZTR1X9bou5d2FonuTqow5VWac6gB8Y2BjnT8qHCcJZjM0hZ0"

こちらの環境変数はKong Gateway起動時に利用する。
なお、Client ID、Client SecretについてはEntraIDと違って後からでも取得できる。

Issuerの設定

IssuerはSecurity->APIから確認・追加が出来る。
元々defaultという名前で用意されているものがあるので、今回はこちらを使う。
別で用意したい人はAdd Authorization Serverから追加すると良い。その際はAccess Policiesの設定をお忘れなく。

Issuer URIを環境変数に設定する。

export OKTA_ISSUER="https://dev-5508xxxx.okta.com/oauth2/default"

次にクレームを作成する。
Authorization Serversのdefaultをクリックし、ClaimsタブからAdd Claimを選択する。

20240913150441.png

以下のクレームを作成する。

  • Name: groups
  • include in token type: ID Token Always
  • Value type: Groups
  • Filter: Matches regex .*
  • Include in: Any scope

20240913150532.png

FilterやScopeは要件によっては変更してもらってOK。
設定後、期待するTokenになっているか確認する。
Claimsタブの2つ隣のToken Previewタブをクリックし、Request Propertiesを以下のように設定する。

  • OAuth/OIDC client: kong-ee-auth (作成したアプリ)
  • Grant type: Authorization Code
  • User: 作成したユーザ
  • Scopes: openid

設定後、Preview TokenをクリックするとPayloadが確認できる。
この中に以下のようにgroupsがあってdefault:super-adminが確認できればOK。

:(省略)
  "auth_time": 1000,
  "at_hash": "preview_at_hash",
  "groups": [
    "Everyone",
    "default:super-admin"
  ]
}

Kong Gatewayの起動

以下の手順でネットワークの作成と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)

リダイレクトに関するURIを環境変数で定義する。

export OKTA_REDIRECT_URI="http://localhost:8001/auth"
export OKTA_LOGIN_REDIRECT_URI="http://localhost:8002"
export OKTA_LOGOUT_REDIRECT_URI="http://localhost:8002"

admin_gui_auth_confを環境変数で定義する。

export KONG_ADMIN_GUI_AUTH_CONF=$(echo -n '{
  "issuer": "'"$OKTA_ISSUER"'",
  "client_id": ["'"$OKTA_CLIENT_ID"'"],
  "client_secret": ["'"$OKTA_CLIENT_SECRET"'"],
  "redirect_uri": ["'"$OKTA_REDIRECT_URI"'"],
  "scopes": ["openid", "email", "offline_access"],
  "login_redirect_uri": ["'"$OKTA_LOGIN_REDIRECT_URI"'"],
  "logout_redirect_uri": ["'"$OKTA_LOGOUT_REDIRECT_URI"'"],
  "admin_claim": "email",
  "authenticated_groups_claim": ["groups"]
}')

設定内容についてはEntra IDとの連携とほぼ同じなので説明に関しては省略する。

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_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による認証が有効であることが分かる。
20240913152311.png

ContinueをクリックするとOktaの認証画面に遷移するので先ほど作成したユーザを追加する。
20240913152411.png

認証後、Kong ManagerのUIが見れるはずだ。
20240913152537.png

Teams->Adminからログインしたアカウントをクリックすると、IDPからRoleを貰っていることも確認できる。
20240913152631.png

以上より、OktaとKong Managerの連携は問題なく出来ることが確認できた。

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?