52

我创建了 Amazon elasticsearch 服务并使用已安装在 EC2 实例上的 logstash 将数据填充到其中。在 Amazon elasticservice 控制台页面,会有一个访问 Kibana 的链接。

search-cluster_name-XXXXXXXXXXXXXXXXXXX.region_name.es.amazonaws.com/_plugin/kibana/

当我点击链接时,浏览器抛出以下错误。

{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet on resource: arn:aws:es:region_name:account_id:domain/cluster_name/_plugin/kibana/"}

我确定这与 ES 域的访问策略有关。我应该如何修改我的访问策略,以便我可以通过单击指定的链接访问 Kibana?

4

5 回答 5

30

您可以使用基于 IAM 和 IP 地址的访问设置访问策略。 在这里查看我的答案。简而言之:

  • EC2 实例需要带有 arn:aws:iam::aws:policy/AmazonESFullAccess策略的配置文件
  • 策略应包括两个语句:第一个列出 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"
          ]
        }
      }
    }
  ]
}
于 2015-12-02T23:56:53.067 回答
18

为此,我使用了名为aws-es-kibana 的代理工具。它会签署您发送到 aws kibana 的所有请求。

IAM 配置:

我创建了具有编程访问权限的新 IAM 用户“elasticsearch_user”(并且我获得了与该帐户关联的 accessKeyId 和 secretAccessKey)。

弹性搜索配置:

我创建了允许新创建的 IAM 用户访问的弹性搜索策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::{YOUR_AWS_ACCOUNT_ID}:user/elasticsearch_user"
        ]
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:eu-central-1:{YOUR_AWS_ACCOUNT_ID}:domain/{YOUR_ELASTICSEARCH_DOMAIN}/*"
    }
  ]
}

从本地站点连接到 kibana:

要从我的本地站(Windows)连接到 kibana,我只需要输入控制台:

SET AWS_ACCESS_KEY_ID=myAccessKeyId
SET AWS_SECRET_ACCESS_KEY=mySecretAccessKey

aws-es-kibana search-{PROTECTED_PART_OF_YOUR_ELASTICSEARCH_ENDPOINT}.eu-central-1.es.amazonaws.com

之后,您应该在以下位置代理访问您的 kibana:http: //127.0.0.1 :9200/_plugin/kibana

于 2017-06-06T19:45:43.757 回答
6

您必须为您的 elasticsearch 集群配置访问策略。有两种选择:

  1. 设置基于 IAM 的访问策略
  2. 将人们可以访问您的 Kibana 实例的某些 IP 列入白名单。

选项 1,使用基于 IAM 的访问是更好的选择:

  • 创建一个 IAM 用户,kibana_user以编程访问方式调用。保存 accessKeyId 和 secretAccessKey。同时复制用户的 ARN
  • 配置您的访问策略以授予对kibana_user.
    • 转到https://eu-central-1.console.aws.amazon.com/es/
    • 选择您的弹性搜索域
    • 点击“修改访问策略”
    • 单击“选择模板”并使用名为“允许访问一个或多个 AWS 账户或 IAM 用户”的模板。输入 ARNkibana_user 这是它的样子
  • 不幸的是,AWS 没有提供以该用户身份登录然后连接到 Kiabana 的方法。相反,如果希望您使用该用户的密钥对您向 Kibana 发出的 HTTP 请求进行签名。有一些工具可以为您执行此操作,例如aws-es-proxy

我强烈建议不要使用基于 IP 的访问的第二种选择。即使你有一个静态IP,

  • 该 IP 上的每个人都可以访问您在 elasticesarch 上的数据
  • 只有通过该 API 连接,您才能访问。不是来自您的手机,也不是来自家里。

唯一有意义的情况是,如果您使用自己的身份验证方法和静态 IP 运行自己的代理服务器。

于 2017-10-04T21:11:24.870 回答
4

就我而言,我有一个 nginx 服务器正在运行,它已经可以访问弹性搜索服务。所以我所要做的就是在这个 nginx 上添加一个代理。无需更改 AWS IAM。

将此添加到 /etc/nginx/sites-enabled/elasticsearch

server {
  listen   7777;
  server_name  127.0.0.1 default_server;
  access_log  /var/log/nginx/elasticsearch.access.log;
  location / {
    auth_basic "My Super Secret Server";
    auth_basic_user_file /etc/nginx/.elasticsearch_htpasswd;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_pass         https://<your_server_here>.es.amazonaws.com/;
        proxy_set_header Authorization "";
        proxy_hide_header Authorization;
  }
}

并重新启动 nginx。然后您可以在以下位置访问 kibana:

http://your_nginx_server_name.com:7777/_plugin/kibana/app/kibana#/dev_tools/console?_g=()

该文件/etc/nginx/.elasticsearch_htpasswd是标准的 apache2 htaccess 文件。您可以在此处找到有关 nginx 基本身份验证的更多信息。

注意:基本身份验证不是保护任何东西的推荐方法。绝对不要在生产中使用它。

于 2017-07-14T14:49:57.890 回答
0

您可能需要拥有基于 IP 的策略并允许从特定 IP(Kibana 的)访问您的域。

其他选项(除了将访问策略更改为完全开放之外)将签署请求 - IIRC 这帮助了我的一个朋友提供了类似的信息。

http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-managedomains.html#es-managedomains-signing-service-requests

另请参阅同一页面上的“将本地 Kibana 服务器连接到 Amazon Elasticsearch Service”。

于 2015-11-17T16:09:43.030 回答