web-dev-qa-db-ja.com

AWS Elasticsearch Service IAMロールベースのアクセスポリシー

EC2インスタンスからAmazon ESサービスと通信する方法を見つけるのに苦労しています。

ドキュメントには、Amazon ESサービスがIAMユーザーおよびロールベースのアクセスポリシーをサポートしていることが明確に記載されています。 http://docs.aws.Amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-access-policies

ただし、ESドメインにこのアクセスポリシーがある場合:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789:role/my-ec2-role"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-west-2:123456789:domain/myDomain/*"
    }
  ]
}

Ec2インスタンスにログインしてcurlを実行してelasticsearchクラスターにアクセスできません。

_search APIの単純なカールをしようとしています:

curl "http://search-myDomain.es.amazonaws.com/_search"

認証エラー応答を生成します。

{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet on resource: arn:aws:es:us-west-2:123456789:domain/myDomain/_search"}

念のため、IAMロールにAmazonESFullAccessポリシーを追加しましたが、まだ機能しません。

IAMロールを使用するec2インスタンスからElasticsearchとプログラムで対話できることは、Amazon ESサービスで何かを達成するために不可欠であるため、何かが欠けているに違いありません。

また、ドキュメントでこの矛盾した声明を見ています。

IAMベースのポリシーの例Amazon ESコンソールではなくAWS IAMコンソールを使用して、IAMベースのアクセスポリシーを作成します。 IAMベースのアクセスポリシーの作成については、IAMのドキュメントを参照してください。

IAMドキュメントへのリンクは、IAMのホームページへのリンクであり、その方法に関する情報はまったく含まれていません。誰かが私のための解決策を手に入れましたか?

24
nackjicholson

AWSでIAMサービスを使用する場合、リクエストに署名する必要があります。 curlは、署名された要求(要求のハッシュと要求のヘッダーへのパラメーターの追加で構成されます)をサポートしません。署名アルゴリズムが組み込まれたSDKのいずれかを使用して、その要求を送信できます。

参照: http://docs.aws.Amazon.com/elasticsearch-service/latest/developerguide/what-is-Amazon-elasticsearch-service.html#signing-requests

一般的な言語のSDKは次の場所にあります: http://aws.Amazon.com/tools/

12
burn0050

最初に、ESインスタンスをカールするためにEC2インスタンスにログインできないと言いましたか?ログインできませんか?または、EC2からカールできませんか?

Elasticsearch(Service)インスタンスを世界に公開し(何も設定せずに)、署名せずに問題なくカールすることができます。テストするためにアクセスポリシーを変更しましたが、残念なことに、変更後に再びアクセスするには永遠に時間がかかります...

私のポリシーは次のようになります。

{   "Version": "2012-10-17",   "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:843348267853:domain/myDomain/*"
    },
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:843348267853:domain/myDomain"
    }   
   ] 
}

これはまさにあなたが望むものではないことを理解していますが、これから始めて(世界に開かれています)、AWSの外部からカールしてテストします。次に、問題を分離できるように制限します。

また、アクセスポリシーの「プリンシパル」に問題があると思います。 EC2ロールがあります。なぜあなたがそれをしているのか理解していますが、プリンシパルにはロールではなくユーザーが必要だと思います。

下記参照:

http://docs.aws.Amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-access-policies

主要な

リソースへのアクセスを許可または拒否するAWSアカウントまたはIAMユーザーを指定します。ワイルドカード(*)を指定すると、ドメインへの匿名アクセスが有効になりますが、これは推奨されません。匿名アクセスを有効にする場合は、IPベースの条件を追加して、どのIPアドレスがAmazon ESドメインにリクエストを送信できるかを制限することを強くお勧めします。

EDIT 1

明確にするために、AmazonESFullAccessポリシーをmy-ec2-roleに追加しましたか? IAMアクセスポリシーを使用する場合、リソースベースのポリシーをアタッチすることはできないと思います(これはあなたがしていることです)。

http://docs.aws.Amazon.com/IAM/latest/UserGuide/id_roles_compare-resource-policies.html

一部のAWSサービスでは、リソースへのクロスアカウントアクセスを許可できます。これを行うには、ロールをプロキシとして使用する代わりに、共有するリソースにポリシーを直接添付します。共有するリソースは、リソースベースのポリシーをサポートする必要があります。ユーザーベースのポリシーとは異なり、リソースベースのポリシーでは、誰が(AWSアカウントID番号のリストの形式で)そのリソースにアクセスできるかを指定します。

アクセスポリシーを完全に削除してみますか?

6
Brooks

エラスティックIPでプロキシを作成せず、プロキシがESにアクセスできるようにするのはなぜですか?基本的に、ESでのアクセスを制限できる3つのフォームがあります。

  • 全員を許可する
  • ホワイトIPリスト
  • AWSが提供するアクセスキーとシークレットキーに署名する。

私は2つのフォームを使用しています。PHPアプリではESへの接続の背後でプロキシを使用することを好み、nodejsアプリではhttp-aws-esノードモジュールを使用してリクエストに署名することを好みます。ユーザーがレポートを表示するにはkibanaインターフェイスにアクセスする必要があるため、プロキシ環境を作成すると便利です。また、ブラウザでプロキシを構成しているため可能です=)

ESインデックスへのアクセスを閉じることをお勧めする必要があります。削除するのは非常に簡単なので、curl -XDELETE https:// your_es_address/index 誰でもできますが、「どうやって他のユーザーは私のESアドレスを取得しますか?」そして、私はあなたに答えます:「薄暗さに基づくセキュリティは本当のセキュリティではありません」

私のセキュリティアクセスポリシーは基本的に次のようなものです。

http://Pastebin.com/EUKT1ekX

2
nullck

最近この問題に遭遇しましたが、根本的な問題は、Amazon SDKのいずれも、検索、プットなどのElasticsearch操作の呼び出しをまだサポートしていないことです。

現時点で唯一の回避策は、署名済みリクエストを使用してエンドポイントに対して直接リクエストを実行することです: http://docs.aws.Amazon.com/general/latest/gr/sigv4-signed-request-examples.html

ここの例はEC2を呼び出すためのものですが、Elasticsearchを呼び出す代わりに変更できます。 「サービス」値を「es」に変更するだけです。そこから、次の値を入力する必要があります

  • エンドポイント(要求パラメーターなしの操作を含むクラスターの完全なURL)
  • ホスト(https://と/ _statusなどの正規URIの間の部分
  • 最初の/を含む(/ _statusなど)後のURIであるが、クエリ文字列を含まない正規のuri
  • リクエストパラメータ(以降のすべて?)

アクセスキーとシークレットキーをさまざまな署名呼び出し(この例ではaccess_keyとsecret_key)に渡すことを前提としているため、これまでAWSの認証情報を使用してこれを機能させることができました。 shouldIAMロールを使用して実行できますが、最初にセキュリティトークンサービスを呼び出して、リクエストに署名するために使用できる一時的な認証情報を取得する必要があります。それまでは、Elasticsearchクラスターのアクセスポリシーを編集して、ユーザーの資格情報(user /

1
life359