TocConsulting/lambda-security-scanner

GitHub: TocConsulting/lambda-security-scanner

一款全面的 AWS Lambda 安全配置与合规性扫描工具,通过自动化检测帮助团队发现函数配置漏洞、环境变量泄露并满足多项国际合规标准。

Stars: 2 | Forks: 0

Lambda Security Scanner

PyPI version Downloads Docker Docker Pulls License: MIT Python AWS

一款全面的 AWS Lambda 安全扫描器,涵盖 5 大类共 21 项安全检查,并支持针对 10 种合规框架的映射(81 项控制措施)。具备多线程扫描、环境变量机密检测以及交互式 HTML 仪表板等功能。

Lambda Security Scanner demo: secrets, public URLs, IAM, and multi-framework compliance

## 核心功能 ### **全面的安全分析** - **函数配置**:已弃用的 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` 来调整并行度。
标签:AWS Lambda, LNA, Python, 安全扫描, 无后门, 时序注入, 请求拦截, 逆向工具