AWS Elasticsearch/KibanaにCognitoの認証を組み合わせてみる

Amazon Elasticsearch ServiceのKibanaにAmazon Cognitoを組み合わせると、KibanaにID/PWでのログイン認証を実装できます。ネットワーク的な制限では足りなくて、ID/PWで制限をかけたい場合には使えそうです。

AWSのマネジメントコンソールでAmazon Elasticsearch ServiceとAmazon Cognitoを組み合わせて構築してみました。

ここではID/PWでの認証を試していますが、CognitoはFacebookGoogleAmazonなどでのログインもできるようです。

※以下の手順は2020/06/05時点のものです。Elasticsearchのバージョンは7.4です。

Amazon Cognitoユーザプール作成

AWSのマネジメントコンソールのCognitoの画面を開きます。

f:id:suzuki-navi:20200618195302p:plain

「ユーザープールの管理」のボタンを押します。ユーザープールの一覧の画面になりますが、最初はなにもありません。その画面の右上にある「ユーザープールを作成する」のボタンを押します。次のような画面になります。

f:id:suzuki-navi:20200618195325p:plain

プール名を適当に入れて、「デフォルトを確認する」を押します。するとデフォルトの内容が表示されます。ユーザープール名はあとでElasticsearch構築時に参照します。

f:id:suzuki-navi:20200618195340p:plain

「プールの作成」のボタンを押すと、ユーザープールが作成されます。

f:id:suzuki-navi:20200618200705p:plain

次にKibanaと組み合わせられるようにドメイン名を設定します。

左のメニューの「ドメイン名」をクリックし、ドメインの設定画面に移動します。ドメインプレフィックスを適当に設定して、保存します。

f:id:suzuki-navi:20200618201855p:plain

ユーザ作成

作成したユーザープールにユーザを作成します。左のメニューの「ユーザーとグループ」をクリックし、ユーザー作成画面に移動します。

f:id:suzuki-navi:20200618195417p:plain

f:id:suzuki-navi:20200618195433p:plain

Amazon Cognito IDプール作成

次はIDプールを作成します。

IDプールの画面に移動します。Cognitoトップページからはわかりやすいのですが、ユーザプールの画面からの移動方法がわかりづらいです。左上の「フェデレーティッドアイデンティティ」というリンクです。

IDプールの画面に移動すると通常は作成済みのIDプールの様子が表示されていますが、IDプールがひとつもない状態ではいきなりIDプール作成画面になります。

f:id:suzuki-navi:20200618195451p:plain

IDプール名を適当に入れます。IDプール名はあとでElasticsearch構築時に参照します。

Elasticsearch Serviceの公式ドキュメントによると「認証されていない ID に対してアクセスを有効にする」をOnにする必要があるらしいです。

右下の「プールの作成」のボタンを押すと次の画面になります。

f:id:suzuki-navi:20200618195502p:plain

「詳細を表示」をクリックすると次の画面になります。

f:id:suzuki-navi:20200618195518p:plain

2つのIAMロール作成の確認を求められています。ログインしたユーザとログインしていないユーザに付与するIAMロールのようです。デフォルトのまま右下の「許可」を押します。

こんな画面になりますが、これでIDプール作成完了です。

f:id:suzuki-navi:20200618202153p:plain

右上「IDプールの編集」というリンクをクリックすると、作成された2つのIAMロールの名前やその他IDプールの細かい設定を確認できます。

マネジメントコンソールのIAMのページに行き、IAMロールの一覧を見ると、作成された2つのIAMロールを確認できます。2つのIAMロールのうち、ログインしているユーザのためのIAMロールのARNはこのあとElasticsearch構築時に必要になります。

f:id:suzuki-navi:20200618202329p:plain

Elasticsearchドメイン作成

AWSのマネジメントコンソールのElasticsearch Serviceの画面を開きます。

f:id:suzuki-navi:20200618195559p:plain

「新しいドメインの作成」ボタンを押します。

f:id:suzuki-navi:20200618195611p:plain

必要事項を入力していきます。Cognitoを試す目的であればほとんどデフォルトでよいです。インスタンスタイプはデフォルトではなく小さいサイズのもの(t2.smallなど)にしたほうが財布に優しいでしょう。ノード数も1でよいです。

f:id:suzuki-navi:20200618195627p:plain

Cognitoを試しやすいようにパブリックアクセスにします。

f:id:suzuki-navi:20200618195637p:plain

Amazon Cognito 認証を有効化」し、さきほど作成したCognitoユーザープールとIDプールを選択します。IAMロール名はデフォルトでこの名前が入っていました。このままでよいようです。

f:id:suzuki-navi:20200618195650p:plain

アクセスポリシーは、IDプール作成時に自動で作成されたログインユーザのIAMロールのARNを入力します。IAMのページでARNを確認してコピーペーストします。

f:id:suzuki-navi:20200618202439p:plain

ページ一番下の「次へ」を押すと、確認画面になります。確認画面の一番下の確認ボタンを押すとElasticsearchドメインの作成処理が始まります。作成処理が始まると以下のような表示になりますが、ここから実際に使えるまでに10分以上かかります。

f:id:suzuki-navi:20200618200147p:plain

ドメインのステータス」が「読み込み中」になっていますが、これが「アクティブ」になるとElasticsearch作成完了です。

Kibanaにブラウザでアクセスしてみる

ドメインのステータス」が「アクティブ」になると、エンドポイント、ドメインARNに続いてKibanaのURLが表示されていますので、これにブラウザでアクセスします。

すると、ログイン画面になります。ユーザープールで作成したユーザのユーザー名と仮パスワードでログインできます。

f:id:suzuki-navi:20200618200159p:plain

認証が通るとパスワード再設定の画面になり、再設定後は無事Kibanaの画面になります。

f:id:suzuki-navi:20200618200211p:plain

エラーのケース その1

Elasticsearchのアクセスポリシーに設定したIAMロールがCognitoで生成されたものとは違っている場合、CognitoのIDプールで得られるIAMロールではKibanaにアクセスできず、ログインは成功しても以下のようなエラー画面になります。

f:id:suzuki-navi:20200618200225p:plain

エラーのケース その2

アクセスポリシーを設定して、Cognito認証を無効のままにすると、ブラウザでKibanaにアクセスしてもシンプルに以下の文言のエラー表示になってしまいます。

{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet"}

リンク