一款全面的 AWS Lambda 安全扫描器,涵盖 5 大类共 21 项安全检查,并支持针对 10 种合规框架的映射(81 项控制措施)。具备多线程扫描、环境变量机密检测以及交互式 HTML 仪表板等功能。
## 核心功能
### **全面的安全分析**
- **函数配置**:已弃用的 runtime 检测、超时调优、环境变量机密扫描、临时存储、外部 layer、X-Ray 追踪、死信队列
- **访问控制**:资源策略公开访问、函数 URL 身份验证、CORS 通配符源、过于宽松的执行角色、共享角色检测、跨账户异步调用目标、别名流量影子
- **网络安全**:VPC 配置、多可用区部署、无限制的安全组出站规则
- **日志与监控**:CloudWatch 日志组验证、日志保留策略、预留并发
- **代码与供应链**:代码签名配置、事件源映射失败目标
### **合规框架**
- **AWS Foundational Security Best Practices (FSBP)**:5 项针对 Lambda 的控制措施
- **CIS AWS Compute Services Benchmark**:8 项控制措施(扫描器定义的 ID 映射到该基准的 Lambda 指南;请参阅下文注释)
- **PCI DSS v4.0.1**:8 项控制措施
- **HIPAA Security Rule**:9 项控制措施
- **SOC 2**:11 项控制措施
- **ISO 27001:2022**:11 项控制措施
- **ISO 27017:2015**:4 项云安全控制措施
- **ISO 27018:2019**:5 项 PII 保护控制措施
- **GDPR (EU) 2016/679**:8 项控制措施
- **NIST SP 800-53 Rev5**:12 项控制措施
### **性能与易用性**
- **多线程扫描**:使用 ThreadPoolExecutor 进行并行函数分析
- **丰富的控制台输出**:进度条、彩色输出和格式化的表格
- **多种报告格式**:JSON、CSV、HTML 以及特定合规报告
- **精美的 HTML 报告**:包含 Chart.js 可视化的交互式仪表板
- **灵活的目标选择**:扫描所有函数、特定名称的函数,或按名称排除函数
### **生产就绪**
- **模块化架构**:采用 Facade 模式,包含 5 个专用的检查器模块
- **线程安全会话**:线程本地的 boto3 会话管理
- **优雅降级**:AccessDenied 错误不会导致扫描崩溃
- **互斥评分**:重叠的检查变体仅应用最高扣分
## 快速入门
### 安装
```
# 从源码安装
git clone https://github.com/TocConsulting/lambda-security-scanner.git
cd lambda-security-scanner
pip install .
```
### Docker 安装
```
# 从源码构建
docker build -t lambda-security-scanner .
```
### 基本用法
```
# 扫描所有 Lambda 函数
lambda-security-scanner security
# 使用特定 AWS profile 扫描
lambda-security-scanner security --profile production
# 仅扫描特定函数
lambda-security-scanner security -n my-function -n other-function
# 排除特定函数
lambda-security-scanner security --exclude-function test-func
# 仅 compliance 报告
lambda-security-scanner security --compliance-only
# 仅 JSON 报告,静默模式 (用于 CI/CD)
lambda-security-scanner security -f json -q
```
## 命令
### 安全命令
扫描 Lambda 函数的安全漏洞和合规问题。
```
lambda-security-scanner security [OPTIONS]
Options:
-n, --function-name TEXT Specific function name(s) to scan (multiple)
--exclude-function TEXT Function name(s) to exclude
--compliance-only Generate compliance report only
-r, --region TEXT AWS region (default: us-east-1)
-p, --profile TEXT AWS profile name
-o, --output-dir TEXT Output directory (default: ./output)
-f, --output-format TEXT Report format: json, csv, html, all (default: all)
-w, --max-workers INTEGER Worker threads (default: 5)
-q, --quiet Suppress console output except errors
-d, --debug Enable debug logging
-h, --help Show help
# 顶层选项 (在 'security' 命令之前):
# lambda-security-scanner --version
# lambda-security-scanner --help
```
**示例:**
```
# 使用默认设置扫描所有函数
lambda-security-scanner security
# 在不同 region 扫描特定函数
lambda-security-scanner security -n my-api -n my-worker -r eu-west-1
# 仅快速 compliance 扫描并输出 HTML
lambda-security-scanner security --compliance-only -f html -p production
# 使用更多线程的高性能扫描
lambda-security-scanner security -w 20 -r eu-west-1
# 仅 JSON 报告,静默模式 (用于 CI/CD)
lambda-security-scanner security -f json -q
```
## 安全检查
### 5 大类共 21 项检查
| ID | 检查项 | 严重程度 | 类别 |
|-----|------------------------------------------|-------------------|-----------------------|
| A.1 | 已弃用/EOL 的 runtime | HIGH/CRITICAL/LOW | 函数配置 |
| A.2 | 最大超时时间 (900s) | LOW | 函数配置 |
| A.3 | 环境变量机密 | CRITICAL/HIGH | 函数配置 |
| A.4 | 过大的临时存储 | LOW | 函数配置 |
| A.5 | 外部 Lambda layer | MEDIUM | 函数配置 |
| A.6 | 禁用 X-Ray 追踪 | LOW | 函数配置 |
| A.7 | 无死信队列 | LOW | 函数配置 |
| B.1 | 资源策略公开访问 | CRITICAL | 访问控制 |
| B.2 | 函数 URL 无身份验证 | CRITICAL | 访问控制 |
| B.3 | 函数 URL CORS 允许所有源 | HIGH | 访问控制 |
| B.4 | 过于宽松的执行角色 | CRITICAL/HIGH | 访问控制 |
| B.5 | 共享执行角色 | HIGH | 访问控制 |
| B.6 | 异步调用目标指向外部账户 | CRITICAL | 访问控制 |
| B.7 | 别名流量影子 (加权别名) | MEDIUM | 访问控制 |
| C.1 | 无 VPC 配置 | LOW | 网络安全 |
| C.2 | VPC 单可用区 | MEDIUM | 网络安全 |
| C.3 | 无限制的 SG 出站规则 | MEDIUM | 网络安全 |
| D.1 | 日志组缺失/无保留策略 | MEDIUM | 日志与监控 |
| D.2 | 无预留并发 | LOW | 日志与监控 |
| E.1 | 无代码签名 | MEDIUM/LOW | 代码与供应链 |
| E.2 | ESM 无失败目标 | MEDIUM | 代码与供应链 |
### 环境变量机密检测 (A.3)
扫描器会对 Lambda 环境变量进行解码并扫描其中暴露的机密:
| 匹配模式 | 示例 |
|---------|----------|
| AWS Access Key | `AKIA...`, `ASIA...` |
| AWS Secret Key | `aws_secret_access_key=...` |
| 密码 | `PASSWORD=`, `DB_PASSWORD=`, `SECRET_KEY=` |
| 私钥 | `-----BEGIN PRIVATE KEY-----` |
| GitHub Token | `ghp_...`, `gho_...`, `ghs_...` |
| API Key | `api_key=`, `api_token=`, `AUTH_TOKEN=` |
| 连接字符串 | `postgres://user:pass@host/db` |
| SaaS Token | Slack, Stripe (`sk_live_`), Twilio, SendGrid |
**不会标记安全的引用。** 如果一个以机密命名的变量,其值是一个托管机密引用(例如 Secrets Manager / SSM / KMS ARN,类似 `/app/db/pwd` 的 SSM 参数路径,或是 CloudFormation 的 `{{resolve:...}}` 动态引用),这是 AWS 推荐的模式,会被视为合规,而不作为泄露的机密。常规的配置值(如布尔值、端口、环境名称)同样会被忽略。
## 合规框架
| 框架 | 控制措施数量 | 关注点 |
|-----------|----------|-------|
| AWS-FSBP | 5 | 针对 Lambda 的 Security Hub 控制措施 |
| CIS | 8 | Compute Services Benchmark |
| PCI DSS v4.0.1 | 8 | 支付卡数据保护 |
| HIPAA | 9 | 医疗数据安全 |
| SOC 2 | 11 | 服务组织控制 |
| ISO 27001:2022 | 11 | 信息安全管理 |
| ISO 27017:2015 | 4 | 云安全控制 |
| ISO 27018:2019 | 5 | 云端 PII 保护 |
| GDPR | 8 | 欧盟数据保护法规 |
| NIST 800-53 Rev5 | 12 | 联邦安全控制措施 |
## Docker 用法
### 基础 Docker 命令
```
# 显示帮助
docker run --rm lambda-security-scanner --help
# 显示 security 命令帮助
docker run --rm lambda-security-scanner security --help
```
### 使用 Docker 进行安全扫描
```
# 使用挂载的 AWS credentials 扫描
docker run --rm \
-v ~/.aws:/root/.aws:ro \
-v $(pwd)/output:/app/output \
lambda-security-scanner security
# 使用特定 AWS profile 扫描
docker run --rm \
-v ~/.aws:/root/.aws:ro \
-v $(pwd)/output:/app/output \
lambda-security-scanner security --profile production
# 扫描特定函数
docker run --rm \
-v ~/.aws:/root/.aws:ro \
-v $(pwd)/output:/app/output \
lambda-security-scanner security -n my-function
```
### 使用环境变量传递 AWS 凭证
```
docker run --rm \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_DEFAULT_REGION=us-east-1 \
-v $(pwd)/output:/app/output \
lambda-security-scanner security
# 使用 session token (用于临时 credentials/assumed roles)
docker run --rm \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_SESSION_TOKEN \
-e AWS_DEFAULT_REGION=us-east-1 \
-v $(pwd)/output:/app/output \
lambda-security-scanner security
```
### Docker 数据卷挂载
| 挂载 | 用途 |
|-------|---------|
| `-v ~/.aws:/root/.aws:ro` | 挂载 AWS 凭证 (只读) |
| `-v $(pwd)/output:/app/output` | 将报告保存到本地目录 |
## 前置条件
### Python 要求
- Python 3.10 或更高版本
- 所需的包 (自动安装):
- `boto3>=1.26.0`
- `botocore>=1.29.0`
- `rich>=13.0.0`
- `click>=8.1.0`
- `jinja2>=3.1.0`
### AWS 要求
- 已配置 AWS 凭证 (通过 AWS CLI、环境变量或 IAM 角色)
- 所需权限:
```
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"lambda:ListFunctions",
"lambda:GetFunctionConfiguration",
"lambda:GetPolicy",
"lambda:GetFunctionUrlConfig",
"lambda:GetFunctionCodeSigningConfig",
"lambda:GetCodeSigningConfig",
"lambda:GetFunctionConcurrency",
"lambda:ListEventSourceMappings",
"lambda:GetFunctionEventInvokeConfig",
"lambda:ListAliases",
"iam:ListAttachedRolePolicies",
"iam:GetPolicy",
"iam:GetPolicyVersion",
"iam:ListRolePolicies",
"iam:GetRolePolicy",
"ec2:DescribeSubnets",
"ec2:DescribeSecurityGroups",
"logs:DescribeLogGroups",
"sts:GetCallerIdentity"
],
"Resource": "*"
}]
}
```
## 安全评分
每个函数都会获得一个安全分数 (0-100),初始为 **100 分**:
| 检查项 | 条件 | 扣分 | 严重程度 |
|-------|-----------|-----------|----------|
| B.1 | 资源策略允许公开访问 | -25 | CRITICAL |
| B.2 | 函数 URL AuthType 为 NONE | -25 | CRITICAL |
| A.3 | 环境变量机密,无 KMS (互斥) | -20 | CRITICAL |
| B.4 | 管理员等同权限 (Administrator/PowerUser/IAMFull 或 `*`) | -20 | CRITICAL |
| A.1 | runtime 已被阻止 | -15 | HIGH |
| A.1 | runtime 已弃用 | -10 | HIGH |
| B.3 | CORS 允许所有源 | -10 | HIGH |
| B.4 | 服务级别的通配符操作 (例如 `s3:*`) | -10 | HIGH |
| B.4 | 提权权限 | -10 | HIGH |
| B.5 | 共享执行角色 | -10 | HIGH |
| A.3 | 环境变量机密,有 KMS (互斥) | -10 | HIGH |
| C.2 | VPC 单可用区 | -5 | MEDIUM |
| C.3 | 无限制的 SG 出站规则 | -5 | MEDIUM |
| D.1 | 日志组缺失或无保留策略 | -5 | MEDIUM |
| A.6 | 禁用 X-Ray 追踪 | -2 | LOW |
| A.7 | 无死信队列 | -2 | LOW |
| D.2 | 无预留并发 | -2 | LOW |
| E.1 | 无代码签名配置 | -5 | MEDIUM |
| E.2 | ESM 无失败目标 | -5 | MEDIUM |
| A.5 | 外部 Lambda layer | -3 | MEDIUM |
| C.1 | 无 VPC 配置 | -3 | LOW |
| A.1 | runtime 临近 EOL | -3 | LOW |
| E.1 | 代码签名策略为 Warn (非 Enforce) | -3 | LOW |
| A.2 | 最大超时时间 (900s) | -2 | LOW |
| A.4 | 过大的临时存储 | -2 | LOW |
**互斥规则:**
- A.1:仅应用严重程度最高的 runtime 扣分 (已阻止 > 已弃用 > 临近 EOL)
- A.3:两种变体中仅应用一种 (无 KMS > 有 KMS)
- E.1:两种变体中仅应用一种 (无配置 > Warn 策略)
**公式**:`Score = max(0, 100 - total_deductions)`
### 评分说明
| 分数范围 | 等级 | 操作 |
|-------------|-------|--------|
| 90-100 | 优秀 | 维持现状 |
| 70-89 | 良好 | 解决次要问题 |
| 50-69 | 需改进 | 修复中等优先级问题 |
| 0-49 | 较差 | 需立即采取行动 |
## 输出文件
扫描器会在指定的输出目录中生成报告:
### JSON 报告 (`lambda_scan_region_timestamp.json`)
```
{
"summary": {
"scan_time": "2026-03-11T10:30:45",
"region": "us-east-1",
"account_id": "123456789012",
"total_functions": 25,
"average_security_score": 82.3
},
"results": [...]
}
```
### CSV 报告 (`lambda_scan_region_timestamp.csv`)
适合电子表格处理的格式,包含所有关键指标和合规状态。
### HTML 报告 (`lambda_scan_region_timestamp.html`)
交互式仪表板包含:
- **执行摘要**:关键指标和风险指标
- **分数分布**:函数安全分数柱状图
- **合规性概览**:所有 10 个框架的柱状图
- **严重程度分布**:按严重程度划分的发现结果甜甜圈图
- **函数详情**:带有分数条的表格,支持排序
- **严重发现**:高/严重级别问题的表格
### 合规报告 (`lambda_compliance_region_timestamp.json`)
针对每个函数在所有 10 个框架下的合规性评估,包含通过/未通过的控制措施详情。
## 模块化架构
```
lambda_security_scanner/
├── scanner.py # Main scanner orchestration (facade pattern)
├── cli.py # Click CLI interface
├── compliance.py # 81 controls across 10 frameworks
├── html_reporter.py # Jinja2 HTML report generation
├── utils.py # Logging, scoring, formatting
├── checks/ # Security check modules
│ ├── base.py # BaseChecker (session factory, error handling)
│ ├── function_config.py # A.1-A.7: Runtime, secrets, layers, tracing
│ ├── access_control.py # B.1-B.7: Policies, URLs, roles, destinations, aliases
│ ├── network_security.py # C.1-C.3: VPC, AZ, security groups
│ ├── logging_monitoring.py # D.1-D.2: Log groups, concurrency
│ └── code_security.py # E.1-E.2: Code signing, ESM
└── templates/
└── report.html # Interactive HTML dashboard
```
## 开发
### 搭建开发环境
```
git clone https://github.com/TocConsulting/lambda-security-scanner.git
cd lambda-security-scanner
python -m venv venv
source venv/bin/activate
pip install -e ".[dev]"
```
## 测试
```
# 安装开发依赖
pip install -e ".[dev]"
# 运行所有测试
python -m pytest tests/ -v
# 运行特定测试文件
python -m pytest tests/test_compliance.py -v
# 使用 coverage 运行
python -m pytest tests/ --cov=lambda_security_scanner --cov-report=html
# 代码格式化
black lambda_security_scanner/ tests/
```
### 获取帮助
- **文档**:查看本 README 和内联帮助 (`--help`)
- **问题**:通过 [GitHub Issues](https://github.com/TocConsulting/lambda-security-scanner/issues) 报告 Bug
##可证
本项目采用 MIT 许可证授权 - 详情请参阅 [LICENSE](LICENSE) 文件。
## 致谢
- **AWS 安全最佳实践**:基于官方 AWS 安全建议
- **CIS Benchmark**:将发现结果映射到 CIS AWS Compute Services Benchmark Lambda 指南 (扫描器定义的控制标识符)
- **[ec2-security-scanner](https://github.com/TocConsulting/ec2-security-scanner)**:架构和设计模式
**安全声明**:此工具仅用于防御性安全目的。在扫描 AWS 资源之前,请务必确保您拥有适当的授权。该工具需要只读权限,不会修改任何 AWS 资源。
**性能提示**:扫描器使用 ThreadPoolExecutor 进行并行函数分析,以最大程度缩短扫描时间。请根据您的 API 速率限制使用 `-w` 来调整并行度。