KibanaにCognito認証を追加する

### 前提条件
※Amazon Elasticsearch Serviceの話です。
Elasticsearch バージョン 5.1 以降
今回はバージョン 6.3

## 概要
Amazon Elasticsearch ServiceでIP アドレスで制御だけでなくCognitoと連携することでユーザー認証・認可ができるのでセキュリティ対策やトラッキングなどに使えます。
今回は特に説明しませんがCognitoユーザープールでのSAMLやOpenID連携なども可能なようです。

## Amazon Cognito のセットアップ
### ユーザープールの作成
AWSのマネジメントコンソールからAmazon Cognitoを検索します。
<img width="926" alt="スクリーンショット 2019-01-23 15.19.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/4c25b04d-8dfb-dc12-215e-72a7eae82e66.png">
[ユーザープールの管理]を選択します。
<img width="721" alt="スクリーンショット 2019-01-23 15.11.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/14c55b1e-840e-9a2a-b9a3-29b09ac307bf.png">
右上の[ユーザープールを作成する]ボタンを選択します。


ユーザープールに名前を付けます。
<img width="1204" alt="スクリーンショット 2019-01-23 15.12.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/92d76c08-c990-af0a-63ba-ea9aec5ae773.png">
デフォルトを確認するを選択し、[プールの作成] を選択します。

### ドメイン作成
ユーザープールを選択して詳細を表示し、[ドメイン名] を選択します。
ドメインのプレフィックスを適当に決めます。一意にする必要があります。
<img width="1434" alt="スクリーンショット 2019-01-23 15.46.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/93150266-4ffc-ca0b-1a5a-7891edfeaff8.png">
[変更の保存]を選択します。

### IDプール作成
左上のフェデレーティッドアイデンティティを選択します。
IDプール名を適当に入力し、認証されていないIDに対してアクセスを有効にするにチェックを入れ、作成します。
<img width="1422" alt="スクリーンショット 2019-01-23 16.02.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/7d2aff43-e7b2-4d42-feef-4ed4d1739e71.png">

IDプールで利用する IAM ロール作成画面に遷移するので[許可]を選択して作成します。
<img width="1423" alt="スクリーンショット 2019-01-23 16.03.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/07022d46-c3d5-b707-cc26-fceacd845deb.png">
- Cognito_<identity pool name>Auth_Role: ログインユーザーが利用する IAM ロール
- Cognito_<identity pool name>UnAuth_Role: 未ログインユーザーが利用する IAM ロール
がそれぞれ作成されます。
## Kibana認証の有効化設定
Elasticsearchドメインの画面から、[クラスタの設定]を選択します。
<img width="1178" alt="スクリーンショット 2019-01-23 16.40.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/61e96b88-67f6-6ca9-dc09-36b5c6a33bf9.png">
認証用にAmazon Cognitoを有効化のチェックボックスをオンにし、作成したCognitoユーザープールとIDプールをそれぞれ選択し、[送信]を選択します。

Kibana認証
<img width="1190" alt="スクリーンショット 2019-01-23 16.41.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/c92cabd5-3a78-8184-9677-967efe7dec18.png">
ドメインのステータスが処理中になるので、終了まで待ちます。
10分程度かかるかと思います。


## ユーザーとグループを作成する
### ユーザーの作成
Amazon Cognito コンソールへ移動し、[ユーザープールの管理] を選択します。kibana_access を選択します。ナビゲーションペインで、[ユーザーとグループ] を選択します。次に、[ユーザーの作成] を選択します。
<img width="1384" alt="スクリーンショット 2019-01-23 18.32.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/af0179c1-1f86-2c3c-8346-8d1eb680886e.png">
 [ユーザー名]、[仮パスワード]、[E メール] を入力します。[電話番号を検証済みにしますか?] チェックボックスをオフにします。

<img width="607" alt="スクリーンショット 2019-01-23 18.35.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/5fae3212-52ac-3c2e-1cdf-b22eae9bec37.png">
[ユーザーの作成] を選択します。[ユーザーとグループ] ページに戻ります。

### グループの作成
[グループ] を選択し、次に、[グループの作成] を選択します。
<img width="1133" alt="スクリーンショット 2019-01-23 18.37.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/58f55088-0c2c-d9f8-c6e1-498b4fac6d39.png">

[名前] と [説明] を適当に入力します。[IAM ロール] を空白のままにし、[優先順位] を `0` にします。次に、[グループの作成] を選択します。
<img width="610" alt="スクリーンショット 2019-01-23 18.37.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/1d2a5a25-eab9-e7cd-55c8-1d2c75608939.png">
これで一旦Kibana にサインインできるようになりますが、Kibana をすべてロードするには設定した許可が不十分なため、Auth_Role にアクセスを提供するために、ドメインのポリシーを変更します。Amazon ESコンソールまで移動し、自分のドメインを選択してから [アクセスポリシーの変更] を選択します。

想定したAuthのため、[プリンシパル] を ARN に変更します。

```
"Principal": {
    "AWS": "arn:aws:sts::<your account id>:assumed-role/Cognito_<your identity pool name>Auth_Role/CognitoIdentityCredentials"
} 
```
次に、[送信] を選択します。[ドメインステータス] が [アクティブ] になるまで待ちます。


