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