Amazon Elasticsearch Service の Identity and Access Management - Amazon Elasticsearch Service

「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」

Amazon Elasticsearch Service の Identity and Access Management

Amazon Elasticsearch Service には、ドメインへのアクセスを制御するいくつかの方法が用意されています。このセクションでは、さまざまなポリシータイプ、それぞれがやり取りする方法。独自のカスタムポリシーを作成する方法を説明します。

重要

VPC は Amazon ES のアクセス制御にいくつかの追加考慮事項の導入をサポートしています・ 詳細については、「VPC ドメインのアクセスポリシーについて」を参照してください。

ポリシーのタイプ

Amazon ES はアクセスポリシーの 3 つのタイプをサポートしています。

リソースベースのポリシー

ドメインを作成するときに、ドメインアクセスポリシーと呼ばれるリソースベースのポリシーを追加します。これらのポリシーは、ドメインのサブリソースでどのアクションをプリンシパルとして実行できるかを指定します。サブリソースには、Elasticsearch インデックスおよび API が含まれます。

Principal 要素は、アクセスを許可するアカウント、ユーザー、またはロールを指定します。Resource 要素は、これらのプリンシパルがアクセスできるサブリソースを指定します。次のリソースベースのポリシーは、test-useres:* へのフルアクセス (test-domain) を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/test-user" ] }, "Action": [ "es:*" ], "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/*" } ] }

このポリシーには、2 つの重要な考慮事項が適用されます。

  • これらの権限はこのドメインのみに適用されます。追加のポリシーを作成しない限り、test-user は他のドメインのデータにアクセスできません。

  • /* 要素の末尾 Resource はとても重要です。リソースベースのポリシーは、ドメイン自体ではなく、ドメインのサブリソースにのみ適用されます。

    たとえば、test-user はインデックス (GET https://search-test-domain.us-west-1.es.amazonaws.com/test-index) に対してリクエストを行うことができますが、ドメインの設定を更新できません (POST https://es.us-west-1.amazonaws.com/2015-01-01/es/domain/test-domain/config)。2 つのエンドポイント間の違いに注目してください。設定 API へのアクセスには、ID ベースのポリシーが必要です。

test-user をさらに制限するには、次のポリシーを適用することができます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/test-user" ] }, "Action": [ "es:ESHttpGet" ], "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/test-index/_search" } ] }

test-user は1つの操作のみを実行できます。検索対象 test-index。 ドメイン内の他のすべてのインデックスにはアクセスできず、 es:ESHttpPut または es:ESHttpPost 行動、 test-user ドキュメントを追加または変更できません。

次に、パワーユーザーのロールを設定することができます。このポリシーは、power-user-role にインデックスのすべての URI に対する HTTP GET メソッドおよび PUT メソッドへのアクセスを付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:role/power-user-role" ] }, "Action": [ "es:ESHttpGet", "es:ESHttpPut" ], "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/test-index/*" } ] }

使用できるすべてのアクションの詳細については、「ポリシーエレメントのレファレンス」を参照してください。

アイデンティティベースのポリシー

Amazon ES でドメインの一部であるリソースベースのポリシーとは異なり、アイデンティティベースのポリシーは AWS Identity and Access Management (IAM) サービスを使用してユーザーやロールにアタッチします。リソースベースのポリシーと同様に、アイデンティティベースのポリシーは、サービスに誰がアクセスできるか、どのアクションキーを実行できるか、そして該当する場合には、これらのアクションを実行できるリソースを指定します。

これらを実行する実際の義務はないため、アイデンティティベースのポリシーはより一般的になる傾向があります。これにより、多くの場合、ユーザーが実行できる設定 API アクションのみ管理されます。これらのポリシーが完了したら、Amazon ES でリソースベースのポリシーを使用してユーザーに Elasticsearch インデックスおよび API へのアクセスを提供できます。

アイデンティティベースのポリシーはユーザーあるいはロール (プリンシパル) にアタッチされるため、JSON はプリンシパルを指定しません。次のポリシーでは、 Describe および List。 このアクションの組み合わせにより、ドメイン構成に読み取り専用でアクセスできますが、ドメイン自体に保存されているデータにはアクセスできません。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "es:Describe*", "es:List*" ], "Effect": "Allow", "Resource": "*" } ] }

管理者には、Amazon ES およびすべてのドメインに保存された全データへのフルアクセス権がある場合があります。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "es:*" ], "Effect": "Allow", "Resource": "*" } ] }

リソースベースのポリシーとアイデンティティベースのポリシーの違いについての詳細は、『https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html』の「IAM ユーザーガイドIAM ポリシー」を参照してください。

注記

AWS 管理の AmazonESReadOnlyAccess ポリシーが適用されたユーザーは、コンソールでクラスターのヘルスステータスを確認できません。これらのユーザーがヘルスステータスを確認できるようにするには、アクセスポリシーに "es:ESHttpGet" アクションを追加し、これをユーザーのアカウントまたはロールにアタッチします。

IP ベースのポリシー

IP ベースのポリシーは、1 つ以上の IP アドレスあるいは CIDR ブロックにドメインへのアクセスを制限します。技術的には、IP ベースのポリシーは異なるタイプのポリシーではありません。代わりに、これらのポリシーは、匿名のプリンシパルを指定し、特別な Condition 要素を含む、リソースベースのポリシーです。

IP ベースのポリシーの最大の特徴は、Amazon ES ドメインへの署名なしのリクエストを許可することです。これにより、curlKibana などのクライアントを使用したり、プロキシサーバーを介してドメインにアクセスしたりすることができます。詳細については、「プロキシを使用した Kibana から Amazon ES へのアクセス」を参照してください。

注記

ドメインで VPC アクセスを有効にすると、IP ベースのポリシーを設定することはできません。代わりに、どの IP アドレスがドメインにアクセスできるかを制御するセキュリティグループを使用できます。詳細については、「VPC ドメインのアクセスポリシーについて」を参照してください。

以下のポリシーは、指定された IP 範囲からのすべての HTTP リクエストが test-domain にアクセスする許可を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "es:ESHttp*" ], "Condition": { "IpAddress": { "aws:SourceIp": [ "192.0.2.0/24" ] } }, "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/*" } ] }

ドメインにパブリックエンドポイントがあり、きめ細かなアクセスコントロールを使用しない場合は、IAM プリンシパルと IP アドレスを組み合わせることをお勧めします。このポリシーでは、指定した IP 範囲からのリクエストの場合にのみ、test-user HTTP アクセスを許可します。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::987654321098:user/test-user" ] }, "Action": [ "es:ESHttp*" ], "Condition": { "IpAddress": { "aws:SourceIp": [ "192.0.2.0/24" ] } }, "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/*" }] }

Amazon ES リクエストの作成と署名

完全にオープンなリソースベースのポリシーを設定する場合、Amazon ES 設定 API へのすべてのリクエストは署名付きである必要があります。ポリシーで IAM ユーザーまたはロールを指定している場合、Elasticsearch API へのリクエストが AWS 署名バージョン 4 を使用して署名されていることも必要です。署名メソッドは API によって異なります。

  • Amazon ES 設定 API 呼び出しを行うには、AWS SDK のいずれかを使用することが推奨されます。SDK を使用するほうが、独自のリクエストを作成し署名するよりも、プロセスが簡素化し、大幅な時間の節約ができます。API エンドポイント設定には次の形式を使用します。

    es.region.amazonaws.com/2015-01-01/

    たとえば、次のリクエストは、movies ドメインの設定を変更しますが、自分で署名する必要があります (お勧めしません)。

    POST https://es.us-east-1.amazonaws.com/2015-01-01/es/domain/movies/config { "ElasticsearchClusterConfig": { "InstanceType": "c5.xlarge.elasticsearch" } }

    Boto 3 などのいずれかの SDK を使用する場合、SDK はリクエスト署名を自動的に処理します。

    import boto3 client = boto3.client('es') response = client.update_elasticsearch_domain_config( DomainName='movies', ElasticsearchClusterConfig={ 'InstanceType': 'c5.xlarge.elasticsearch' } )

    Java コードの例については、「Amazon Elasticsearch Service での AWS SDK の使用」を参照してください。

  • ElasticsearchAPI への呼び出しを行うには、独自リクエストに署名する必要があります。各種言語のサンプルコードについては、「Amazon Elasticsearch Service への HTTP リクエストの署名」を参照してください。Elasticsearch API は、次の形式を使用します。

    domain-id.region.es.amazonaws.com

    たとえば、次のリクエストは、thor の、movies インデックスを検索します。​

    GET https://my-domain.us-east-1.es.amazonaws.com/movies/_search?q=thor
注記

このサービスは、署名バージョン 4 で署名された HTTP POST リクエストの URL で渡されるパラメータを無視します。

複数のポリシーが衝突する場合

複数のポリシーが同意しない、あるいはユーザーを明示的に指定しない場合、困難が生じます。『https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-authorization』の「IAM ユーザーガイドIAM の詳細を理解します」では、ポリシーの評価ロジックの適切な概要が説明されています。

  • デフォルトでは、すべてのリクエストが拒否されます。

  • 明示的な許可はこのデフォルトに優先します。

  • 明示的な拒否はすべての許可に優先する

たとえば、リソースベースのポリシーがドメインにアクセスを許可しているが、アイデンティティベースのポリシーはアクセスを拒否するため、アクセスは拒否されます。アイデンティティベースのポリシーとリソースベースのポリシーによってユーザーがアクセス許可を持つべきかを指定いない場合、アクセスは許可されます。すべての結果の概要における交差するポリシーの図を以下で参照してください。

リソースベースのポリシーで許可 リソースベースのポリシーで拒否 リソースベースのポリシーで許可あるいは拒否されない
Allowed in Identity-based Policy

許可

拒否 許可
Denied in Identity-based Policy 拒否 拒否 拒否
Neither Allowed nor Denied in Identity-based Policy 許可 拒否 拒否

ポリシーエレメントのレファレンス

Amazon ES は、 IAMポリシー要素参照、ただし、 NotPrincipal。 次の表は、最も一般的な要素を示しています。

JSON ポリシーエレメント 総括
Version

現行バージョンのポリシー言語は 2012-10-17。 すべてのアクセスポリシーでこの値を指定する必要があります。

Effect

このエレメントは、指定されたアクションへのアクセスをステートメントが許可するか拒否するかを指定します。有効な値は Allow または Deny です。

Principal

この要素は、リソースへのアクセスを許可する AWS アカウント、あるいは IAM ユーザーまたはロールを指定し、いくつかの形式を取ることができます。

  • AWSアカウント: "Principal":{"AWS": ["123456789012"]} または "Principal":{"AWS": ["arn:aws:iam::123456789012:root"]}

  • IAM ユーザー: "Principal":{"AWS": ["arn:aws:iam::123456789012:user/test-user"]}

  • IAM ロール: "Principal":{"AWS": ["arn:aws:iam::123456789012:role/test-role"]}

* ワイルドカードを指定すると、ドメインへの匿名アクセスが有効になります。これは IP ベースの条件を追加する、VPC サポートを使用する、またはきめ細かなアクセスコントロールを有効にしない限り、お勧めしません。

Action

Amazon ES では、HTTP メソッドとして次のアクションを使用します。

  • es:ESHttpDelete

  • es:ESHttpGet

  • es:ESHttpHead

  • es:ESHttpPost

  • es:ESHttpPut

  • es:ESHttpPatch

Amazon ES では、設定 API として次のアクションを使用します。

  • es:AddTags

  • es:CreateElasticsearchDomain

  • es:CreateElasticsearchServiceRole

  • es:DeleteElasticsearchDomain

  • es:DeleteElasticsearchServiceRole

  • es:DescribeElasticsearchDomain

  • es:DescribeElasticsearchDomainConfig

  • es:DescribeElasticsearchDomains

  • es:DescribeElasticsearchInstanceTypeLimits

  • es:DescribeReservedElasticsearchInstanceOfferings

  • es:DescribeReservedElasticsearchInstances

  • es:ESCrossClusterGet

  • es:GetCompatibleElasticsearchVersions

  • es:ListDomainNames

  • es:ListElasticsearchInstanceTypeDetails

  • es:ListElasticsearchInstanceTypes

  • es:ListElasticsearchVersions

  • es:ListTags

  • es:PurchaseReservedElasticsearchInstanceOffering

  • es:RemoveTags

  • es:UpdateElasticsearchDomainConfig

ヒント

ワイルドカードを使用してアクションのサブネットを指定できます ("Action":"es:*""Action":"es:Describe*" など)。

特定の es: アクションは、リソースレベルの許可をサポートします。たとえば、すべてのドメインを削除する許可を付与せずに、1 つの特定のドメインのみ削除する許可をユーザーに付与することができます。その他のアクションはサービス自体に適用されます。たとえば、es:ListDomainNames は単一ドメインのコンテキストでは意味を成しませんが、それでもワイルドカードを必要とします。

重要

リソースベースのポリシーは、リソースレベルのアクセス権限とは異なっています。リソースベースのポリシー は、ドメインにアタッチする完全な JSON ポリシーです。リソースレベルのアクセス許可は、特定のドメインあるいはサブリソースにアクションを制限します。実際には、リソースレベルのアクセス許可はリソース、あるいはアイデンティティベースのポリシーのオプションの一部として捉えることができます。

次のアイデンティティベースのポリシーはすべての es: アクションを一覧表示し、ドメインのサブリソース (test-domain/*)、ドメインの設定 (test-domain)、あるいはサービスのみ (*) に適用されるかによってアクションをグループ化します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "es:ESHttpDelete", "es:ESHttpGet", "es:ESHttpHead", "es:ESHttpPost", "es:ESHttpPut", "es:ESHttpPatch" ], "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/*" }, { "Effect": "Allow", "Action": [ "es:CreateElasticsearchDomain", "es:DeleteElasticsearchDomain", "es:DescribeElasticsearchDomain", "es:DescribeElasticsearchDomainConfig", "es:DescribeElasticsearchDomains", "es:ESCrossClusterGet", "es:GetCompatibleElasticsearchVersions", "es:UpdateElasticsearchDomainConfig" ], "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain" }, { "Effect": "Allow", "Action": [ "es:AddTags", "es:CreateElasticsearchServiceRole", "es:DeleteElasticsearchServiceRole", "es:DescribeElasticsearchInstanceTypeLimits", "es:DescribeReservedElasticsearchInstanceOfferings", "es:DescribeReservedElasticsearchInstances", "es:ESCrossClusterGet", "es:ListDomainNames", "es:ListElasticsearchInstanceTypeDetails", "es:ListElasticsearchInstanceTypes", "es:ListElasticsearchVersions", "es:ListTags", "es:PurchaseReservedElasticsearchInstanceOffering", "es:RemoveTags" ], "Resource": "*" } ] }
注記

es:CreateElasticsearchDomain へのリソースレベルのアクセス権限は直観的ではなく見えることがあります—つまり、すでに存在するドメインを作成するアクセス権限をなぜユーザーに付与するのでしょう—ワイルドカードの使用でドメインに簡単な命名スキームを適用できます ("Resource": "arn:aws:es:us-west-1:987654321098:domain/my-team-name-*" など)。

もちろん、次のように、制限がより緩和されたリソース要素のアクションを含めることもできます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "es:ESHttpGet", "es:DescribeElasticsearchDomain" ], "Resource": "*" } ] }

アクションとリソースのペアリングについての詳細は、テーブルの Resource 要素を参照してください。

Condition

Amazon ES では、『http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#AvailableKeys』の「IAM ユーザーガイド使用できるグローバル条件キー」に記載されているほとんどの条件がサポートされています。重要な例外として、aws:SecureTransport キーは、Amazon ES でサポートされていません。

IP ベースのポリシーを設定する場合、次に示すように、IP アドレスまたは CIDR ブロックを条件として指定します。

"Condition": { "IpAddress": { "aws:SourceIp": [ "192.0.2.0/32" ] } }
Resource

Amazon ES は、3 つの基本的な方法で Resource 要素を使用します。

  • es:ListDomainNames や フルアクセスを許可するといった、Amazon ES 自体に適用されるアクションには、次の構文を使用します。

    "Resource": "*"
  • es:DescribeElasticsearchDomain のように、ドメインの設定に関連するアクションには、次の構文を使用します。

    "Resource": "arn:aws:es:region:aws-account-id:domain/domain-name"
  • es:ESHttpGet のように、ドメインのサブリソースを適用するアクションには、次の構文を使用します。

    "Resource": "arn:aws:es:region:aws-account-id:domain/domain-name/*"

    ワイルドカードを使用する必要はありません。Amazon ES は、各 Elasticsearch index インデックスまたは API に異なるアクセスポリシーを定義します。たとえば、test-index インデックスへのユーザーのアクセス許可を制限できます。

    "Resource": "arn:aws:es:region:aws-account-id:domain/domain-name/test-index"

    test-index へのフルアクセスの代わりに、検索 API のみにポリシーを制限することもできます。

    "Resource": "arn:aws:es:region:aws-account-id:domain/domain-name/test-index/_search"

    個々のドキュメントへのアクセスを制御することもできます。

    "Resource": "arn:aws:es:region:aws-account-id:domain/domain-name/test-index/test-type/1"

    基本的に、Elasticsearch によってサブリソースが URI として表現される場合、アクセスポリシーを使用してサブリソースへのアクセスをコントロールできます。どのリソースにユーザーがアクセスできるかをさらに細かく制御するには、「Amazon Elasticsearch Service でのきめ細かなアクセスコントロール」を参照してください。

どのアクションがリソースレベルのアクセス権限をサポートするかの詳細については、このテーブルの Action 要素を参照してください。

詳細オプションと API に関する考慮事項

Amazon ES には複数の高度なオプションがあり、そのうちの1つにはアクセス制御の影響があります。rest.action.multi.allow_explicit_index。 デフォルト設定の true では、ユーザーは特定の状況下でサブリソース許可をバイパスできます。

たとえば、次のリソースベースのポリシーを考えます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/test-user" ] }, "Action": [ "es:ESHttp*" ], "Resource": [ "arn:aws:es:us-west-1:987654321098:domain/test-domain/test-index/*", "arn:aws:es:us-west-1:987654321098:domain/test-domain/_bulk" ] }, { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/test-user" ] }, "Action": [ "es:ESHttpGet" ], "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/restricted-index/*" } ] }

このポリシーは、test-usertest-index および Elasticsearch バルク API へのフルアクセスを付与します。また、GET への restricted-index リクエストを許可します。

次のインデックスリクエストは、見てわかるように、アクセス権限エラーによって失敗します。

PUT https://search-test-domain.us-west-1.es.amazonaws.com/restricted-index/movie/1 { "title": "Your Name", "director": "Makoto Shinkai", "year": "2016" }

インデックス API とは異なり、バルク API では、単一の呼び出しで多くのドキュメントの作成、更新、削除を実行できます。多くの場合、これらのオペレーションはリクエスト URL ではなく、リクエストの本文で指定します。なぜなら Amazon ES URLを使用してドメインサブリソースへのアクセスを制御する test-user 実際には、バルク API を使用して、 restricted-index。 ユーザが POST インデックスに対する権限、次のリクエスト 成功:

POST https://search-test-domain.us-west-1.es.amazonaws.com/_bulk { "index" : { "_index": "restricted-index", "_type" : "movie", "_id" : "1" } } { "title": "Your Name", "director": "Makoto Shinkai", "year": "2016" }

このような状況では、アクセスポリシーはその目的達成に失敗します。ユーザーがこれらの制限を回避することを防ぐためには、rest.action.multi.allow_explicit_index を false に変更できます。この値が false の場合、リクエストボディでインデックス名を指定するバルク、mget、および msearch API へのすべての呼び出し動作は停止します。つまり、_bulk への呼び出しは機能しなくなりますが、test-index/_bulk への呼び出しは動作します。この 2 番目のエンドポイントにはインデックス名が含まれるため、リクエストボディにそれを指定する必要はありません。

Kibana は mget および msearch に大きく依存しています。そのため、この変更後には正常に動作しないことが予想されます。部分的な解決策としては、rest.action.multi.allow_explicit_index を true のまま残して、特定のユーザーが 1 つ以上の API にアクセスすることを拒否します。

この設定の変更については、「詳細オプション」を参照してください。

同様に、以下のリソースベースのポリシーには 2 つの小さな問題があります。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/test-user" }, "Action": "es:ESHttp*", "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/*" }, { "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/test-user" }, "Action": "es:ESHTTP*", "Resource": "arn:aws:es:us-west-1:987654321098:domain/test-domain/restricted-index/*" } ] }
  • 明示的な拒否にも関わらず、test-userGET https://search-test-domain.us-west-1.es.amazonaws.com/_all/_searchGET https://search-test-domain.us-west-1.es.amazonaws.com/*/_search などの呼び出しを実行して、restricted-index のドキュメントにアクセスできることです。

  • Resource エレメントレファレンス restricted-index/* により、test-user はインデックスのドキュメントに直接アクセスする権限がありません。しかし、ユーザーにはインデックス全体を削除する権限があります。アクセスと削除を防ぐには、このポリシーで restricted-index* を指定する必要があります。

広範囲な許可と一部の拒否を混合するよりは、最小限の権限の原則を守り、タスクを実行するために必要なアクセス権限のみを付与することが最も安全なアプローチです。個々のインデックスまたは Elasticsearch オペレーションに対するアクセスコントロールの詳細については、「Amazon Elasticsearch Service でのきめ細かなアクセスコントロール」を参照してください。

アクセス ポリシーの設定 ()

追加のサンプルポリシー

この章には多くのサンプルポリシーが含まれていますが、AWS アクセスコントロールは複雑なテーマであり、例を使用することが一番の理解方法です。詳細については、『https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html』の「IAM ユーザーガイドポリシーの例」を参照してください。