aws-samples/sample-dangling-dns-detection
GitHub: aws-samples/sample-dangling-dns-detection
一个 AWS Config 自定义规则解决方案,用于检测 Route 53 中指向已删除 AWS 资源的悬挂 CNAME 记录,防止子域名接管攻击。
Stars: 2 | Forks: 0
# 悬挂 DNS 检测
AWS Config 自定义规则,用于检测 Amazon Route 53 中可能导致子域名接管攻击的悬挂 CNAME 记录。
## 简介
当 CNAME 记录指向已被删除的 AWS 资源时,就会发生子域名接管,这使得威胁者能够声明该资源名称并在您的域名下提供恶意内容。这是全球共享的 AWS 命名空间(Amazon S3 存储桶、Amazon CloudFront 分配、AWS Elastic Beanstalk 环境)中一个已知的问题,并被 MITRE ATT&CK 归类于 T1584.001(妥协基础设施 - 域名)。
此解决方案可帮助您在悬挂的 CNAME 记录被利用之前检测到它们。它作为 AWS Config 自定义规则运行,执行以下操作:
- 发现您所有 Amazon Route 53 托管区域中的 CNAME 记录
- 将 CNAME 目标与已知的 AWS 资源主机名进行模式匹配
- 将目标与 AWS Config 清单进行交叉比对,以验证底层资源是否仍然存在
- 向 AWS Config 和 AWS Security Hub 报告 NON_COMPLIANT(不合规)结果
- 可选地向 Amazon SNS 发布通知
本 README 涵盖了该解决方案的架构、部署、验证、安全考虑、清理以及相关的成本考虑。
## 概述
此解决方案检测指向客户 AWS 账户中已不存在的 AWS 资源的“悬挂”CNAME 记录。攻击者可能会利用此类记录在客户的域名下提供恶意内容。
## 支持的 AWS 资源类型
- Amazon S3 存储桶
- Amazon CloudFront 分配
- AWS Elastic Beanstalk 环境
## 路线图
以下资源类型已计划但尚未实现:
- Elastic Load Balancing(Application Load Balancer、Network Load Balancer、Classic Load Balancer)
## 架构
该解决方案使用由 AWS Lambda 函数支持的 AWS Config 自定义规则,该函数执行以下操作:
1. 从 Amazon Route 53 托管区域发现所有 CNAME 记录
2. 将 CNAME 目标与已知的 AWS 资源模式进行匹配
3. 查询 AWS Config 清单以检查目标资源是否存在
4. 向 AWS Config 报告合规性状态
5. 为不合规的记录创建 AWS Security Hub 调查结果
6. 发布 Amazon SNS 通知以进行警报
7. 发布 Amazon CloudWatch 指标以进行监控
## 安装
按照以下步骤将悬挂 DNS 检测解决方案部署到您的 AWS 账户:确认先决条件,设置您的开发环境,构建 Lambda 包,以及部署 AWS CloudFormation 堆栈。
### 前置条件
- Python 3.11+
- 配置了适当凭证的 AWS CLI
- 目标账户中已启用 AWS Config
### 开发设置
```
# 创建 virtual environment
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# 安装 dependencies
pip install -e ".[dev]"
# 运行 tests
pytest
```
### 成本考虑
此解决方案会创建产生费用的 AWS 资源,包括:
- AWS Lambda 函数执行,按调用次数计费。频率取决于 AWS Config 评估计划和 Amazon Route 53 记录的数量。
- AWS Config 规则评估,按评估次数计费。
- Amazon CloudWatch Logs 存储和自定义指标。
- AWS Security Hub 调查结果(如果账户中启用了 Security Hub)。
- 用于失败 Lambda 调用的 Amazon SQS 死信队列存储。
- 用于加密 Lambda 环境变量和 DLQ 的 AWS Key Management Service (AWS KMS) 密钥,按月收费并加上按 API 请求收费。
成本会随着您的 Amazon Route 53 记录数量和您配置的 AWS Config 评估频率(默认:每 24 小时)而变化。有关您所在 AWS 区域的当前费率,请参阅 [AWS Lambda 定价页面](https://aws.amazon.com/lambda/pricing/)、[AWS Config 定价页面](https://aws.amazon.com/config/pricing/) 和 [AWS 定价计算器](https://calculator.aws/#/)。为了控制持续产生的费用,当不再需要该解决方案时,请按照清理部分进行操作。
### 部署
```
# 打包 Lambda function
./scripts/package.sh
# 部署 CloudFormation stack
aws cloudformation deploy \
--template-file infrastructure/template.yaml \
--stack-name dangling-dns-detection \
--capabilities CAPABILITY_IAM
```
### 验证
部署完成后,验证解决方案是否正常工作:
1. 检查 AWS CloudFormation 堆栈是否达到 `CREATE_COMPLETE`:
aws cloudformation describe-stacks \
--stack-name dangling-dns-detection \
--query "Stacks[0].StackStatus"
2. 确认 AWS Config 规则处于活动状态:
aws configservice describe-config-rules \
--config-rule-names dangling-dns-detection
3. 触发立即评估以确认规则可以端到端运行:
aws configservice start-config-rules-evaluation \
--config-rule-names dangling-dns-detection
4. 几分钟后,在 AWS Config 控制台中或通过 CLI 查看评估结果。NON_COMPLIANT 调查结果表示存在悬挂的 CNAME 记录。
## 清理
为避免持续产生费用,请在不再需要该解决方案时删除 CloudFormation 堆栈。
```
aws cloudformation delete-stack --stack-name dangling-dns-detection
```
验证堆栈删除是否已完成:
```
aws cloudformation describe-stacks --stack-name dangling-dns-detection
```
删除完成后,您应该会收到 `Stack with id dangling-dns-detection does not exist` 错误。
**注意:** 删除堆栈将移除模板创建的所有资源,包括 AWS Lambda 函数、Lambda 权限、AWS Config 规则、Amazon CloudWatch Logs 日志组、Amazon CloudWatch Dashboard、AWS KMS 密钥和别名(密钥有 30 天的删除窗口期)、Amazon Simple Queue Service (Amazon SQS) 死信队列,以及关联的 AWS Identity and Access Management (AWS IAM) 角色和策略。除非手动删除,否则 AWS Config 规则评估历史记录将被保留。如果未更新,AWS Security Hub 调查结果将自动在 90 天(活动调查结果)或 30 天(已归档调查结果)后删除。如果您出于审计目的需要保留调查结果或 Amazon CloudWatch Logs,请在保留期到期之前或堆栈删除之前将其导出。
## 项目结构
```
├── src/ # Lambda function source code
│ ├── __init__.py
│ ├── models.py # Data models and enums
│ ├── pattern_matcher.py # AWS resource pattern matching
│ ├── discovery.py # Route 53 CNAME discovery
│ ├── inventory.py # Config inventory queries
│ ├── evaluator.py # Compliance evaluation logic
│ ├── alerting.py # Security Hub and SNS integration
│ ├── metrics.py # CloudWatch metrics publishing
│ └── handler.py # Lambda handler entry point
├── infrastructure/ # CloudFormation templates
│ └── template.yaml
├── tests/ # Test suite
│ ├── unit/ # Unit tests
│ └── property/ # Property-based tests
├── scripts/ # Build and deployment scripts
├── pyproject.toml # Project configuration
└── README.md
```
## 测试
```
# 运行所有 tests
pytest
# 仅运行 unit tests
pytest tests/unit/
# 仅运行 property-based tests
pytest tests/property/
# 运行并统计 coverage
pytest --cov=src --cov-report=html
```
## 安全考虑
此解决方案作为用于教育目的的示例代码和参考实现提供。在生产环境部署之前:
- 首先在较低级别的环境(开发或预发布账户)中使用测试托管区域和非生产 DNS 记录进行测试。在将其提升到生产环境之前,验证检测准确性、IAM 权限和通知阈值。
- 查看 CloudFormation 模板中的 IAM 权限,并根据您组织的最小权限要求对其进行范围限制。
- 评估适用于您环境的 AWS Security Hub 调查结果严重性和 Amazon SNS 通知阈值。
- 如果需要跨账户可见性,请考虑启用 AWS Config Aggregator。
- 此解决方案不执行自动修复(DNS 记录删除)。不合规的调查结果在采取行动前需要人工审查。
### 接受的 IAM 例外情况
CloudFormation 模板在 AWS API 设计要求的多个 IAM 声明中使用了 `Resource: '*'`。每个例外都在模板中进行了内联记录,并在此处进行跟踪:
- **`route53:ListHostedZones` 和 `route53:ListResourceRecordSets`** - 这些操作不支持资源级权限。根据设计,它们会对账户中的所有托管区域进行操作。
- **`config:SelectResourceConfig`** - AWS Config 高级查询操作不支持资源级权限。该解决方案使用它来跨账户查询 AWS Config 清单。
- **`config:PutEvaluations`** - 此操作不支持资源级权限(根据 AWS API 设计)。Lambda 使用它将合规性结果报告回 AWS Config 自定义规则。
- **`cloudwatch:PutMetricData`** - 此操作不支持资源级权限。访问权限通过 `cloudwatch:namespace` 条件键进行限制,将其范围仅限定在 `DanglingDNS/Detection` 命名空间。
- **`sts:GetCallerIdentity`** - 此操作不支持资源级权限。它返回调用者自己的身份,因此通配符本质上被限定于调用者。
- **AWS KMS 密钥策略** - AWS KMS 密钥策略中的 `AllowAccountRoot` 声明使用 `Action: 'kms:*'` 和 `Resource: '*'`。这是 AWS 推荐的 AWS KMS 密钥策略标准模式。该策略附加在密钥本身,资源就是该密钥,并且该声明的 `Principal` 字段将范围仅限定为账户根用户。限制该操作将阻止账户根用户轮换、计划删除或以其他方式管理密钥,这将破坏 AWS KMS 开发人员指南中记录的恢复逃生舱口。
这些例外还在模板元数据中带有 `cfn_nag` 规则抑制注释和 Checkov `CKV_AWS_111` 跳过,且具有相同的理由。
## 结论
子域名接管是一种可预防的错误配置,始于一条悬挂的 DNS 记录。此解决方案为您所有的 Amazon Route 53 托管区域提供了主动检测,将调查结果集成到 AWS Security Hub 中,并通过 Amazon SNS 通知您,以便您的团队能够在资源名称被重新声明之前采取行动。将其与始终在底层资源之前删除 DNS 记录的操作实践,以及在适用情况下使用新的 Amazon S3 账户区域命名空间功能相结合,以实现分层防御。
要扩展该解决方案,请参阅上面的路线图部分,了解计划在未来支持的其他资源类型。欢迎通过上游存储库的 Pull Request 进行贡献。
## 安全
有关更多信息,请参阅 [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications)。
## 许可证
本库采用 MIT-0 许可证授权。请参阅 [LICENSE](LICENSE) 文件。
标签:AWS, DNS安全, DPI, SOC工具, 云原生合规, 子域名接管检测, 安全规则引擎, 漏洞发现, 逆向工具