skills/auditing-aws-s3-bucket-permissions/SKILL.md
使用 AWS CLI、S3audit 和 Prowler,系统性审计 AWS S3 存储桶权限,识别可公开访问的存储桶、 过度宽松的 ACL、错误配置的存储桶策略和缺失的加密设置,以强制执行最小权限数据访问控制。
npx skillsauth add killvxk/cybersecurity-skills-zh auditing-aws-s3-bucket-permissionsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
不适用于:审计非 AWS 对象存储(使用提供商特定工具)、实时监控(使用带 Lambda 的 S3 Event Notifications)或审计 S3 访问模式(使用 S3 Access Analyzer 或 CloudTrail S3 数据事件)。
s3:GetBucketPolicy、s3:GetBucketAcl、s3:GetBucketPublicAccessBlock、s3:GetEncryptionConfiguration 和 s3:ListAllMyBuckets 权限pip install prowler)用于自动 CIS 基准检查首先检查账户级别的 S3 Block Public Access 设置,然后列出所有存储桶及其区域。
# 检查账户级别的 S3 Block Public Access 设置
aws s3control get-public-access-block \
--account-id $(aws sts get-caller-identity --query Account --output text) \
--output json
# 列出所有存储桶及创建日期
aws s3api list-buckets \
--query 'Buckets[*].[Name,CreationDate]' \
--output table
# 获取每个存储桶的区域
for bucket in $(aws s3api list-buckets --query 'Buckets[*].Name' --output text); do
region=$(aws s3api get-bucket-location --bucket "$bucket" --query 'LocationConstraint' --output text)
echo "$bucket -> ${region:-us-east-1}"
done
遍历所有存储桶,评估各自的公开访问阻止设置和 ACL 授权。
# 检查每个存储桶的 Block Public Access 设置
for bucket in $(aws s3api list-buckets --query 'Buckets[*].Name' --output text); do
echo "=== $bucket ==="
aws s3api get-public-access-block --bucket "$bucket" 2>/dev/null || echo " 未配置 Block Public Access"
# 检查 ACL 中的公开授权
aws s3api get-bucket-acl --bucket "$bucket" \
--query 'Grants[?Grantee.URI==`http://acs.amazonaws.com/groups/global/AllUsers` || Grantee.URI==`http://acs.amazonaws.com/groups/global/AuthenticatedUsers`]' \
--output json
done
审查存储桶策略中的通配符主体、缺少的条件以及允许广泛访问的语句。
# 提取并分析存储桶策略
for bucket in $(aws s3api list-buckets --query 'Buckets[*].Name' --output text); do
policy=$(aws s3api get-bucket-policy --bucket "$bucket" --output text 2>/dev/null)
if [ -n "$policy" ]; then
echo "=== $bucket policy ==="
echo "$policy" | python3 -c "
import json, sys
policy = json.load(sys.stdin)
for stmt in policy.get('Statement', []):
principal = stmt.get('Principal', {})
effect = stmt.get('Effect', '')
if principal == '*' or principal == {'AWS': '*'}:
print(f' 警告: {effect} 使用通配符主体')
print(f' 操作: {stmt.get(\"Action\", \"\")}')
print(f' 条件: {stmt.get(\"Condition\", \"无\")}')
"
fi
done
检查所有存储桶是否启用了服务器端加密,并为数据保护配置了版本控制。
# 检查所有存储桶的加密和版本控制状态
for bucket in $(aws s3api list-buckets --query 'Buckets[*].Name' --output text); do
echo "=== $bucket ==="
# 加密配置
aws s3api get-bucket-encryption --bucket "$bucket" 2>/dev/null \
&& echo " 加密: 已启用" \
|| echo " 加密: 未启用"
# 版本控制状态
aws s3api get-bucket-versioning --bucket "$bucket" \
--query 'Status' --output text
# 日志记录状态
aws s3api get-bucket-logging --bucket "$bucket" \
--query 'LoggingEnabled' --output text 2>/dev/null
done
执行 Prowler 的 S3 专项检查,与 CIS AWS Foundations Benchmark 对齐。
# 运行 Prowler S3 专项检查
prowler aws \
--checks s3_bucket_public_access \
s3_bucket_default_encryption \
s3_bucket_policy_public_write_access \
s3_bucket_server_access_logging_enabled \
s3_bucket_versioning_enabled \
s3_bucket_acl_prohibited \
-M json-ocsf \
-o ./prowler-s3-audit/
# 查看摘要
prowler aws --checks s3 -M csv -o ./prowler-s3-audit/
利用 IAM Access Analyzer 识别与外部实体或公开共享的存储桶。
# 列出 S3 的 Access Analyzer 发现
aws accessanalyzer list-findings \
--analyzer-arn $(aws accessanalyzer list-analyzers --query 'analyzers[0].arn' --output text) \
--filter '{"resourceType": {"eq": ["AWS::S3::Bucket"]}}' \
--query 'findings[*].[resource,status,condition,principal]' \
--output table
# 如果不存在分析器则创建一个
aws accessanalyzer create-analyzer \
--analyzer-name s3-access-audit \
--type ACCOUNT
将发现汇编成可操作的报告,并对严重问题进行修复。
# 快速修复:对存储桶启用 Block Public Access
aws s3api put-public-access-block \
--bucket TARGET_BUCKET \
--public-access-block-configuration \
'BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true'
# 使用 SSE-S3 启用默认加密
aws s3api put-bucket-encryption \
--bucket TARGET_BUCKET \
--server-side-encryption-configuration \
'{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"aws:kms","KMSMasterKeyID":"alias/aws/s3"},"BucketKeyEnabled":true}]}'
# 启用版本控制
aws s3api put-bucket-versioning \
--bucket TARGET_BUCKET \
--versioning-configuration Status=Enabled
| 术语 | 定义 | |------|------------| | S3 Block Public Access | 账户级别和存储桶级别的设置,覆盖 ACL 和策略,无论各资源单独配置如何,都可防止公开访问 | | 存储桶策略(Bucket Policy) | 附加到存储桶的基于 JSON 的资源策略,定义谁可以访问存储桶以及可以执行哪些操作 | | ACL(访问控制列表) | 旧版 S3 访问控制机制,向 AWS 账户或预定义组(如 AllUsers 或 AuthenticatedUsers)授权 | | IAM Access Analyzer | AWS 服务,分析资源策略以识别与外部实体或公众共享的资源 | | 服务器端加密(Server-Side Encryption) | S3 在将数据写入磁盘前,使用 SSE-S3、SSE-KMS 或 SSE-C 在对象级别应用的加密 | | CIS AWS Foundations Benchmark | 互联网安全中心(Center for Internet Security)的安全最佳实践标准,包含 S3 存储桶配置的具体控制措施 |
场景背景:安全工程师收到 Trusted Advisor 关于可公开访问 S3 存储桶的告警。该存储桶由开发团队为演示而创建,从未进行访问限制。
方法:
aws s3api get-bucket-acl,发现对 AllUsers 的 READ 权限授权get-bucket-policy,发现带有 Principal: "*" 和 s3:GetObject 的策略常见陷阱:启用 Block Public Access 可能会破坏有意公开提供内容(如静态网站)的应用程序。应用限制前始终验证存储桶的预期用途。检查是否有 CloudFront 分发或其他服务依赖存储桶的公开访问。
S3 存储桶权限审计报告
=====================================
账户: 123456789012 (生产环境)
日期: 2026-02-23
审计员: 安全工程团队
存储桶总数: 47
账户级别设置:
Block Public Access: 已启用(全部四项设置)
严重发现:
[S3-001] 通过 ACL 的公开读取访问
存储桶: marketing-assets-prod
问题: AllUsers 组通过 ACL 获得 READ 权限
风险: 任何互联网用户均可列出并下载存储桶内容
数据敏感性: 包含面向客户但非敏感的营销资产
修复: 移除 AllUsers ACL 授权,启用 Block Public Access
[S3-002] 存储桶策略中的通配符主体
存储桶: data-exchange-partner
问题: 策略允许 s3:GetObject,Principal 为 "*" 且无 VPC/IP 条件
风险: 本为合作伙伴访问设计,但任何知道存储桶名称的人均可访问
修复: 添加 aws:SourceVpce 或 aws:SourceIp 条件以限制访问
摘要:
有公开访问的存储桶: 3 / 47
未加密的存储桶: 5 / 47
未启用版本控制的存储桶: 12 / 47
未启用访问日志的存储桶: 18 / 47
策略过于宽松的存储桶: 7 / 47
testing
设计并执行社会工程学渗透测试,包括钓鱼、语音钓鱼、短信钓鱼和物理借口活动,以衡量人员安全韧性并识别培训差距。
testing
主持结构化的事件后审查,以识别根本原因、记录有效和无效的措施,并提出可操作的改进建议以提升未来的事件响应能力。
testing
通过分析举报的邮件、提取指标、评估凭据受攻陷情况、在全组织范围隔离恶意邮件并修复受影响账号来响应网络钓鱼事件。涵盖邮件头分析、URL/附件沙箱检测和邮箱范围清除操作。适用于网络钓鱼响应、邮件事件、凭据钓鱼、鱼叉式网络钓鱼调查或钓鱼修复相关请求。
tools
票据传递(Pass-the-Ticket,PtT)是一种横向移动技术,使用窃取的 Kerberos 票据(TGT 或 TGS)在不知道用户密码的情况下向服务进行认证。通过从已控制的主机内存中提取 Kerberos 票据,攻击者可以将这些票据注入自己的会话以模拟票据所有者。