KibanaをGoogle認証でシングルサインオンしてみた!#Elastic #Elasticsearch #ElasticCloud #Kibana #GoogleWorkspace

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
今回は前回の投稿の続編として、Googleアカウントを使ったKibana認証を紹介します。
本記事は以下の公式ドキュメント(英語)の内容をもとに「やってみた」的な内容になっています。
【参考】
・Set up OpenID Connect with Azure, Google, or Okta
Google認証よるシングルサインオン(SSO)とは
Kibanaへのログインにはいくつかのユーザ認証方式が用意されています。
その1つにGoogle認証 (OpenID Connect方式) を使った方式があります。

Elasticsearch内にKibanaログイン用のユーザを作成することなく
契約しているGoogle Workspaceのアカウントを利用することが可能です。
必要なサブスクリプション
- 今回利用しているGoogle認証機能を使うにはプラチナ以上(有償)が必要になります。
| 機能 | オープンソース | ベーシック | ゴールド | プラチナ | エンタープライズ |
|---|---|---|---|---|---|
| Single sign-on (SAML, OpenID Connect, Kerberos) | - | - | - | ● | ● |
【参考】
・Elastic Stack subscriptions
利用環境
| 項目 | 内容 |
|---|---|
| Elastic Cloud | 7.12.1 |
実現したかったこと
- ロール機能を使って、自分の操作したGoogle Driveのログしか検索できないようにしています。
- user.name.keywordフィールドに_user.usernameを指定することでKibanaにログインしたユーザを代入しています。
- Googleアカウントを使ったSSOにすることで都度ユーザを作成することなく上記制御を実現しました。

【補足】
・ 前回のKibana SpaceとField and Document Level Securityに対し、さらにGoogle認証を組み合わせています。
実施手順
- 以下の設定手順で実施します。
- OAuthクライアントIDの作成
- キーストアへのクライアントシークレット追加
- Elasticsearchの設定
- Kibanaの設定
- ロールマッピングの設定
- Kibanaへのログイン確認
1. OAuthクライアントIDの作成
- ログインに利用するGoogle Workspaceの管理者アカウントでGCPにログインします。
- 新規プロジェクトを作成します。
- [APIとサービス] > [OAuth同意画面]を開きます。
- User Typeを内部チェックします。
- アプリ名とユーザサポートメールを入力(好きなもので)して同意します。
- [APIとサービス] > [認証情報]を開きます。
- [認証情報を作成]でOAuthクライアントIDをクリックします。

- ❶アプリケーションの種類をウェブアプリケーションとします。
- ❷名前は好きな名前を入力します。(今回はec-oauth2とします)

- ❸承認済みのリダイレクトURIはKIBANA_ENDPOINT_URL/api/security/oidc/callbackとし、❹[作成]します。

- 払い出されたクライアントIDとクライアントシークレットをコピーしておきます。(あとで利用します)

【補足】
・ KIBANA_ENDPOINT_URLは、Elastic Cloud管理コンソールのKibanaのCopy endpointで取得できます。

2. キーストアへのクライアントシークレット追加
- 前の手順で生成したクライアントシークレットを安全に利用するため、Elasticsearch keystoreを利用します。
- まず、Elastic Cloud管理コンソールにログインします。
- 利用するDeploymentを選択後、[Security] > [Elasticsearch keystore]の❶Add settingsをクリックします。

- ❷Setting nameにxpack.security.authc.realms.oidc.oidc1.rp.client_secretとします。
(xpack.security.authc.realms.oidc.[oidc-realm-name].rp.client_secretという形式で設定します) - TypeはSingle stringのままとし、❸Secretにクライアントシークレットを貼り付けます。
- ❹Saveで設定を保存します。

【補足】
・ 本投稿では、Setting nameで指定したoidc-realm-nameをoidc1としています。
3. Elasticsearchの設定
- 次は、OIDCレルムを使用してElasticsearchを構成します。
- Elastic Cloud管理コンソールで[Edit] > [Elasticsearch]のUser settingsでEdit elasticsearch.ymlを開きます。

- 以下のコードをelasticsearch.ymlとして貼り付けます。
xpack:
security:
authc:
realms:
oidc:
oidc1:
order: 2
rp.client_id: "クライアントID"
rp.response_type: "code"
rp.requested_scopes: ["openid", "email"]
rp.redirect_uri: "KIBANA_ENDPOINT_URL/api/security/v1/oidc"
op.issuer: "https://accounts.google.com"
op.authorization_endpoint: "https://accounts.google.com/o/oauth2/v2/auth"
op.token_endpoint: "https://oauth2.googleapis.com/token"
op.userinfo_endpoint: "https://openidconnect.googleapis.com/v1/userinfo"
op.jwkset_path: "https://www.googleapis.com/oauth2/v3/certs"
claims.principal: email
claim_patterns.principal: "^([^@]+)@ドメイン名\.TLD$"
【補足】
・ oidc1という名前でOICDレルムを設定しています。
・ rp.client_idには、手順1でコピーしたクライアントIDを利用します。
・ rp.redirect_uriのKIBANA_ENDPOINT_URLには手順2で利用したURLと同じものを利用します。
・ claim_patterns.principalには、Google Workspaceで利用しているドメインを指定します。
・ example.comであれば、"^([^@]+)@example\.com$"となります。
4. Kibanaの設定
- 次は、OIDCレルムを使用してKibanaを構成します。
- [Elasticsearch]の下部にある[Kibana]のUser settingsでEdit kibana.ymlを開きます。

- 以下のコードをkibana.ymlとして貼り付けます。
xpack.security.authc.providers:
oidc.oidc1:
order: 0
realm: oidc1
description: "Log in with Google"
icon: "https://developers.google.com/identity/images/g-logo.png"
basic.basic1:
order: 1
【補足】
・ oidc1という名前でOICDレルムを設定しています。
・ descriptionには、ログイン画面で表示する文章を設定しています。
・ iconには、ログイン画面で表示するGoogleのアイコン画像を指定しています。
- 画面最下部にあるSaveボタンをクリックして保存します。(Deploymentで設定の読み込みが走りします)
5. ロールマッピングの設定
- Google認証でログインした場合にユーザに割り当てられるロールをロールマッピングで設定します。
- 管理者ユーザでKibanaにログインします。
- [Management] > Dev Toolsをクリックします。
- 以下のコードを貼り付けて、oidc_kibanaという名前のロールマッピングを登録します。
POST /_xpack/security/role_mapping/oidc_kibana
{
"enabled": true,
"roles": [ "self-audit" ],<br />
"rules" : {
"all" : [
{
"field" : {
"realm.name" : "oidc1"
}
},
{
"field" : {
"username" : [
"*"
]
}
}
]
},
"metadata": { "version": 1 }
}
- [Management] > [Stack Management]をクリックします。
- [Security] > Role Mappingsで以下の設定が追加されていればOKです。

【補足】
・ 前回の投稿で作成したself-auditというロールを割り当てます。
・ usernameフィールドに含まれる値を全てとすることで全Goolgeアカウントを対象としています。
6. Kibanaへのログイン確認
- KibanaのログインURLにアクセスします。
- Log in with Googleをクリックします。

- ログインに利用するGoogleアカウントを指定します。

- ログインできれば成功です。(画面右上でログインユーザを確認することができます)

まとめ
さて、いかがでしたでしょうか?
意外とサクッと実装できるという印象ではないでしょうか。
今回は前回の続きで自己監査というテーマでGoogle認証によるSSOを実現しました。
管理者ユーザのアカウントだけでもSSOを利用すると意外と運用がラクになるのでオススメです。
ぜひ、皆様も試してみてください^^
