AWS ElasticSearch Logstash 403 禁止访问
AWS ElasticSearch Logstash 403 Forbidden Access
MySQL 和 elasticsearch 托管在 aws 上。 ec2 上的 logstash 是 运行。我没有使用 VPC.I 可以在本地或在我的 ec2 上连接到 MySQL。
稍微修改一下问题。这是我的 ec2 中的新 logstash 文件。 我的 es2 实例未通过 SSL 认证,这有问题吗?
input {
jdbc {
jdbc_connection_string => "jdbc:mysql://aws.xxxxx.us-east-1.rds.amazonaws.com:3306/stuffed?user=admin&password=pword"
jdbc_user => "admin"
jdbc_password => "pword"
schedule => "* * * * *"
jdbc_validate_connection => true
jdbc_driver_library => "mysql-connector-java-8.0.19.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
statement => "SELECT * from foo"
type => "foo"
tags => ["foo"]
}
jdbc {
jdbc_connection_string => "jdbc:mysql://aws.xxxxx.us-east-1.rds.amazonaws.com:3306/stuffed?user=admin&password=pword"
jdbc_user => "admin"
jdbc_password => "pword"
schedule => "* * * * *"
jdbc_validate_connection => true
jdbc_driver_library => "mysql-connector-java-8.0.19.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
statement => "SELECT * from cat"
type => "cat"
tags => ["cat"]
}
jdbc {
jdbc_connection_string => "jdbc:mysql://aws.xxxxx.us-east-1.rds.amazonaws.com:3306/stuffed?user=admin&password=pword"
jdbc_user => "admin"
jdbc_password => "pword"
schedule => "* * * * *"
jdbc_validate_connection => true
jdbc_driver_library => "mysql-connector-java-8.0.19.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
statement => "SELECT * from rest"
type => "rest"
tags => ["rest"]
}
}
output {
stdout { codec => json_lines }
if "foo" in [tags] {
amazon_es {
hosts => ["https://es1.stuffed-es-mysql.us-east-1.es.amazonaws.com"]
index => "foo"
region => "us-east-1"
aws_access_key_id => "id"
aws_secret_access_key => "key"
document_type => "foo-%{+YYYY.MM.dd}"
}
}
if "cat" in [tags] {
amazon_es {
hosts => ["https://es1.stuffed-es-mysql.us-east-1.es.amazonaws.com"]
index => "cat"
region => "us-east-1"
aws_access_key_id => "id"
aws_secret_access_key => "key"
document_type => "cat-%{+YYYY.MM.dd}"
}
}
if "rest" in [tags] {
amazon_es {
hosts => ["https://es1.stuffed-es-mysql.us-east-1.es.amazonaws.com"]
index => "rest"
region => "us-east-1"
aws_access_key_id => "id"
aws_secret_access_key => "key"
document_type => "rest-%{+YYYY.MM.dd}"
}
}
}
现在我遇到的问题是 403 禁止错误。
我确实在 AWS 中创建了一个具有 AmazonESFullAccess(AWS 托管策略)权限的用户。我不知道还能做什么。我没有使用 VPC,我试图避免这种情况。所以我想坚持使用 public 访问权限。
我尝试根据本指南创建新的 ElasticSearch 服务:https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg.html
但我得到一个错误 error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [https://user:xxxxxx@mysql-abcdefghijkl.us-east-1.es.amazonaws.com:9200/]
并且此实例的 logstash 输出是:
elasticsearch {
hosts => ["https://es-mysql.us-east-1.es.amazonaws.com/"]
index => "category"
user => "user"
password => "password"
document_type => "cat-%{+YYYY.MM.dd}"
}
显然这不是首选方法,但我真的只是想设置一个 dev/personal 环境。
此外,我可以使用此实例登录 Kibana。
访问政策
对于第一个弹性搜索服务:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111:user/root"
},
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:11111111:domain/stuffed-es-mysql/*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:166216189490:domain/stuffed-es-mysql/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"11.11.11.111",
"111.111.1.111",
"111.111.1.1",
"1.11.111.111",
]
}
}
}
]
}
对于我创建的第二个 ElasticSearch 服务:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:xxxxxxxxx:domain/es-mysql/*"
}
]
}
所以我解决了两个问题。
问题一:我与 RDS 的 logstash 输入连接仍然有问题(这不是 posted 的问题,但我想我'无论如何分享):
问题:
RDS MySQL 实例版本错误。它被 AWS (5.7) 设置为推荐值,我需要最新的 8.0.*。这导致 jdbc 无法正常工作。
解决方案:
将 RDS MySQL 实例更新为 8.0.17。现在我的 logstash 能够读取来自 MySQL RDS 的输入。
问题二:我的 logstash 的输出不工作。
问题:
收到 403 禁止错误。
解决方案:
在设置 ES 服务时删除了 https 要求。这很可能对我有用,因为我的 ec2 没有经过 ssl 认证。
问题二的解决方案之前在我的post中被质疑过。作为 ec2 和弹性搜索服务 (AWS) 上的 logstash 设置的新手,我并没有按照自己的直觉行事。但是,我在设置 ES 服务时删除了 https 要求。是的,这不是最好的主意,但这是一个开发环境。这解决了这个问题。为什么?因为我的 ec2 服务没有经过 ssl 认证。这是有道理的。 403 错误的常见问题之一是源正在向 SSL 认证目标发送请求。
我认为对于想要 运行 预算有限但被忽视的人来说,这是一个常见问题。大多数人想跳转到您的访问策略、IP 策略或安全组,这是可以理解的。
MySQL 和 elasticsearch 托管在 aws 上。 ec2 上的 logstash 是 运行。我没有使用 VPC.I 可以在本地或在我的 ec2 上连接到 MySQL。
稍微修改一下问题。这是我的 ec2 中的新 logstash 文件。 我的 es2 实例未通过 SSL 认证,这有问题吗?
input {
jdbc {
jdbc_connection_string => "jdbc:mysql://aws.xxxxx.us-east-1.rds.amazonaws.com:3306/stuffed?user=admin&password=pword"
jdbc_user => "admin"
jdbc_password => "pword"
schedule => "* * * * *"
jdbc_validate_connection => true
jdbc_driver_library => "mysql-connector-java-8.0.19.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
statement => "SELECT * from foo"
type => "foo"
tags => ["foo"]
}
jdbc {
jdbc_connection_string => "jdbc:mysql://aws.xxxxx.us-east-1.rds.amazonaws.com:3306/stuffed?user=admin&password=pword"
jdbc_user => "admin"
jdbc_password => "pword"
schedule => "* * * * *"
jdbc_validate_connection => true
jdbc_driver_library => "mysql-connector-java-8.0.19.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
statement => "SELECT * from cat"
type => "cat"
tags => ["cat"]
}
jdbc {
jdbc_connection_string => "jdbc:mysql://aws.xxxxx.us-east-1.rds.amazonaws.com:3306/stuffed?user=admin&password=pword"
jdbc_user => "admin"
jdbc_password => "pword"
schedule => "* * * * *"
jdbc_validate_connection => true
jdbc_driver_library => "mysql-connector-java-8.0.19.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
statement => "SELECT * from rest"
type => "rest"
tags => ["rest"]
}
}
output {
stdout { codec => json_lines }
if "foo" in [tags] {
amazon_es {
hosts => ["https://es1.stuffed-es-mysql.us-east-1.es.amazonaws.com"]
index => "foo"
region => "us-east-1"
aws_access_key_id => "id"
aws_secret_access_key => "key"
document_type => "foo-%{+YYYY.MM.dd}"
}
}
if "cat" in [tags] {
amazon_es {
hosts => ["https://es1.stuffed-es-mysql.us-east-1.es.amazonaws.com"]
index => "cat"
region => "us-east-1"
aws_access_key_id => "id"
aws_secret_access_key => "key"
document_type => "cat-%{+YYYY.MM.dd}"
}
}
if "rest" in [tags] {
amazon_es {
hosts => ["https://es1.stuffed-es-mysql.us-east-1.es.amazonaws.com"]
index => "rest"
region => "us-east-1"
aws_access_key_id => "id"
aws_secret_access_key => "key"
document_type => "rest-%{+YYYY.MM.dd}"
}
}
}
现在我遇到的问题是 403 禁止错误。
我确实在 AWS 中创建了一个具有 AmazonESFullAccess(AWS 托管策略)权限的用户。我不知道还能做什么。我没有使用 VPC,我试图避免这种情况。所以我想坚持使用 public 访问权限。
我尝试根据本指南创建新的 ElasticSearch 服务:https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg.html
但我得到一个错误 error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [https://user:xxxxxx@mysql-abcdefghijkl.us-east-1.es.amazonaws.com:9200/]
并且此实例的 logstash 输出是:
elasticsearch {
hosts => ["https://es-mysql.us-east-1.es.amazonaws.com/"]
index => "category"
user => "user"
password => "password"
document_type => "cat-%{+YYYY.MM.dd}"
}
显然这不是首选方法,但我真的只是想设置一个 dev/personal 环境。
此外,我可以使用此实例登录 Kibana。
访问政策
对于第一个弹性搜索服务:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111:user/root"
},
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:11111111:domain/stuffed-es-mysql/*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:166216189490:domain/stuffed-es-mysql/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"11.11.11.111",
"111.111.1.111",
"111.111.1.1",
"1.11.111.111",
]
}
}
}
]
}
对于我创建的第二个 ElasticSearch 服务:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:xxxxxxxxx:domain/es-mysql/*"
}
]
}
所以我解决了两个问题。
问题一:我与 RDS 的 logstash 输入连接仍然有问题(这不是 posted 的问题,但我想我'无论如何分享):
问题:
RDS MySQL 实例版本错误。它被 AWS (5.7) 设置为推荐值,我需要最新的 8.0.*。这导致 jdbc 无法正常工作。
解决方案:
将 RDS MySQL 实例更新为 8.0.17。现在我的 logstash 能够读取来自 MySQL RDS 的输入。
问题二:我的 logstash 的输出不工作。
问题:
收到 403 禁止错误。
解决方案:
在设置 ES 服务时删除了 https 要求。这很可能对我有用,因为我的 ec2 没有经过 ssl 认证。
问题二的解决方案之前在我的post中被质疑过。作为 ec2 和弹性搜索服务 (AWS) 上的 logstash 设置的新手,我并没有按照自己的直觉行事。但是,我在设置 ES 服务时删除了 https 要求。是的,这不是最好的主意,但这是一个开发环境。这解决了这个问题。为什么?因为我的 ec2 服务没有经过 ssl 认证。这是有道理的。 403 错误的常见问题之一是源正在向 SSL 认证目标发送请求。
我认为对于想要 运行 预算有限但被忽视的人来说,这是一个常见问题。大多数人想跳转到您的访问策略、IP 策略或安全组,这是可以理解的。