按照 AWS 最佳实践创建和保护 S3 存储桶,涵盖访问控制、加密、监控和错误配置修复。当用户想要保护新存储桶、审计现有存储桶、修复安全发现、配置加密或启用日志和监控时使用。请勿用于常规 S3 数据操作、S3 Tables 设置或发现现有数据资产。
概述
通过五个工作流实现分层 S3 安全控制:保护新存储桶、审计现有配置、修复发现、配置加密和启用监控。遵循 AWS Well-Architected 安全最佳实践。
连接时使用 AWS MCP 服务器执行命令(沙箱执行、审计日志、可观测性)。否则回退到 AWS CLI 或 shell。
常见任务
0. 验证依赖项
开始前检查所需工具。
约束:
- 如果缺少所需工具,您必须告知用户
- 您应该使用
aws sts get-caller-identity确认凭证
参见 references/iam-permissions.md 了解各工作流的 IAM 权限。
1. 分类请求
| 用户意图 | 工作流 |
|---|---|
| 保护新存储桶 | A:保护新存储桶 |
| 审计/审查现有存储桶 | B:审计现有存储桶 |
| 修复特定发现 | C:修复问题 |
| 配置加密 | D:配置加密 |
| 启用日志/监控 | E:启用监控 |
约束:
- 您必须提前询问所有必需参数
- 在任何写操作前,您必须确认存储桶名称和区域
- 如果用户明确说明,您可以推断区域
- 在写操作前,您应该运行
aws iam simulate-principal-policy验证权限 - 您应该显示写命令并等待确认后再执行
put-bucket-policy 安全规则
以下规则适用于所有调用 put-bucket-policy 的工作流:
- 您必须首先尝试检索现有策略(
aws s3api get-bucket-policy)——put-bucket-policy会替换整个策略 - 如果策略存在,您必须在修改前备份:
aws s3api get-bucket-policy --bucket <name> --output text > backup-policy-$(date +%s).json - 如果返回
NoSuchBucketPolicy,则继续创建新策略——无需备份 - 您必须将新语句合并到现有策略的 Statement 数组中(如果存在)
- 您必须在应用前验证合并后的 JSON 语法(例如
echo '<policy>' | python3 -m json.tool) - 您应该显示完整的
put-bucket-policy命令并等待确认
2. 工作流 A —— 保护新存储桶
参见 references/workflows.md 获取完整 CLI 步骤。
必需步骤(按顺序执行,不可跳过):
- 使用
--bucket-namespace account-regional创建存储桶 - 启用版本控制
- 启用加密(SSE-S3 + 存储桶密钥 + 阻止 SSE-C)
- 启用日志记录(询问用户选择哪个选项——条件性)
- 通过
DenyInsecureTransport存储桶策略强制仅 HTTPS - 启用 ABAC
约束:
-
在
create-bucket调用中,您必须传递--bucket-namespace account-regional——这是必需的,不是可选的。示例:aws s3api create-bucket --bucket <name> --bucket-namespace account-regional --region <region> -
您不得更改 Block Public Access——S3 默认在新存储桶上启用它
-
您不得更改 ACL 所有权控制——S3 默认禁用 ACL(
BucketOwnerEnforced) -
您必须应用一个包含
DenyInsecureTransport语句的存储桶策略,该语句在aws:SecureTransport为false时拒绝s3:*——这是必需的,不是可选的。示例:aws s3api put-bucket-policy --bucket <name> --policy '{"Version":"2012-10-17","Statement":[{"Sid":"DenyInsecureTransport","Effect":"Deny","Principal":"*","Action":"s3:*","Resource":["arn:aws:s3:::<name>/*","arn:aws:s3:::<name>"],"Condition":{"Bool":{"aws:SecureTransport":"false"}}}]}' -
在步骤 4 之前,您必须询问用户想要哪个日志选项
-
对于步骤 4 和 5,您必须遵循 put-bucket-policy 安全规则
-
您应该在继续下一步前确认每一步成功
3. 工作流 B —— 审计现有存储桶
参见 references/audit-checklist.md 获取完整检查清单。
约束:
- 在报告发现之前,您必须运行所有只读审计命令
- 在审计期间,您不得执行任何写入或修改命令
- 您必须将每个控制项报告为 PASS / FAIL / NOT CONFIGURED,并附上严重性
- 对于日志记录:如果启用了 S3 服务器访问日志或 CloudTrail 数据事件,则报告 PASS;仅当两者都未启用时报告 NOT CONFIGURED
4. 工作流 C —— 修复问题
参见 references/remediation.md 获取按问题类型分类的修复命令。
约束:
- 在应用任何修复之前,您必须确定问题类型
- 修改策略时,您必须遵循 put-bucket-policy 安全规则
- 应用修复后,您必须重新运行相关的审计检查以确认解决
5. 工作流 D —— 配置加密
参见 references/encryption.md 获取加密选项和命令。
约束:
- 除非用户明确要求 KMS,否则您必须默认使用 SSE-S3 和 S3 存储桶密钥,并阻止 SSE-C
- 使用 SSE-KMS 时,您必须使用客户管理密钥——绝不要使用 AWS 管理的
aws/s3密钥 - 您必须通过完整 ARN 指定客户管理的 KMS 密钥,而不是别名
- 您必须在所有配置中包含
BucketKeyEnabled: true和BlockedEncryptionTypes: [SSE-C] - 注意:S3 API 会接受
aws/s3和别名而不报错——这是代理强制约束。应用后使用get-bucket-encryption验证。
6. 工作流 E —— 启用监控
参见 references/workflows.md 获取完整 CLI 步骤。
约束:
- 在创建 GuardDuty 检测器之前,您必须检查是否已存在
- 对于 CloudTrail 命令,您必须使用跟踪的主区域(而不是存储桶的区域)
- 您应该启用所有四个核心推荐的 AWS Config 规则
故障排除
ObjectLockConfigurationNotFoundError —— 对象锁定未启用。视为 NOT CONFIGURED,而不是失败。
审计命令返回 AccessDenied —— 检查 IAM 策略、存储桶策略、Block Public Access、VPC 端点策略和 SCP/RCP。使用 aws iam simulate-principal-policy 诊断。
put-bucket-policy 静默移除现有语句 —— 参见 put-bucket-policy 安全规则。
GuardDuty BadRequestException: detector already exists —— 先运行 aws guardduty list-detectors;仅当列表为空时才调用 create-detector。
CloudTrail 更改未生效 —— 确认您使用的是 --region <trail-home-region>,而不是存储桶的区域。使用 aws cloudtrail describe-trails --query 'trailList[*].[Name,HomeRegion]' 查找。
其他资源
- references/iam-permissions.md —— 按工作流划分的 IAM 权限
- references/audit-checklist.md —— 按控制项划分的检查清单,含严重性和通过条件
- references/encryption.md —— 加密选项、KMS 指南、SSE-C 阻止
- references/remediation.md —— 常见发现的修复命令
- references/workflows.md —— 工作流 A 和 E 的完整 CLI 命令序列
- AWS S3 安全最佳实践
- AWS Well-Architected 安全支柱






