Remediates Amazon S3 bucket misconfigurations exposing sensitive data via Block Public Access enablement at account/bucket levels, policy/ACL audits, encryption enforcement, access logging, and AWS Config/Lambda automation.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
- 当 AWS Config 或 Security Hub 报告 S3 存储桶存在公开访问或缺少加密时
Remediates S3 bucket misconfigurations exposing data via public access, policies, ACLs, encryption gaps, and logging using AWS Config, Access Analyzer, Macie, and Lambda.
Identifies and remediates S3 bucket misconfigurations exposing data publicly via Block Public Access, policy/ACL audits, encryption, logging, and AWS Config/Lambda automation. For security reports, scans, audits, and incidents.
Audits AWS S3 bucket permissions using AWS CLI, S3audit, and Prowler to identify public access, permissive ACLs, policy misconfigurations, and missing encryption.
Share bugs, ideas, or general feedback.
不适用于:Azure Blob Storage 或 GCP Cloud Storage 错误配置修复、S3 数据分类(参见 implementing-cloud-dlp-policy),或与安全无关的 S3 访问模式分析。
使用多种检测方法识别具有公开访问的 S3 存储桶。依赖 AWS Config 规则、S3 Access Analyzer 和 Macie,而非手动检查。
# 启用 S3 Access Analyzer 进行外部访问检测
aws accessanalyzer create-analyzer \
--analyzer-name s3-analyzer \
--type ACCOUNT
# 列出所有具有公开访问指标的 S3 存储桶
aws s3api list-buckets --query 'Buckets[*].Name' --output text | while read bucket; do
public_status=$(aws s3api get-public-access-block --bucket "$bucket" 2>/dev/null)
if [ $? -ne 0 ]; then
echo "未启用公开访问阻止: $bucket"
fi
done
# 检查存储桶策略中是否存在公开访问授权
aws s3api list-buckets --query 'Buckets[*].Name' --output text | while read bucket; do
policy=$(aws s3api get-bucket-policy --bucket "$bucket" 2>/dev/null)
if echo "$policy" | grep -q '"Principal":"*"' 2>/dev/null; then
echo "检测到公开策略: $bucket"
fi
done
# 使用 AWS Config 查找不合规的存储桶
aws configservice get-compliance-details-by-config-rule \
--config-rule-name s3-bucket-public-read-prohibited \
--compliance-types NON_COMPLIANT \
--query 'EvaluationResults[*].EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId'
在 AWS 账户级别应用四项阻止公开访问(Block Public Access)设置作为安全网。无论单个存储桶策略或 ACL 如何设置,都可防止账户中任何存储桶被设为公开。
# 启用账户级别阻止公开访问(全部四项设置)
aws s3control put-public-access-block \
--account-id 123456789012 \
--public-access-block-configuration '{
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}'
# 验证账户级别设置
aws s3control get-public-access-block --account-id 123456789012
# 在存储桶级别启用以实现纵深防御
aws s3api put-public-access-block \
--bucket production-data-bucket \
--public-access-block-configuration '{
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}'
审查所有存储桶策略中过度宽松的 Principal 语句,并移除旧版 ACL。强制执行存储桶所有权控制以完全禁用 ACL。
# 删除公开存储桶策略
aws s3api delete-bucket-policy --bucket exposed-bucket
# 替换为限制性策略
aws s3api put-bucket-policy --bucket exposed-bucket --policy '{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyUnencryptedTransport",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::exposed-bucket",
"arn:aws:s3:::exposed-bucket/*"
],
"Condition": {
"Bool": {"aws:SecureTransport": "false"}
}
},
{
"Sid": "AllowOnlyVPCEndpoint",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::exposed-bucket",
"arn:aws:s3:::exposed-bucket/*"
],
"Condition": {
"StringNotEquals": {"aws:SourceVpce": "vpce-0abc123def456"}
}
}
]
}'
# 强制存储桶所有者拥有所有对象(禁用 ACL)
aws s3api put-bucket-ownership-controls --bucket exposed-bucket \
--ownership-controls '{"Rules": [{"ObjectOwnership": "BucketOwnerEnforced"}]}'
为所有存储桶启用使用 AWS KMS 或 AES-256 的默认服务器端加密(Server-Side Encryption)。添加拒绝未加密对象上传的存储桶策略。
# 启用默认 KMS 加密
aws s3api put-bucket-encryption --bucket production-data-bucket \
--server-side-encryption-configuration '{
"Rules": [{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "arn:aws:kms:us-east-1:123456789012:key/key-id"
},
"BucketKeyEnabled": true
}]
}'
# 通过存储桶策略拒绝未加密上传
aws s3api put-bucket-policy --bucket production-data-bucket --policy '{
"Version": "2012-10-17",
"Statement": [{
"Sid": "DenyUnencryptedUploads",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::production-data-bucket/*",
"Condition": {
"StringNotEquals": {"s3:x-amz-server-side-encryption": ["aws:kms", "AES256"]}
}
}]
}'
配置 S3 服务器访问日志记录和 CloudTrail 数据事件,跟踪所有对象级别操作。设置 EventBridge 规则,对可疑访问模式发出告警。
# 启用服务器访问日志记录
aws s3api put-bucket-logging --bucket production-data-bucket \
--bucket-logging-status '{
"LoggingEnabled": {
"TargetBucket": "s3-access-logs-bucket",
"TargetPrefix": "production-data-bucket/"
}
}'
# 启用 CloudTrail S3 数据事件
aws cloudtrail put-event-selectors --trail-name management-trail \
--event-selectors '[{
"ReadWriteType": "All",
"DataResources": [{
"Type": "AWS::S3::Object",
"Values": ["arn:aws:s3:::production-data-bucket/"]
}]
}]'
使用服务控制策略(SCP)防止在整个组织中禁用阻止公开访问。部署具有自动修复功能的 AWS Config 规则。
# SCP 防止移除阻止公开访问配置
aws organizations create-policy \
--name PreventS3PublicAccess \
--type SERVICE_CONTROL_POLICY \
--content '{
"Version": "2012-10-17",
"Statement": [{
"Sid": "DenyRemovePublicAccessBlock",
"Effect": "Deny",
"Action": [
"s3:PutBucketPublicAccessBlock",
"s3:PutAccountPublicAccessBlock"
],
"Resource": "*",
"Condition": {
"StringNotLike": {"aws:PrincipalArn": "arn:aws:iam::*:role/SecurityAdmin"}
}
}]
}'
| 术语 | 定义 |
|---|---|
| S3 阻止公开访问(S3 Block Public Access) | 四项账户级别和存储桶级别设置,可覆盖任何授予 S3 资源公开访问权限的策略或 ACL |
| 存储桶策略(Bucket Policy) | 附加到 S3 存储桶的基于 JSON 的资源策略,定义谁可以在什么条件下访问哪些对象 |
| ACL(访问控制列表) | 旧版 S3 访问机制,在存储桶或对象级别授予权限;应通过 BucketOwnerEnforced 禁用 |
| BucketOwnerEnforced | 所有权控制设置,禁用存储桶上的所有 ACL,使存储桶所有者成为访问控制的唯一授权方 |
| 服务器端加密(Server-Side Encryption) | 使用 AES-256(SSE-S3)、AWS KMS(SSE-KMS)或客户提供的密钥(SSE-C)自动加密静态对象 |
| VPC 端点(VPC Endpoint) | VPC 与 S3 之间的私有连接,将存储桶访问限制为来自 VPC 内部的流量 |
| S3 Access Analyzer | IAM Access Analyzer 功能,可识别与账户或组织外部实体共享的 S3 存储桶 |
场景背景:安全研究人员报告一个包含 273,000 份银行转账 PDF 的 S3 存储桶可被公开读取。该存储桶由需要与外部合作伙伴共享文件的开发者创建,并将 ACL 设置为 public-read。
方法:
常见陷阱:在未通知设置公开访问的团队的情况下启用阻止公开访问会破坏其工作流程。在修复前未运行访问日志分析会丢失谁访问了暴露数据的证据。
S3 存储桶安全修复报告
=======================================
账户: 123456789012
评估日期: 2025-02-23
扫描存储桶数: 156
账户级别控制:
阻止公开访问: 已启用(全部四项设置)
防止移除的 SCP: 已部署
严重发现(已修复):
[S3-001] production-uploads - 通过 ACL 公开读取
状态: 已修复 - 已应用 BucketOwnerEnforced
暴露对象数: 273,412
暴露持续时间: 47 天
访问的唯一外部 IP 数: 1,247
[S3-002] analytics-export - 公开存储桶策略(Principal: *)
状态: 已修复 - 策略已替换为 VPC 端点限制
敏感数据(Macie): 检测到 12,400 个含 PII 的对象
高危发现:
[S3-003] 14 个存储桶缺少默认加密
状态: 已修复 - 已启用 KMS 加密
[S3-004] 8 个存储桶未启用服务器访问日志记录
状态: 已修复 - 已启用日志记录到集中日志存储桶
摘要:
已修复存储桶: 24/156
加密覆盖率: 100%
访问日志记录覆盖率: 100%
阻止公开访问: 156/156 个存储桶