当策略强制执行 KMS SSE 时,Logstash 无法访问 S3
Logstash fails to access S3 when KMS SSE is enforced by policy
我 运行 Filebeats 在许多容器化服务上收集日志并将它们发送到 logstash(v5.3.1) 容器,后者又将它们上传到 aws S3。
我启用了使用默认 kms 的服务器端加密来加密静态日志,它工作正常。但是,当我添加一个存储桶策略时,如果未启用 kms sse 则拒绝访问 logstash 失败并显示错误:
错误 logstash.outputs.s3 - 验证存储桶写入权限时出错! {:消息=>"Access Denied",:class=>"Aws::S3::Errors::AccessDenied"}
一旦我从策略中删除拒绝部分,它就会再次起作用。
Logstash 输出配置如下:
output {
s3{
server_side_encryption => true
server_side_encryption_algorithm => "aws:kms"
region => "XXXXXX"
bucket => "XXXXX"
prefix => "XXXXXXXX"
}
}
S3 存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": “Logging bucket",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::XXXXXXXXXXX:root"
]
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucket_name_12343456/*”
},
{
"Sid": "DenyIncorrectEncryptionHeader",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::bucket_name_12343456/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "aws:kms"
}
}
},
{
"Sid": "DenyUnEncryptedObjectUploads",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::bucket_name_12343456/*",
"Condition": {
"Null": {
"s3:x-amz-server-side-encryption": "true"
}
}
}
]
}
奇怪的是,当我删除上述策略的拒绝*部分时,它起作用了:文件被写入 S3 存储桶并被标记为:
服务器端加密
AWS-KMS
KMS 密钥 ID
XXXXXXXXXXX
最后我做了一个测试,就是简单地调用 aws cp 加密,这个调用成功了!
我遇到了类似的问题。我相信发生这种情况是因为在启动期间,logstash 尝试通过将测试文件放在存储桶的根目录(忽略加密设置)并随后再次删除它来验证它是否有足够的权限写入存储桶。
您可以通过将 validate_credentials_on_root_bucket => false
添加到您的输出配置来禁用此行为。对我来说,这解决了问题。
我 运行 Filebeats 在许多容器化服务上收集日志并将它们发送到 logstash(v5.3.1) 容器,后者又将它们上传到 aws S3。
我启用了使用默认 kms 的服务器端加密来加密静态日志,它工作正常。但是,当我添加一个存储桶策略时,如果未启用 kms sse 则拒绝访问 logstash 失败并显示错误: 错误 logstash.outputs.s3 - 验证存储桶写入权限时出错! {:消息=>"Access Denied",:class=>"Aws::S3::Errors::AccessDenied"}
一旦我从策略中删除拒绝部分,它就会再次起作用。
Logstash 输出配置如下:
output {
s3{
server_side_encryption => true
server_side_encryption_algorithm => "aws:kms"
region => "XXXXXX"
bucket => "XXXXX"
prefix => "XXXXXXXX"
}
}
S3 存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": “Logging bucket",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::XXXXXXXXXXX:root"
]
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucket_name_12343456/*”
},
{
"Sid": "DenyIncorrectEncryptionHeader",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::bucket_name_12343456/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "aws:kms"
}
}
},
{
"Sid": "DenyUnEncryptedObjectUploads",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::bucket_name_12343456/*",
"Condition": {
"Null": {
"s3:x-amz-server-side-encryption": "true"
}
}
}
]
}
奇怪的是,当我删除上述策略的拒绝*部分时,它起作用了:文件被写入 S3 存储桶并被标记为: 服务器端加密 AWS-KMS KMS 密钥 ID XXXXXXXXXXX
最后我做了一个测试,就是简单地调用 aws cp 加密,这个调用成功了!
我遇到了类似的问题。我相信发生这种情况是因为在启动期间,logstash 尝试通过将测试文件放在存储桶的根目录(忽略加密设置)并随后再次删除它来验证它是否有足够的权限写入存储桶。
您可以通过将 validate_credentials_on_root_bucket => false
添加到您的输出配置来禁用此行为。对我来说,这解决了问题。