前回、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の設定
ユーザとグループの作成
まず最初にユーザとグループを作成する。
ユーザに関してはStatus
がActive
になっていればおそらくログインユーザとして利用出来ると思うのだが、私の場合はPassword reset
となっていて、ここの状態が自分でActive
に変更できないように見えていた。
これのせいかOkta認証後、リダイレクトURIではなくOktaのDeveloper Portalに飛んで認証が上手く行かなかったため、別途ユーザを作成している。
ユーザ作成のためにOktaのDeveloper Portalにログインし、Directory
->People
からAdd person
を選択する。
ここでは以下のような感じで作成した。
作成後、グループを作成する。
Directory
->People
からAdd group
を選択する。
グループ名が非常に重要で、Apply OIDC auth mapping to Kong Gatewayに記載がある、<workspace_name>:<role_name>
のルールはこのグループ名に適用される。
そのため、作成するグループ名はdefault:super-admin
となる。
カスタムロールを作成する場合はそのロール名を含めた名前にする。
作成後、グループをクリックして先ほど作成したユーザをAssign people
からグループに追加する。
アプリケーションの作成
次にアプリケーションを作成する。
Applications
->Applications
->Create App Integration
をクリックする。
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
作成後、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
を選択する。
以下のクレームを作成する。
- Name:
groups
- include in token type:
ID Token
Always
- Value type:
Groups
- Filter:
Matches regex
.*
- Include in:
Any scope
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による認証が有効であることが分かる。
Continue
をクリックするとOktaの認証画面に遷移するので先ほど作成したユーザを追加する。
Teams
->Admin
からログインしたアカウントをクリックすると、IDPからRoleを貰っていることも確認できる。
以上より、OktaとKong Managerの連携は問題なく出来ることが確認できた。