securing-s3-buckets

securing-s3-buckets

热门

按照 AWS 最佳实践创建和保护 S3 存储桶,涵盖访问控制、加密、监控和错误配置修复。当用户想要保护新存储桶、审计现有存储桶、修复安全发现、配置加密或启用日志和监控时使用。请勿用于常规 S3 数据操作、S3 Tables 设置或发现现有数据资产。

2147Star
202Fork
更新于 2026/7/27
SKILL.md
readonly只读
name
securing-s3-buckets
description

按照 AWS 最佳实践创建和保护 S3 存储桶,涵盖访问控制、加密、监控和错误配置修复。当用户想要保护新存储桶、审计现有存储桶、修复安全发现、配置加密或启用日志和监控时使用。请勿用于常规 S3 数据操作、S3 Tables 设置或发现现有数据资产。

version
1

概述

通过五个工作流实现分层 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 步骤。

必需步骤(按顺序执行,不可跳过):

  1. 使用 --bucket-namespace account-regional 创建存储桶
  2. 启用版本控制
  3. 启用加密(SSE-S3 + 存储桶密钥 + 阻止 SSE-C)
  4. 启用日志记录(询问用户选择哪个选项——条件性)
  5. 通过 DenyInsecureTransport 存储桶策略强制仅 HTTPS
  6. 启用 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:SecureTransportfalse 时拒绝 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: trueBlockedEncryptionTypes: [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]' 查找。

其他资源