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 に変更します。
次に、[送信] を選択します。[Domain Status] (ドメインステータス) が [アクティブ] になるまで待ちます。Kibana URL を選択し、開きます。
次のようなサインインダイアログボックスが表示されるはずです。kibana_user としてサインインします。
パスワードを変更する必要があります (Amazon Cognito ユーザープールのデフォルトの動作)。すべてが正常に実行されると、Kibana のスプラッシュページが表示されます。このサービスによりページの下部に [ログアウト] ボタンが追加される点に注意してください。
[ログアウト] を選択します。その後、次の章で説明するようにアクセスをカスタマイズできます。
パート 2: アクセスのカスタマイズ
これまでに基本的なコンポーネントの設定が完了したので、Amazon Cognito ユーザーグループ用に IAM ロールを作成し、グループに接続する準備ができました。
IAM ポリシーとロールを作成する
IAM コンソールに移動します。左のナビゲーションペインで [ポリシー] を選択し、[ポリシーの作成] を選択します。
結果ページで [JSON] タブを選択し、内容を次のポリシーに置き換えます。
この例の [リソース
] のドメイン 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 コンソールへ移動し、左側のナビゲーションペインで、[ロール] を選択します。[フィルタ] ボックスで、ロールの名前を入力し、編集するロールを選択します。[信頼関係] タブを選択し、[信頼関係の編集] を選択します。
[信頼関係の編集]、[ポリシードキュメント] の内容を次で置き換えます。
[信頼ポリシーの更新] を選択します。
すべてを 1 つにつなげる
これで Amazon Cognito ユーザーのグループにロースを作成できたので、グループにそれを接続しましょう。Amazon Cognito コンソールへ移動します。[ユーザープール] を選択し、その後、kibana_access ユーザープールを編集するために選択します。
左側のナビゲーションペインで [ユーザーとグループ] を選択します。[グループ] タブを選択し、次に、kibana_group を選択します。上部のセクションで、[編集] アイコンを選択してグループを編集します。[グループの更新] ダイアログボックスで、リストを展開し、先程作成した IAM ロールを選択します。IAM ロールがドロップダウンリストに表示されない場合は、ページを最新表示してください。
[グループの更新] を選択します。続いて、kibana_group ページの [グループ] の 2 番目のセクションで、[ユーザーを追加する] を選択します。kibana_user の横のプラスサインを選択して、グループにユーザーを追加します。
ダイアログボックスを閉じます。
実行する必要のある最後の設定は ID プールの設定で、デフォルトの Cognito_<user_pool>Auth_Role と Cognito_<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 を使用する際にソリューションの価値を向上させる手助けとなるために、当社の顧客と協力してデータベースプロジェクト上の指導や技術支援を行っています。