AWS Elasticsearch/KibanaにCognitoの認証を組み合わせてみる
Amazon Elasticsearch ServiceのKibanaにAmazon Cognitoを組み合わせると、KibanaにID/PWでのログイン認証を実装できます。ネットワーク的な制限では足りなくて、ID/PWで制限をかけたい場合には使えそうです。
AWSのマネジメントコンソールでAmazon Elasticsearch ServiceとAmazon Cognitoを組み合わせて構築してみました。
ここではID/PWでの認証を試していますが、CognitoはFacebook、Google、Amazonなどでのログインもできるようです。
※以下の手順は2020/06/05時点のものです。Elasticsearchのバージョンは7.4です。
Amazon Cognitoユーザプール作成
AWSのマネジメントコンソールのCognitoの画面を開きます。
「ユーザープールの管理」のボタンを押します。ユーザープールの一覧の画面になりますが、最初はなにもありません。その画面の右上にある「ユーザープールを作成する」のボタンを押します。次のような画面になります。
プール名を適当に入れて、「デフォルトを確認する」を押します。するとデフォルトの内容が表示されます。ユーザープール名はあとでElasticsearch構築時に参照します。
「プールの作成」のボタンを押すと、ユーザープールが作成されます。
次にKibanaと組み合わせられるようにドメイン名を設定します。
左のメニューの「ドメイン名」をクリックし、ドメインの設定画面に移動します。ドメインのプレフィックスを適当に設定して、保存します。
ユーザ作成
作成したユーザープールにユーザを作成します。左のメニューの「ユーザーとグループ」をクリックし、ユーザー作成画面に移動します。
Amazon Cognito IDプール作成
次はIDプールを作成します。
IDプールの画面に移動します。Cognitoトップページからはわかりやすいのですが、ユーザプールの画面からの移動方法がわかりづらいです。左上の「フェデレーティッドアイデンティティ」というリンクです。
IDプールの画面に移動すると通常は作成済みのIDプールの様子が表示されていますが、IDプールがひとつもない状態ではいきなりIDプール作成画面になります。
IDプール名を適当に入れます。IDプール名はあとでElasticsearch構築時に参照します。
Elasticsearch Serviceの公式ドキュメントによると「認証されていない ID に対してアクセスを有効にする」をOnにする必要があるらしいです。
右下の「プールの作成」のボタンを押すと次の画面になります。
「詳細を表示」をクリックすると次の画面になります。
2つのIAMロール作成の確認を求められています。ログインしたユーザとログインしていないユーザに付与するIAMロールのようです。デフォルトのまま右下の「許可」を押します。
こんな画面になりますが、これでIDプール作成完了です。
右上「IDプールの編集」というリンクをクリックすると、作成された2つのIAMロールの名前やその他IDプールの細かい設定を確認できます。
マネジメントコンソールのIAMのページに行き、IAMロールの一覧を見ると、作成された2つのIAMロールを確認できます。2つのIAMロールのうち、ログインしているユーザのためのIAMロールのARNはこのあとElasticsearch構築時に必要になります。
Elasticsearchドメイン作成
AWSのマネジメントコンソールのElasticsearch Serviceの画面を開きます。
「新しいドメインの作成」ボタンを押します。
必要事項を入力していきます。Cognitoを試す目的であればほとんどデフォルトでよいです。インスタンスタイプはデフォルトではなく小さいサイズのもの(t2.smallなど)にしたほうが財布に優しいでしょう。ノード数も1でよいです。
Cognitoを試しやすいようにパブリックアクセスにします。
「Amazon Cognito 認証を有効化」し、さきほど作成したCognitoユーザープールとIDプールを選択します。IAMロール名はデフォルトでこの名前が入っていました。このままでよいようです。
アクセスポリシーは、IDプール作成時に自動で作成されたログインユーザのIAMロールのARNを入力します。IAMのページでARNを確認してコピーペーストします。
ページ一番下の「次へ」を押すと、確認画面になります。確認画面の一番下の確認ボタンを押すとElasticsearchドメインの作成処理が始まります。作成処理が始まると以下のような表示になりますが、ここから実際に使えるまでに10分以上かかります。
「ドメインのステータス」が「読み込み中」になっていますが、これが「アクティブ」になるとElasticsearch作成完了です。
Kibanaにブラウザでアクセスしてみる
「ドメインのステータス」が「アクティブ」になると、エンドポイント、ドメインARNに続いてKibanaのURLが表示されていますので、これにブラウザでアクセスします。
すると、ログイン画面になります。ユーザープールで作成したユーザのユーザー名と仮パスワードでログインできます。
認証が通るとパスワード再設定の画面になり、再設定後は無事Kibanaの画面になります。
エラーのケース その1
Elasticsearchのアクセスポリシーに設定したIAMロールがCognitoで生成されたものとは違っている場合、CognitoのIDプールで得られるIAMロールではKibanaにアクセスできず、ログインは成功しても以下のようなエラー画面になります。
エラーのケース その2
アクセスポリシーを設定して、Cognito認証を無効のままにすると、ブラウザでKibanaにアクセスしてもシンプルに以下の文言のエラー表示になってしまいます。
{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet"}