如何从 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 资源访问策略错误