tl;dr
こちらのブログを読ませて頂いて、Amazon ES のアクセスポリシーで IAM Role と IP アドレスの同居ってどうやるんだろうと疑問に思っていたので試行錯誤してみました。
自分の要件としては以下の通り。
- Amazon ES へのアクセスは EC2 からは IAM role で制御したい
- Amazon ES の Kibana プラグインへのアクセスは IP アドレスで制御したい(許可された IP からは Elasticsearch への操作も許可されてしまうけど)
尚、上記のブログでは Kibana プラグインへのアクセスを IP アドレスで許可しつつ、Elasicsearch への操作は抑制したいという要件だと思います。確かに、ニーズがありそうだけど、どのように実現するのか悩ましい限り。
memo
イメージ
- EC2 に付与する
EC2
という IAM role にはポリシーには下図の通り何も付与していない
- Kibana へのアクセスは xxx.xxx.xxx.xxx という IP アドレスからのみアクセスさせる
アクセスポリシー
以下のようなアクセスポリシーを Amazon ES に付与する。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/EC2" }, "Action": "es:*", "Resource": "arn:aws:es:ap-northeast-1:123456789012:domain/oreno-es/*" }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": "arn:aws:es:ap-northeast-1:123456789012:domain/oreno-es/*", "Condition": { "IpAddress": { "aws:SourceIp": "xxx.xxx.xxx.xxx" } } } ] }
動作確認
- Kibana にアクセスすると...
- curl で試すと...
$ curl -s https://search-oreno-es-xxxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com | jq . { "Message": "User: anonymous is not authorized to perform: es:ESHttpGet on resource: oreno-es" }
curl だとリクエストに AWS の認証を付与することが出来ないので、上記のように Elasticsearch にはアクセス出来ない。
動作確認(2)
- リクエストに認証情報を加えて上げる必要があるので python で実装
これは、以下の記事を参考に...
- 確認
$ python test.py | jq . { "cluster_name": "123456789012:oreno-es", "tagline": "You Know, for Search", "version": { "lucene_version": "5.5.0", "build_hash": "0944b4bae2d0f7a126e92b6133caf1651ae316cc", "number": "2.3.2", "build_timestamp": "2016-05-20T07:46:04Z", "build_snapshot": false }, "name": "Shotgun" }
以上
疑問
- IAM role だけ付与しておけば良い?(AmazonESFullAccess あたりのポリシーは付与しなくても問題無い?)