如何从 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 这帮助了我的一个朋友提供类似的信息。
另请参阅同一页上的 "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 集群配置访问策略。有两个选项:
- 设置基于 IAM 的访问策略
- 将某些 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。
我创建了 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 这帮助了我的一个朋友提供类似的信息。
另请参阅同一页上的 "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 集群配置访问策略。有两个选项:
- 设置基于 IAM 的访问策略
- 将某些 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。