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を利用すると意外と運用がラクになるのでオススメです。
ぜひ、皆様も試してみてください^^