## Kibana の認証の動作確認
Kibana の URL へアクセスします。
<img width="515" alt="スクリーンショット 2019-01-23 16.47.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/97a4b68d-c07c-ff7a-0fdf-48a068e44e68.png">
成功していればこのログイン画面が出るので、先ほど作成したユーザー名、パスワードでログインします。

初回のみパスワード変更画面が表示されるので、適当に入力して[Send]します。
![スクリーンショット 2019-01-23 16.48.27.png](https://qiita-image-store.s3.amazonaws.com/0/83262/5ee08496-5e93-4eaf-0e2f-967c43ed9115.png)

問題がなければ、Kibana のトップページが表示されます。また、[Logout]ボタンが追加されていることを確認してください。
<img width="1251" alt="スクリーンショット 2019-01-23 16.53.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/030e15d3-5151-09ab-5edb-43c563650a26.png">


## IAM ポリシーとロールを作成する
### IAMポリシーの作成
IAM コンソールの [ポリシー] を選択し、[ポリシーの作成] を選択します。
 
[JSON] タブを選択し、内容を次のポリシーに置き換えます。
    
```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "es:ESHttp*"
      ],
      "Resource": "arn:aws:es:region:123456789012:domain/domain-name/*"
    }
  ]
}
```
Resourceのドメイン ARN は以下のように自分の ARN に置き換えてください。

**⚠ドメ️イン ARN をコピーして貼り付けるときは、ポリシーの最後の “/*” まですべてコピーするか、追加してください。**
    
[ポリシーの確認] を選択します。続くページでポリシーの名前と説明を適当に入力します。[ポリシーの作成] を選択します。
<img width="1242" alt="スクリーンショット 2019-01-23 17.26.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/33baa4e7-dd99-f7e1-ad1d-199802bf9129.png">
### IAMロールの作成
IAM コンソールで[ロール] を選択します。[ロールの作成] を選択します。[このロールを使用するサービスを選択] の下で、[EC2] を選択します[次のステップ: アクセス許可] を選択します。
<img width="1020" alt="スクリーンショット 2019-01-23 17.38.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/3eee1d92-960e-8b3a-551d-87d49d499c35.png">
 [Attach アクセス許可ポリシー] ページで、[フィルタ] ボックスに前で作成したポリシーの名前を入力し、チェックし、次に進みます。
<img width="1010" alt="スクリーンショット 2019-01-23 17.38.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/a9489e2a-2658-8ed2-4983-b900921b9d12.png"> 
ロールの [名前] と [説明] を入力します。ポリシーが 追加されていることを確認し、問題がなければ[ロールの作成] を選択します。
<img width="1020" alt="スクリーンショット 2019-01-23 17.42.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/6ff47dea-28ae-0c3b-5fd5-5440cee546c5.png">   
IAM コンソールで[ロール] を選択します。[フィルタ] ボックスで、ロールの名前を入力し、編集するロールを選択します。[信頼関係] タブを選択し、[信頼関係の編集] を選択します。
<img width="1240" alt="スクリーンショット 2019-01-23 17.42.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/ac71053b-65a3-e380-dd11-14260a1f1ecf.png">
[信頼関係の編集]、[ポリシードキュメント] の内容を置き換えます。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity"
    }
  ]
}
```
[信頼ポリシーの更新] します。

    
## Amazon Cognito ユーザーのグループにロールを接続する
[ユーザーとグループ] を選択します。[グループ] タブを選択し、作成したグループを選択します。
<img width="1133" alt="スクリーンショット 2019-01-23 19.41.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/3903d6c3-8e0f-1d43-8061-dc1864c19e73.png">

上部のセクションで、✏アイ️コンを選択してグループを編集します。
前に作成した IAM ロールを選択します。
[グループの更新] を選択します。
<img width="676" alt="スクリーンショット 2019-01-23 17.44.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/59a89ff6-0883-eb90-6f16-c02d158885f1.png">

[ユーザーを追加する] を選択します。
<img width="995" alt="スクリーンショット 2019-01-23 19.56.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/0f3f19e4-f40e-2182-8040-e1de8d8d700d.png">    
kibana_user の横の➕を選択して、グループにユーザーを追加します。
<img width="1223" alt="スクリーンショット 2019-01-23 17.44.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/5f23f6ff-e790-ee47-2d2f-a77a51b1834e.png">
最後に ID プールの設定をデフォルトの `Cognito_<user_pool>Auth_Role`、`Cognito_<user_pool>Unauth_Role`から、自分のユーザープールからロールとポリシーを使用するようにします。

ページの上部で ID プールを表示するために、[フェデレーティッドアイデンティティ] を選択します。編集したい ID プール を選択し、IDプールの編集をします。
<img width="1291" alt="スクリーンショット 2019-01-23 20.03.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/cdc77335-6f4b-660b-88dd-973e91cbbe82.png">
    
 [認証プロバイダー] 設定を表示します。[認証されたロールの選択] の下で、ドロップダウンリストを開き、[トークンからロールを選択する] を選択します。
<img width="1145" alt="スクリーンショット 2019-01-23 17.47.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/0620bc7c-3e8a-ae33-301e-b6a0fa58bd07.png">
Amazon Cognito では認証に自分のグループに繋いだロールが使用されるようになります。[変更の保存] を選択します。

 Kibana にサインインして、問題なくアクセスできていれば完了です。