Amazon Web Services ブログ

Amazon Elasticsearch Service を使い始める: Amazon Cognito を Kibana のアクセスコントロールに使用する

Elasticsearch および Amazon Elasticsearch Service (Amazon ES) に関するこの導入シリーズへようこそ。今回および今後のブログ記事では、AWS で Elasticsearch の使用を開始するために必要な基本情報を紹介します。

概要

2018 年 4 月 2 日、Amazon Elasticsearch Service と Amazon Cognito 間の統合がリリースされました。今後は Amazon ES ドメインへの Kibana アクセスにユーザーレベルのサインオンを提供し、それらを管理できるようになります。Amazon Cognito を使用することで、外部の ID プロバイダーに接続し、自社のユーザーにシングルサインオンを提供できます。また、ユーザーまたはユーザーグループに対してアクセスポリシーを設定することにより、アクセスコントロールの管理を簡略化できます。

本記事では、Amazon Cognito の認証と Amazon ES ドメインにある Kibana へのアクセスコントロールの追加セットアップについて説明します。前半では Amazon ES ドメイン、Amazon Cognito ユーザープール、Amazon Cognito ID プールなどの基本コンポーネントを作成します。このプロセスの最後には、Amazon Cognito を通じて提供された、共有 Auth_Role をベースにした Kibana にサインオンします。Auth_Role は Amazon Cognito ユーザープールの全ユーザーで共有されます。

本記事の後半では、固有のユーザーに割り当てるロールに接続された、IAM ロールとポリシーを 1 つずつ作成します。Amazon ES ドメインにアクセスを提供する手法を一般化することができます。

既に公開されている次のブログ記事もご覧ください。How to Control Access to Your Amazon Elasticsearch Service Domain このブログ記事では、Amazon ES ドメインの IAM ポリシーの設定について解説しています。今後の記事では、Amazon Cognito を外部 ID プロバイダーに接続する方法について解説します。詳細な資料については、Amazon ES ユーザーガイドおよび Amazon Cognito ユーザーガイドを参照してください。

パート 1: リソースを作成する

Amazon Cognito ユーザープール、ID プール、Amazon ES ドメインなど、プロセスを完了するのに必要な基本コンポーネントの作成から始めましょう。

Amazon Cognito のセットアップ

初めに、Amazon ES へのアクセスをコントロールするために、ID とロールを提供する Amazon Cognito コンポーネントを作成します。Amazon Cognito の 2 つのメインコンポーネントは、ユーザープールID プールです。ユーザープールはスケーラブルなユーザーディレクトリーで、アプリユーザー向けのサインアップおよびサインイン機能を提供します。ID プールはユーザーがサインインしたあとに、ユーザーに一時的な制限付き権限、AWS の認証情報を提供します。Amazon Cognito とともに、Amazon ES を使用するときには、ユーザープールを使用し、Amazon ES がそれをドメインと接続します。ID プールで ID をインポートまたは作成し、そうした ID に接続されたポリシーを管理します。

初めに、Amazon Cognito ユーザープールを作成しましょう。AWS マネジメントコンソールを開き、サインインします。検索ボックスに Cognito と入力し、ドロップダウンリストで Cognito を選択します。メインのスプラッシュページで、[ユーザープールの管理] を選択します。次に、[ユーザープールを作成する] を選択します。

ユーザープールに名前を付けます。この例ではプールに kibana_access という名前を付けました。順を追って設定していくか、デフォルトを選択します。ここでは、[デフォルトを確認する] を選択します。

下へ向かってスクロールし、[プールの作成] を選択します。

Amazon ES を統合するには、予め Amazon Cognito ドメイン名を作成する必要があります。この名前は現在使用している Amazon ES ドメイン名と同じでも、異なっていても構いません。これは認証 UI をサポートするために、Amazon Cognito に DNS を提供します。

これまでにユーザープールの詳細を確認していない場合は、ユーザープールを選択して詳細を表示し、ナビゲーションペインで [ドメイン名] を選択します。テキストボックスに名前を入力します。この例では kibana-auth-domain を使用しました。[変更の保存] を選択します。

