web-dev-qa-db-ja.com

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

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

これが機能するために、アクセスポリシーで何を変更する必要があるか、誰にもわかりますか?

93
hartfordfive

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

58
Pete

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

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

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

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

36
Olivier

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

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

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

5
Philippe Oger

IPベースのポリシーではなく、リソースベースのポリシーまたはIDベースのポリシーを使用できます。これは、IPアドレスをハードコーディングするようなものです。

ただし、署名バージョン4を使用してリクエストに署名する必要があります

Javaの実装については、 http://mytechbites.blogspot.in/2017/04/secure-Amazon-elastic-search-service.html を参照してください。