S3公共存储桶:启用访问日志同时限制日志文件夹仅所有者访问
问题
我有一个开启了公共只读访问权限的S3存储桶,同时启用了Server Access Logging(服务器访问日志)功能。因为担心匿名用户可以查看访问日志,我给/access-logs文件夹添加了拒绝策略,但添加Deny语句后服务器访问日志无法正常工作。请问有没有办法既能启用日志功能,又能把日志文件夹的访问权限仅限制给存储桶所有者?
原策略如下:
{ "Version": "2012-10-17", "Id": "S3-Console-Auto-Gen-Policy-1234567", "Statement": [ { "Sid": "S3PolicyStmt-DO-NOT-MODIFY-1234567", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::example-bucket/*" }, { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::example-bucket/*" }, { "Sid": "RestrictAccessLOgs", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::example-bucket/access-logs/*" } ] }
解决方案
核心思路是避免使用Deny语句(它会优先覆盖所有Allow权限,容易引发意外问题),而是缩小公共只读权限的范围,同时确保日志服务拥有专属的写入权限,具体调整方案如下:
调整后的桶策略
{ "Version": "2012-10-17", "Id": "S3-Console-Auto-Gen-Policy-1234567", "Statement": [ { "Sid": "AllowLoggingServicePut", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::example-bucket/access-logs/*" }, { "Sid": "PublicReadExceptLogs", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::example-bucket/*", "Condition": { "StringNotLike": { "s3:prefix": "access-logs/*" } } } ] }
策略说明
- 日志服务写入权限:第一条语句专门授权S3日志服务向
access-logs文件夹写入日志文件,权限范围精准限定,避免不必要的全局权限。 - 公共只读权限范围控制:第二条语句通过
StringNotLike条件,让公共只读权限仅对access-logs文件夹以外的对象生效,匿名用户无法读取日志文件,但不影响其他对象的公共访问。 - 所有者权限保障:存储桶所有者凭借AWS身份权限(无需额外桶策略配置),默认拥有对桶内所有对象的完全访问权限,包括日志文件。
额外提示:如果你的桶开启了Block Public Access设置,需确保没有完全阻止公共访问(因为你需要保留公共只读功能),同时确认没有阻止日志服务的写入权限。
内容的提问来源于stack exchange,提问作者Aiman Zaidi
相关产品推荐
相关产品推荐

