fbpx

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方式) を使った方式があります。

image.png

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認証を組み合わせています。

実施手順


  • 以下の設定手順で実施します。
  1. OAuthクライアントIDの作成
  2. キーストアへのクライアントシークレット追加
  3. Elasticsearchの設定
  4. Kibanaの設定
  5. ロールマッピングの設定
  6. Kibanaへのログイン確認

1. OAuthクライアントIDの作成

  • ログインに利用するGoogle Workspaceの管理者アカウントでGCPにログインします。
  • 新規プロジェクトを作成します。
  • [APIとサービス] > [OAuth同意画面]を開きます。
  • User Type内部チェックします。
  • アプリ名ユーザサポートメールを入力(好きなもので)して同意します。
  • [APIとサービス] > [認証情報]を開きます。
  • [認証情報を作成]でOAuthクライアントIDをクリックします。

image.png

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

image.png

  • 承認済みのリダイレクトURIKIBANA_ENDPOINT_URL/api/security/oidc/callbackとし、❹[作成]します。

image.png

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

image.png

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

image.png

2. キーストアへのクライアントシークレット追加

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

image.png

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

image.png

【補足】
・ 本投稿では、Setting nameで指定したoidc-realm-nameoidc1としています。

3. Elasticsearchの設定

  • 次は、OIDCレルムを使用してElasticsearchを構成します。
  • Elastic Cloud管理コンソールで[Edit] > [Elasticsearch]のUser settingsEdit elasticsearch.ymlを開きます。

image.png

  • 以下のコードを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_uriKIBANA_ENDPOINT_URLには手順2で利用したURLと同じものを利用します。
claim_patterns.principalには、Google Workspaceで利用しているドメインを指定します。
example.comであれば、"^([^@]+)@example\.com$"となります。

4. Kibanaの設定

  • 次は、OIDCレルムを使用してKibanaを構成します。
  • [Elasticsearch]の下部にある[Kibana]のUser settingsEdit kibana.ymlを開きます。

image.png

  • 以下のコードを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です。

image.png

【補足】
・ 前回の投稿で作成したself-auditというロールを割り当てます。
・ usernameフィールドに含まれる値を全てとすることで全Goolgeアカウントを対象としています。

6. Kibanaへのログイン確認

  • KibanaのログインURLにアクセスします。
  • Log in with Googleをクリックします。

image.png

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

image.png

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

image.png

まとめ

さて、いかがでしたでしょうか?

意外とサクッと実装できるという印象ではないでしょうか。
今回は前回の続きで自己監査というテーマでGoogle認証によるSSOを実現しました。

管理者ユーザのアカウントだけでもSSOを利用すると意外と運用がラクになるのでオススメです。
ぜひ、皆様も試してみてください^^

Author

ログ分析基盤のアーキテクチャデザインやクラウドにおけるセキュリティ実装方式を研究するElasticエバンジェリスト。
国内エンジニアの貴重なリソースを効率良く活用できるよう、技術ナレッジを惜しみなく発信するよう心がけている。

日比野恒の記事一覧

新規CTA