ようへいの日々精進XP

よかろうもん

Amazon ES へのアクセスを IAM role と IP アドレスで制御する試行錯誤

tl;dr

kakakakakku.hatenablog.com

こちらのブログを読ませて頂いて、Amazon ES のアクセスポリシーで IAM Role と IP アドレスの同居ってどうやるんだろうと疑問に思っていたので試行錯誤してみました。

自分の要件としては以下の通り。

  • Amazon ES へのアクセスは EC2 からは IAM role で制御したい
  • Amazon ES の Kibana プラグインへのアクセスは IP アドレスで制御したい(許可された IP からは Elasticsearch への操作も許可されてしまうけど)

尚、上記のブログでは Kibana プラグインへのアクセスを IP アドレスで許可しつつ、Elasicsearch への操作は抑制したいという要件だと思います。確かに、ニーズがありそうだけど、どのように実現するのか悩ましい限り。

memo

イメージ

f:id:inokara:20160910150229p:plain

  • EC2 に付与する EC2 という IAM role にはポリシーには下図の通り何も付与していない

f:id:inokara:20160910151435p:plain

  • 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 にアクセスすると...

f:id:inokara:20160910142419p:plain

  • 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 で実装

これは、以下の記事を参考に...

inokara.hateblo.jp

  • 確認
$ 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 あたりのポリシーは付与しなくても問題無い?)

要望

  • Amazon ES のアクセスポリシーを変更して反映するまでの時間が長い(体感で 10 分〜 15 分)...ので改善して頂きたいです
  • AWS CLIiam list-role-policies ってマネージドポリシーはリストアップされないのですな