次に ID プールを作成します。コンソールの上部で、[フェデレーティッドアイデンティティ] を選択します。

まだ ID プールを作成していない場合は、新しい ID プールを作成するためのウィザードが開きます。ID プールに名前を付けます。私は kibana_identities を選択しました。次に [認証されていない ID に対してアクセスを有効にする] チェックボックスを選択します。

[プールの作成] を選択します。AWS Identity and Access Management (IAM) コンソールに移動し、未承認および承認済みユーザー用にロールを作成します。[詳細を表示] を選択すると、次の 2 つのロールポリシーが作成されています: Cognito_<identity pool name>Auth_Role および Cognito_<identity pool name>UnAuth_Role。デフォルトで Kibana にサインインすると、サインイン先は Auth_Role になります。未認証のユーザーは UnAuth_role になります。本記事の後半では、個人のユーザーとグループにアクセスコントロールを追加する動作を変更します。[許可] を選択します。

Amazon ES ドメインを作成する

これで準備は完了です。次に Amazon ES ドメインを作成します。基本的なステップはここに記述したとおりです。さらに詳しいステップについては、Amazon ES 文書を参照してください。

Amazon ES コンソールを開きます。新しいドメインを作成し、名前を付けます。私は次のように指定しました: kibana-with-auth。最新の Elasticsearch バージョン (本記事の執筆現在では 6.2) を使用して、[次へ] を選択します。

構成ページでは [インスタンス数]、[インスタンスタイプ]、[Enable dedicated master] (専用マスターの有効化)、[Enable zone awareness] (ゾーンアウェアネスの有効化)、および [Storage configuration] (ストレージ設定)、[Snapshot configuration] (スナップショット設定)、および [Advanced options] (詳細オプション) の下の全オプションはデフォルト設定のままにします。[次へ] を選択します。

次のページでは Amazon Cognito など、アクセスコントロールをセットアップします。この投稿記事では、パブリックアクセスのあるドメインを使用します。[パブリックアクセス] オプションを選択します。[Enable Amazon Cognito for authentication] (認定用に Amazon Cognito を有効化) チェックボックスを選択します。これで Amazon Cognito の設定が表示されます。Cognito ユーザープールでは kibana_access を選択します。Cognito ID プール では kibana_identities を選択します。[IAM ロール名] と [ロールポリシー] はデフォルト設定のままにします。

また、ドメインのアクセスポリシーも設定する必要があります。[Set the domain access policy to] (ドメインアクセスポリシーを次に設定) では、[Allow or deny access to one or more AWS accounts or IAM users] (1 つ以上の AWS アカウントまたは IAM ユーザーへのアクセスを許可または拒否する) を選択します。[AWS アカウント ID] をコピーし、[Account ID or ARN] (アカウント ID または ARN) ボックスに貼り付けます。[OK] を選択し、続いてメインページで [次へ] を選択します。Amazon Cognito のドメインへのアクセスをセットアップしますが、それを作成するには Amazon ES ドメインでポリシーを設定する必要があります。設定を確認して、[確認] を選択します。

変更内容を確認すると、ドメインの作成の一部として、Amazon ES が Amazon Cognito のユーザープールと ID プールをリンク付けします。CognitoAccessForAmazonES ロールを通じてアクションを実行するために、Amazon ES を承認します。

ドメインがアクティブになるまで待ちます。アクティブになるまでは 10 分ほどかかります。ダッシュボードにドメインのエンドポイントが表示されたら先に進めます。

注意: ドメインの ARN (Amazon リソースネーム) をコピーし保存しておいてください。すぐにそれが必要になります。

ユーザーとグループを 1 つずつ作成する

次にユーザーグループを追加し、IAM ポリシーを変更して Kibana へサインインします。Amazon Cognito コンソールへ移動し、[ユーザープールの管理] を選択します。kibana_access を選択します。ナビゲーションペインで、[ユーザーとグループ] を選択します。次に、[ユーザーの作成] を選択します。

