Amazon Elastic Search Clusterの適切なアクセスポリシー


99

最近、新しい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] /“}

これが機能するためにアクセスポリシーで何を変更する必要があるかを誰かが知っていますか?


14
ElasticSearchアクセスポリシーの変更は、ほとんど瞬時に行われる他のIAM変更とは異なり、適用に時間がかかりますので注意してください。「処理」に気付かずに「適用」をクリックしてタブを切り替えるだけの簡単な方法です
Cyril Duchon-Doris

回答:


63

アクセスを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にアクセスできます。


こんにちは、IAMベースのポリシーを使用している場合のみ、プラグインを使用する必要があります。アクセスポリシーがIPアドレスに基づいている場合は、Logstashの標準のelasticsearchプラグインを使用できます。その場合も、インスタンスプロファイルは必要ありません。また、ESサービスはVPCでは使用できません。接続するにはパブリックIPアドレスを使用する必要があります。192.168アドレスへの参照が他のアドレスの代替であるかどうかはわかりませんが、誤解を招く可能性があります。
Garreth McDaid

aws:SourceIp私の例でのはあなたがKibanaを使用することができますので、あなたの個人的なワークステーションIPであることを意図しています。IAM制限付きアクセスにより、特定のインスタンスまたはCIDRブロックに属するIPを気にすることなく、1つ以上のEC2インスタンスがElasticsearchに書き込むことができます。
Pete

1
VPCのプライベート IP CIDR範囲への制限が機能していないように見えることは注目に値します。ESはVPC内などでは動作しません。
sventechie 2016年

回答にサンプルポリシーを記載していただきありがとうございます。aws:SourceIpあなたが与えた例のように、私がスカラー値から配列に切り替えるまで、私は恐ろしい「ユーザー:匿名」エラーを乗り越えることができませんでした。(私がCIDR表記です。それが他の誰かを助ける場合)。AWSESのポリシーを設定するプロセス全体は、すべてのポリシー変更によってクラスターが20分間神秘的な「処理」状態にならない場合、それほど苛立たしくありません。ポリシーは、石の錠剤、またはそれが何をしているかに注意深く刻まれています。
ロバートカルホーン

38

AWS docによると、あなた(と私)がテストしたばかりなので、AWS ESドメインへのアクセスをrole / account / user / ...に制限することはできません。

curlなどの標準クライアントは、IDベースのアクセスポリシーに必要な要求署名を実行できません。この手順の手順を正常に実行するには、匿名アクセスを許可するIPアドレスベースのアクセスポリシーを使用する必要があります。(http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html

したがって、基本的に2つのソリューションがあります。

リクエストに署名することは、アクセスポリシーをそのまま維持したい場合(IPに制限するよりも柔軟です)、おそらく最善の解決策ですが、少し複雑なようです。これまで試したことがないので、役立つドキュメントが見つかりません。


3
ラップトップのパブリックIPアドレスを使用して、curl / browserでエンドポイントにアクセスしようとしましたが、それでもUser:anonymousエラーが発生します。
Anant Gupta

7
私は同じ問題を扱っています。また、aws elasticsearchによる変更の処理には非常に時間がかかることに気づきました。
nemo 2015年

2つのステートメントでアクセスポリシーを設定します。1つはログを書き込むためのIAMアクセス用、もう1つはKIbanaを表示するためのIP制限付きアクセス用です。 詳細については私の回答を参照してください
ピート

2
「loooong」が分、時間、または日を意味するかどうか疑問に思いました。その10〜15分のように見えます。あなたは、他に、アップデートが完了した場合ときは、「アクティブ」あなたのES(緑の状態をチェックすることをオレンジ色の「準備」のようなものを見ることができます。
Balmipour

同じ問題があり、検索したところ、この便利なライブラリが見つかりました。
gmajivu


1

エラスティック検索ポリシーで完全なユーザー名を入力するだけです。

この場合、エラーメッセージ自体から完全なユーザー名を取得できます。私の場合:「arn:aws:sts :: [ACCOUNT_ID]:assumed-role / [LAMBDA_POLICY_NAME] / [LAMBDA_NAME]」

    {
        "Version": "2012-10-17",
        "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws:sts::xxxxxxxxxxxx:assumed-role/[lambda-role]/[full-lambda-name]"
            ]
          },
          "Action": "es:*",
          "Resource": "arn:aws:es:[region]:xxxxxxxxxxxxx:domain/[elasticsearch-domain-name]/*"
        }
      ]

    }


0

ロールARNを変更する必要があります。「arn:aws:iam :: [ACCOUNT_ID]:role / service-role / my_es_role」のようになります。


-2

私もこれをやろうとしており、Allow access to the domain from specific IP(s)EC2インスタンスのElastic IPのオプションを使用してそれを動作させました(インスタンスのプライベートIPを使用しても動作する可能性がありますが、確信が持てません)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.