106

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

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

4

7 に答える 7

64

アクセスを 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"
          ]
        }
      }
    }
  ]
}

arn:aws:iam::aws:policy/AmazonESFullAccess 私の EC2 インスタンスには、ポリシーを持つインスタンス プロファイルがあります 。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 にアクセスできます。

于 2015-12-02T23:53:48.270 に答える
38

AWS doc によると、あなた (および私) がテストしたばかりのように、AWS ES ドメインへのアクセスをロール/アカウント/ユーザー/... に制限して、単純に cURL することはできません!

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

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

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

于 2015-10-07T09:43:27.313 に答える
6

パーティーには少し遅れましたが、リクエストに署名を追加することで、まったく同じ問題に対処することができました.

Python を使用している場合 (私のように)、次のライブラリを使用して実装を特に簡単にすることができます: https://github.com/DavidMuller/aws-requests-auth

それは私にとって完璧に機能しました。

于 2016-09-28T15:48:53.887 に答える
-2

私もこれをやろうとしていてAllow access to the domain from specific IP(s)、EC2 インスタンスの Elastic IP を使用するオプションを使用して機能させました (インスタンスのプライベート IP を使用して機能することもできますが、よくわかりません)。

于 2015-10-06T21:01:01.247 に答える