如何从 Amazon elasticsearch 服务访问 Kibana?

Posted

技术标签:

【中文标题】如何从 Amazon elasticsearch 服务访问 Kibana?【英文标题】:How to access Kibana from Amazon elasticsearch service? 【发布时间】:2016-02-18 12:11:06 【问题描述】:

我创建了 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?

【问题讨论】:

如果我按照您的建议更改访问策略,那么任何知道该 url 的人都可以访问它吗? 如果您想在 Web 浏览器中登录 Kibana URL,请使用主密码或使用 IAM 角色(但您也必须使用 Cognito),否则它会向您显示基本的浏览器中的身份验证登录表单不起作用。来自文档:如果您选择使用 IAM 进行用户管理,则必须为 Kibana 启用 Amazon Cognito 身份验证并使用来自您的用户池的凭证登录才能访问 Kibana。否则,Kibana 会显示一个不起作用的登录页面。 【参考方案1】:

您可以设置具有基于 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"
          ]
        
      
    
  ]

【讨论】:

谢谢,分离 Statment 对象是我出错的地方。 @pete 所以如果我的桌面 IP 是“192.168.1.66”,那么我应该以 192.168.1.66:9200/_plugin/kibana 的身份访问 kibana,这对我不起作用。 您将设置"aws:SourceIp": "192.168.1.66" 并通过the management console 中列为域的Kibana 端点的任何URL 访问Kibana。请注意,如果您的本地 IP 是 /actually/192.168.1.66,则您可能通过路由器连接到 Internet,您需要输入路由器的 IP。此外,仅在您的域状态为 Active 后进行测试(警告:每次更新策略可能需要 20 分钟)。 这似乎不再有效。现在结果为:UpdateElasticsearchDomainConfig: "message":"You can’t attach an IP-based policy to a domain that has a VPC endpoint. Instead, use a security group to control IP-based access."【参考方案2】:

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

IAM 配置:

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

Elasticsearch 配置:

我创建了弹性搜索策略,允许新创建的 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

【讨论】:

这太棒了!【参考方案3】:

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

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

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

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

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

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

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

【讨论】:

您的 IAM 代理代码在任何地方都可用吗?我是 Informa ken,正在将 AWS 密钥输入其他人的站点... 代码是封闭源代码(到目前为止)。但无论如何,AWS 凭证都存储在我的数据库中,所以无论如何你都必须信任我。如果你不想这样做,我完全理解。 YMMV...【参考方案4】:

在我的例子中,我有一个 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 的基本身份验证。

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

【讨论】:

感谢您的回答。它对我有用。但我有一个缩短 URL 的请求。有没有办法摆脱这部分 URL?:_plugin/kibana/app/kibana#/dev_tools/console?_g=() 我尝试将整个内容添加到 index.html 页面中,并将其放入 /etc/nginx/sites-enabled/elasticsearch。但是当我通过只提供 IP 地址在浏览器上进行检查时,它显示了 Elasticsearch 集群的详细信息。请建议我如何实现这一目标。再次感谢。【参考方案5】:

您可能需要基于 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”。

【讨论】:

以上是关于如何从 Amazon elasticsearch 服务访问 Kibana?的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Elasticsearch 集群的正确访问策略

如何通过 Amazon ElasticSearch 托管服务,对 VPC 中的网络流量进行实时监控

Django-Haystack 使用带有 IAM 凭证的 Amazon Elasticsearch 托管

ruby 在Heroku上使用Rails&searchkick gem安全地使用Amazon Elasticsearch(签名请求)。

通过 Cloud Formation 创建 Amazon Elasticsearch Service 时出现 CloudWatch 资源访问策略错误

AWS Elasticsearch Service IAM 基于角色的访问策略