如何从 Amazon elasticsearch 服务访问 Kibana?

How to access Kibana from Amazon elasticsearch service?

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

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

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

{"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 domain.How 的访问策略有关,我是否应该修改我的访问策略以便我可以通过单击指定的 link 来访问 Kibana?

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

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

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

另请参阅同一页上的 "Connecting a Local Kibana Server to Amazon Elasticsearch Service"。

您可以使用基于 IAM 和 IP 地址的访问设置访问策略。 See my answer here。简而言之:

  • 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"
          ]
        }
      }
    }
  ]
}

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

IAM 配置:

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

Elasticsearch 配置:

我创建了允许新创建的 IAM 用户访问的 elasticsearch 策略:

{
  "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

就我而言,我有一个 nginx 服务器 运行,它已经可以访问 elasticsearch 服务。所以我所要做的就是在这个 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 here.

基本身份验证的更多信息

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

您必须为 elasticsearch 集群配置访问策略。有两个选项:

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

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

  • 创建一个 IAM 用户,名为 kibana_user,具有编程访问权限。保存 accessKeyId 和 secretAccessKey。同时复制 user's ARN
  • Configure your access policy 授予对 kibana_user 的访问权限。
    • 转到https://eu-central-1.console.aws.amazon.com/es/
    • Select 你的 elasticsearch 域
    • 点击"Modify access policty"
    • 单击 "Select a template" 并使用名为 "Allow access to one or more AWS accounts or IAM users" 的那个。输入 kibana_user
    • 的 ARN
  • 遗憾的是,AWS 不提供以该用户身份登录然后连接到 Kiabana 的方法。相反,如果您希望您使用该用户的密钥签署您向 Kibana 发出的 HTTP 请求。有一些工具可以为您执行此操作,例如 aws-es-proxy

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

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

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