关于 auditing-aws-s3-bucket-permissions
该技能为 AWS 安全人员提供 S3 存储桶权限审计流程,涵盖公开访问、策略、ACL、加密和版本控制检查,并包含发现后的整改步骤。
主要功能
- 01检查账户及存储桶的公开访问设置
- 02审查 ACL 与存储桶策略
- 03核查加密和版本控制
- 04运行 Prowler 的 S3 检查
- 05查找公开及跨账户共享
- 06整理审计结果并指导整改
适用场景
- 01调查 Trusted Advisor 或 Security Hub 的暴露告警
- 02为新 AWS 账户建立存储安全基线
- 03执行合规要求的定期权限审查
- 04凭证泄露后检查可访问的 S3 资源
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill auditing-aws-s3-bucket-permissions安装后在 Claude Code 中输入/auditing-aws-s3-bucket-permissions确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdscripts/agent.py详细介绍
审计 AWS S3 存储桶权限
何时使用
- 在对 AWS 环境进行安全评估以识别公开暴露的数据时
- 在接入新的 AWS 账户并为存储资源配置安全基线时
- 在响应来自 AWS Trusted Advisor 或 Security Hub 关于潜在 S3 数据暴露的告警时
- 在合规框架(SOC 2、PCI DSS、HIPAA)要求定期审查数据访问控制时
- 在发生入侵或凭证泄露、需要立即审查所有可访问的 S3 资源时
不要用于审计非 AWS 对象存储(请使用对应提供商的工具)、实时监控(请使用 S3 Event Notifications 配合 Lambda),或审计 S3 访问模式(请使用 S3 Access Analyzer 或 CloudTrail S3 数据事件)。
前提条件
- 已配置 AWS CLI v2,且凭证具有
s3:GetBucketPolicy、s3:GetBucketAcl、s3:GetBucketPublicAccessBlock、s3:GetEncryptionConfiguration和s3:ListAllMyBuckets权限 - 已安装 Prowler(
pip install prowler)用于自动化 CIS 基准检查 - 已安装 S3audit 或类似的枚举工具,用于快速检测公开存储桶
- 如需跨多个账户审计,需具有 AWS Organizations 的访问权限
- 具备 Python 3.8+ 及 boto3,用于编写自定义审计脚本
工作流
步骤 1:枚举所有 S3 存储桶及账户级阻止公共访问设置
首先检查账户级 S3 阻止公共访问设置,然后列出所有存储桶及其所在区域。
# Check account-level S3 Block Public Access settings
aws s3control get-public-access-block \
--account-id $(aws sts get-caller-identity --query Account --output text) \
--output json
# List all buckets with creation dates
aws s3api list-buckets \
--query 'Buckets[*].[Name,CreationDate]' \
--output table
# Get bucket regions for each bucket
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
步骤 2:检查每个存储桶的阻止公共访问及 ACL 配置
遍历所有存储桶,评估其各自的阻止公共访问设置和 ACL 授权。
# Check per-bucket Block Public Access settings
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 " No Block Public Access configured"
# Check ACL for public grants
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
步骤 3:分析存储桶策略中过于宽松的访问权限
审查存储桶策略中的通配符主体、缺失的条件以及允许广泛访问的语句。
# Extract and analyze bucket policies
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' WARNING: {effect} with wildcard principal')
print(f' Actions: {stmt.get(\"Action\", \"\")}')
print(f' Condition: {stmt.get(\"Condition\", \"NONE\")}')
"
fi
done
步骤 4:验证加密和版本控制设置
检查所有存储桶是否已启用服务端加密并为数据保护配置了版本控制。
# Check encryption and versioning status for all buckets
for bucket in $(aws s3api list-buckets --query 'Buckets[*].Name' --output text); do
echo "=== $bucket ==="
# Encryption configuration
aws s3api get-bucket-encryption --bucket "$bucket" 2>/dev/null \
&& echo " Encryption: ENABLED" \
|| echo " Encryption: DISABLED"
# Versioning status
aws s3api get-bucket-versioning --bucket "$bucket" \
--query 'Status' --output text
# Logging status
aws s3api get-bucket-logging --bucket "$bucket" \
--query 'LoggingEnabled' --output text 2>/dev/null
done
步骤 5:运行 Prowler 的 S3 专项检查
执行 Prowler 中与 CIS AWS Foundations Benchmark 对齐的 S3 相关检查。
# Run Prowler S3-specific checks
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/
# View summary
prowler aws --checks s3 -M csv -o ./prowler-s3-audit/
步骤 6:使用 IAM Access Analyzer 获取 S3 公开及跨账户发现结果
利用 IAM Access Analyzer 识别对外共享或公开的存储桶。
# List Access Analyzer findings for S3
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
# Create an analyzer if one does not exist
aws accessanalyzer create-analyzer \
--analyzer-name s3-access-audit \
--type ACCOUNT
步骤 7:生成审计报告并修复
将发现结果整理为可操作的报告,并对严重问题应用修复。
# Quick remediation: Enable Block Public Access on a bucket
aws s3api put-public-access-block \
--bucket TARGET_BUCKET \
--public-access-block-configuration \
'BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true'
# Enable default encryption with 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}]}'
# Enable versioning
aws s3api put-bucket-versioning \
--bucket TARGET_BUCKET \
--versioning-configuration Status=Enabled
关键概念
| 术语 | 定义 |
|---|---|
| S3 Block Public Access | 账户级和存储桶级设置,可覆盖 ACL 和策略以阻止公共访问,无论单个资源配置如何 |
| Bucket Policy | 附加到存储桶的基于 JSON 的资源策略,定义谁可以访问该存储桶以及可以执行哪些操作 |
| ACL (Access Control List) | 旧版 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 存储桶配置的具体控制项 |
工具与系统
- AWS CLI:用于查询 S3 存储桶配置、策略、ACL 和加密设置的主要接口
- Prowler:开源安全工具,提供 50 多项 S3 专项检查,对齐 CIS、PCI DSS 和 HIPAA 控制项
- IAM Access Analyzer:AWS 原生服务,用于持续监控授予外部访问权限的资源策略
- S3audit:轻量级工具,用于快速枚举账户中的公开 S3 存储桶
- ScoutSuite:多云审计工具,可采集 S3 配置数据并生成带风险评分的 HTML 报告
常见场景
场景:识别包含客户数据的公开可读存储桶
背景:一名安全工程师收到 Trusted Advisor 关于某个可公开访问的 S3 存储桶的告警。该存储桶由开发团队为演示创建,之后从未锁定。
方法:
- 运行
aws s3api get-bucket-acl,发现一条授予AllUsers的READ权限 - 检查
get-bucket-policy,发现策略中包含Principal: "*"和s3:GetObject - 确认存储桶级别和账户级别均未启用 Block Public Access
- 枚举存储桶内容,评估数据敏感性
- 立即在存储桶上启用 Block Public Access
- 检查 CloudTrail S3 数据事件,判断是否发生了未授权访问
- 报告发现结果,包括时间线、数据清单和修复确认
陷阱:启用 Block Public Access 可能会破坏有意公开提供内容的应用(静态网站)。在实施限制之前,务必确认存储桶的预期用途。检查是否有 CloudFront 分发或其他服务依赖该存储桶的公开访问。
输出格式
S3 Bucket Permissions Audit Report
=====================================
Account: 123456789012 (Production)
Date: 2026-02-23
Auditor: Security Engineering Team
Total Buckets: 47
ACCOUNT-LEVEL SETTINGS:
Block Public Access: ENABLED (all four settings)
CRITICAL FINDINGS:
[S3-001] Public Read Access via ACL
Bucket: marketing-assets-prod
Issue: AllUsers group granted READ permission via ACL
Risk: Any internet user can list and download bucket contents
Data Sensitivity: Contains customer-facing but non-sensitive marketing assets
Remediation: Remove AllUsers ACL grant, enable Block Public Access
[S3-002] Wildcard Principal in Bucket Policy
Bucket: data-exchange-partner
Issue: Policy allows s3:GetObject with Principal "*" and no VPC/IP condition
Risk: Intended for partner access but accessible to anyone with the bucket name
Remediation: Add aws:SourceVpce or aws:SourceIp condition to restrict access
SUMMARY:
Buckets with public access: 3 / 47
Buckets without encryption: 5 / 47
Buckets without versioning: 12 / 47
Buckets without access logging: 18 / 47
Buckets with overly broad policies: 7 / 47
评论
支持 Markdown