結果ダイアログボックスで [ユーザー名]、[仮パスワード]、[E メール] を入力します。[電話番号を検証済みにしますか?] チェックボックスをオフにします。

[ユーザーの作成] を選択します。[ユーザーとグループ] ページに戻ります。そこでは新しいユーザーが表示されるはずです。

[グループ] タブを選択し、次に、[グループの作成] を選択します。

結果ダイアログボックスで、[名前] と [説明] を入力します。[IAM ロール] を空白のままにし、[優先順位] を [0] にします。次に、[グループの作成] を選択します。

この時点で、Kibana にサインインできるようになります。前述のように、Amazon Cognito Auth_Role になります。しかし、実際に Kibana をすべてロードするには設定した許可が不十分です。その場合、Auth_Role にアクセスを提供するために、ドメインのポリシーを変更できます。Amazon ES コンソールまで移動し、自分のドメインを選択してから [Modify access policy] (アクセスポリシーの変更) を選択します。

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

"Principal": {
    "AWS": "arn:aws:sts::<your account id>:assumed-role/Cognito_<your identity pool name>Auth_Role/CognitoIdentityCredentials"
} 

次に、[送信] を選択します。[Domain Status] (ドメインステータス) が [アクティブ] になるまで待ちます。Kibana URL を選択し、開きます。

次のようなサインインダイアログボックスが表示されるはずです。kibana_user としてサインインします。

パスワードを変更する必要があります (Amazon Cognito ユーザープールのデフォルトの動作)。すべてが正常に実行されると、Kibana のスプラッシュページが表示されます。このサービスによりページの下部に [ログアウト] ボタンが追加される点に注意してください。

[ログアウト] を選択します。その後、次の章で説明するようにアクセスをカスタマイズできます。

パート 2: アクセスのカスタマイズ

これまでに基本的なコンポーネントの設定が完了したので、Amazon Cognito ユーザーグループ用に IAM ロールを作成し、グループに接続する準備ができました。

IAM ポリシーとロールを作成する

IAM コンソールに移動します。左のナビゲーションペインで [ポリシー] を選択し、[ポリシーの作成] を選択します。

結果ページで [JSON] タブを選択し、内容を次のポリシーに置き換えます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "es:ESHttp*"
      ],
      "Resource": "arn:aws:es:region:123456789012:domain/domain-name/*"
    }
  ]
}

この例の [リソース] のドメイン ARN は自分の ARN に置き換えてください。

