用Python客户端在Amazon Elasticsearch服务中创建IAM账户并安全访问

亚马逊 Elasticsearch 服务允许使用 IAM 或 IP 地址进行访问控制。一开始我是通过 IP 地址过滤进行操作的,但考虑到未来可能陷入困境,所以改用了 IAM。

另外,由于需要等待大约20分钟才能反映在 Amazon Elasticsearch 服务的访问策略更改上,这实在很麻烦。所以,我认为尽早进行 IAM (身份和访问管理)转换会更轻松一些。(在等待反映期间,服务仍可使用)

创建IAM用户

我正在 IAM 用户页面
https://console.aws.amazon.com/iam/home#users
中创建一个“新用户”
→ 我会随意创建一个

完成后,点击”显示用户安全认证信息”链接,并记录帐户名、访问密钥 ID 和密钥。

如果可以的话,请在左侧选项卡中显示“用户”页面,并选择先前创建的用户。
将显示“用户的ARN”,请也将其复制下来。

这种类型的 → arn:aws:iam::000000000000:user/xxxxxxxxxxxxx

创建 Elasticsearch 访问策略

Amazon Elasticsearch Service的控制台
https://ap-northeast-1.console.aws.amazon.com/es/home

打开应用,选择域名。

修改访问策略 → 选择一个模板 → 允许或拒绝对一个或多个AWS账户或IAM用户的访问选项。

作用:允许在 Account ID 或 ARN 上,粘贴先前的 ARN。

生成访问政策的 JSON,然后点击「提交」→「确定」按钮。

再次打开访问策略修改页面后,状态将显示为正在处理。在反映完成后,此处将变为激活状态(无需刷新浏览器)。大约需要20分钟。

如果也允许使用IP地址的话

如果按照这个步骤创建访问策略,没有进行 IAM 认证就无法访问 ES,所以如果想从浏览器中访问 Kibana 会有一些麻烦。因此,使用 OR 条件来允许访问 Kibana 的 IP 地址可能更方便实用。

将策略添加到访问策略的声明列表中。
(上面的是IP地址白名单,下面的是使用IAM进行控制)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "000.000.000.000"
          ]
        }
      },
      "Resource": "arn:aws:es:ap-northeast-1:000000000000:domain/hogehoge/*"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::000000000000:user/xxxxxxxxxxxxx"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:ap-northeast-1:000000000000:domain/hogehoge/*"
    }
  ]
}

编写测试脚本

请参考这个 Issue:https://github.com/elastic/elasticsearch-py/issues/280

请安装所需的库。

$ pip install elasticsearch requests_aws4auth

也许还需要使用requests库。在我的环境中已经安装了,所以不确定是否需要。

编码

import elasticsearch
from requests_aws4auth import AWS4Auth

host = 'xxxxxxxx.ap-northeast-1.es.amazonaws.com'
awsauth = AWS4Auth(
    'アクセスキーID',
    'シークレットアクセスキー', 'ap-northeast-1', 'es')

es = elasticsearch.Elasticsearch(
    hosts=[{'host': host, 'port': 443}],
    http_auth=awsauth,
    use_ssl=True,
    verify_certs=True,
    connection_class=elasticsearch.connection.RequestsHttpConnection
)
print(es.info())
print(es.cluster.health())

我会在之前的AWS Elasticsearch访问策略页面上等待”Status”变为”Active”。您可以保持页面打开并等待,无需频繁刷新浏览器。

在融入前

elasticsearch.exceptions.AuthorizationException: TransportError(403, '{"Message":"User: arn:aws:iam::000000000000:user/xxxxxxxxxxxxx is not authorized to perform: es:ESHttpGet on resource: arn:aws:es:ap-northeast-1:000000000000:domain/hogehoge/"}')

发生了这个错误。

状态变为活跃后

{'version': {'lucene_version': '4.10.4', 'build_timestamp': '2015-04-27T09:21:06Z', 'build_snapshot': False, 'build_hash': '62ff9868b4c8a0c45860bebb259e21980778ab1c', 'number': '1.5.2'}, 'status': 200, 'cluster_name': '000000000000:hedgehoge', 'tagline': 'You Know, for Search', 'name': 'Ororo Munroe'}
{'active_primary_shards': 11, 'number_of_pending_tasks': 0, 'cluster_name': '000000000000:hedgehoge', 'relocating_shards': 0, 'active_shards': 11, 'status': 'yellow', 'timed_out': False, 'number_of_nodes': 1, 'unassigned_shards': 11, 'number_of_data_nodes': 1, 'initializing_shards': 0}

收到了结果?

…建筑古老… …)

广告
将在 10 秒后关闭
bannerAds