当策略强制执行 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 添加到您的输出配置来禁用此行为。对我来说,这解决了问题。