最近、新しいAmazon Elasticsearch Serviceの使用を開始しましたが、特定のIAMロールが割り当てられたEC2インスタンスからのみサービスにアクセスできるように、必要なアクセスポリシーがわからないようです。
ESドメインに現在割り当てているアクセスポリシーの例を次に示します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::[ACCOUNT_ID]:role/my_es_role",
]
},
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:[ACCOUNT_ID]:domain/[ES_DOMAIN]/*"
}
]
}
しかし、私が言ったように、これは機能しません。 EC2インスタンス(my_es_role
ロールがアタッチされている)にログインし、「https://*.es.amazonaws.com」エンドポイントで簡単なcurl呼び出しを実行しようとすると、次のエラーが表示されます。
{「メッセージ」:「ユーザー:匿名は実行する権限がありません:リソースのes:ESHttpGet:arn:aws:es:us-east-1:[ACCOUNT_ID]:domain/[ES_DOMAIN] /“}
これが機能するために、アクセスポリシーで何を変更する必要があるか、誰にもわかりますか?
IAMのみにアクセスをロックダウンできますが、ブラウザでKibanaをどのように表示しますか? プロキシのセットアップ ( Gistを参照 および/または NPMモジュール )または、結果を表示するためにIAMとIPベースの両方のアクセスを有効にすることができます。
次のアクセスポリシーを使用して、両方のIAMアクセスIP制限付きアクセスを取得できました。順序が重要であることに注意してください。IAMステートメントの前にIPベースのステートメントで動作させることができませんでした。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::xxxxxxxxxxxx:root"
},
"Action": "es:*",
"Resource": "arn:aws:es:us-west-2:xxxxxxxxxxxx:domain/my-elasticsearch-domain/*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "arn:aws:es:us-west-2:xxxxxxxxxxxx:domain/my-elasticsearch-domain/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"192.168.1.0",
"192.168.1.1"
]
}
}
}
]
}
EC2インスタンスには、arn:aws:iam::aws:policy/AmazonESFullAccess
ポリシーのインスタンスプロファイルがあります。 Logstashは logstash-output-Amazon-es出力プラグイン を使用してリクエストに署名する必要があります。 EC2インスタンスで実行されているLogstashには、次のような出力セクションが含まれています。
output {
Amazon_es {
hosts => ["ELASTICSEARCH_Host"]
region => "AWS_REGION"
}
# If you need to do some testing & debugging, uncomment this line:
# stdout { codec => rubydebug }
}
アクセスポリシーの2つのIP(192.168.1.0および192.168.1.1)からKibanaにアクセスできます。
AWSのドキュメントによると、あなた(と私)がテストしたばかりのように、AWS ESドメインへのアクセスをrole/account/user/...に制限することはできません。
Curlなどの標準クライアントは、IDベースのアクセスポリシーに必要な要求署名を実行できません。このステップの手順を正常に実行するには、匿名アクセスを許可するIPアドレスベースのアクセスポリシーを使用する必要があります。 ( http://docs.aws.Amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html )
したがって、基本的に2つのソリューションがあります。
アクセスポリシーをそのまま維持する場合(IPに制限するよりも柔軟性が高い場合)は、おそらくリクエストに署名することが最善のソリューションですが、もう少し複雑に思えます。私は今まで試したことがないので、役立つドキュメントが見つかりません。
パーティーに少し遅れましたが、リクエストに署名を追加することでまったく同じ問題に対処することができました。
Pythonを使用する場合(私と同じように)、次のライブラリを使用して特に簡単に実装できます。 https://github.com/DavidMuller/aws-requests-auth
それは私にとって完璧に機能しました。
IPベースのポリシーではなく、リソースベースのポリシーまたはIDベースのポリシーを使用できます。これは、IPアドレスをハードコーディングするようなものです。
ただし、署名バージョン4を使用してリクエストに署名する必要があります
Javaの実装については、 http://mytechbites.blogspot.in/2017/04/secure-Amazon-elastic-search-service.html を参照してください。