重要! ドメイン ARN をコピーして貼り付けるときは、ポリシーの最後の “/*” まですべてコピーするか、追加してください。

[ポリシーの確認] を選択します。続くページでポリシーの [名前] と [説明] を入力しました (私は kibana-with-auth_open_policy を選択しました)。[ポリシーの作成] を選択します。

このポリシーはご使用のドメインへのアクセスを許可します。これをカスタマイズして別の Kibana ユーザー向けに異なるアクセス許可を付与することもできます。現時点で本サービスはポリシーのリソースを通じて、ドメインレベルのアクセスコントロールをサポートします。これは Kibana ダッシュボードのダッシュボードまたはビジュアリゼーションアクセスをサポートしません。しかし、自分で許可または拒否するアクションは Kibana 開発者用ツールタブに適用されます。たとえば、Kibana ユーザーが DELETE リクエストを送信しないようにする拒否制限 es:ESHttpDelete を追加できます。

次に、左のナビゲーションペインで、[ロール] を選択します。[ロールの作成] を選択します。[このロールを使用するサービスを選択] の下で、[EC2] を選択します。Amazon EC2 を使用することはありませんが、サービスを選択する必要があり、EC2 がプレースホルダーになります。[Next:Permissions] (次: アクセス許可) を選択します。

[Attach permissions policies] (アクセス許可ポリシーの接続) ページで、[フィルタ] ボックスに先程作成したポリシーの名前を入力します。リストでポリシーの左側にあるボックスでチェックマークをオンします。そして、[Next:Review] (次: レビュー) を選択します。ロールの [名前] と [説明] を入力します。この例では、ロール名として kibana-with-auth_role を選択しました。ポリシーが [ポリシー] にリストされていることを確認します。[ロールの作成] を選択します。

別のタイプのアクセス許可用に別のロールを作成し、それを Amazon Cognito の別のユーザーグループに接続できます。これを実行することで、組織内の別のグループに異なる Amazon ES ドメインへのアクセスを制限できるようになります。

また、作成したばかりのロールを、Amazon Cognito が想定できるようにする必要があります。この時点では、IAM コンソールにロールが表示されているはずです。そうでない場合は、IAM コンソールへ移動し、左側のナビゲーションペインで、[ロール] を選択します。[フィルタ] ボックスで、ロールの名前を入力し、編集するロールを選択します。[信頼関係] タブを選択し、[信頼関係の編集] を選択します。

[信頼関係の編集]、[ポリシードキュメント] の内容を次で置き換えます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity"
    }
  ]
}

[信頼ポリシーの更新] を選択します。

すべてを 1 つにつなげる

これで Amazon Cognito ユーザーのグループにロースを作成できたので、グループにそれを接続しましょう。Amazon Cognito コンソールへ移動します。[ユーザープール] を選択し、その後、kibana_access ユーザープールを編集するために選択します。

左側のナビゲーションペインで [ユーザーとグループ] を選択します。[グループ] タブを選択し、次に、kibana_group を選択します。上部のセクションで、[編集] アイコンを選択してグループを編集します。[グループの更新] ダイアログボックスで、リストを展開し、先程作成した IAM ロールを選択します。IAM ロールがドロップダウンリストに表示されない場合は、ページを最新表示してください。

[グループの更新] を選択します。続いて、kibana_group ページの [グループ] の 2 番目のセクションで、[ユーザーを追加する] を選択します。kibana_user の横のプラスサインを選択して、グループにユーザーを追加します。

ダイアログボックスを閉じます。

実行する必要のある最後の設定は ID プールの設定で、デフォルトの Cognito_<user_pool>Auth_RoleCognito_<user_pool>Unauth_Role の代わりに、自分のユーザープールからロールとポリシーを使用するようにします。このステップを実行しないと、すべての認証済みユーザーは Auth_Role、また、非認証ユーザーは Unauth_role と想定されるようになります。

ページの上部で ID プールを表示するために、[フェデレーティッドアイデンティティ] を選択します。編集する ID プール (kibana_identities) を選択します。ページの上部右側で、[ID プールの編集] を選択します。下に向かってスクロールし、下向き矢印を選択して、[認証プロバイダー] 設定を表示します。[認証されたロールの選択] の下で、ドロップダウンリストを開き、[トークンからロールを選択する] を選択します。

今後、Amazon Cognito では認証に自分のグループに接続したロールが使用されるようになります。[変更の保存] を選択します。

Kibana にサインインする

Amazon Cognito のユーザープール、ID プール、また Kibana にサインインするための Amazon Cognito を使用する Amazon ES ドメインのセットアップが完了しました。早速試してみましょう。 Amazon ES ダッシュボードへ移動します。ドメインを選択し、Kibana URL を見つけて、リンクを選択し、開きます。

今度は kibana_user としてサインインし、kibana-with-auth_role で供給されたアクセス許可で操作します。

結論

おめでとうございます! Amazon Cognito ユーザーに接続したカスタムロールを備えた、Amazon Cognito ユーザープールと ID プールを作成しました。Amazon Cognito を使用する Amazon Elasticsearch Service ドメインを設定し、ユーザーが Kibana へサインインできるようにするとともに、ご使用のドメインへのこうしたユーザーのアクセス権を制限しました。他のドメインに他のユーザーやグループを追加し、組織を通じて、Amazon ES のデプロイへのアクセス権をコントロールできます。


著者について

Jon Handler (@_searchgeek) は、検索テクノロジーに特化した AWS ソリューションアーキテクトです。 AWS を使用する際にソリューションの価値を向上させる手助けとなるために、当社の顧客と協力してデータベースプロジェクト上の指導や技術支援を行っています。