kogunlowo123/terraform-aws-network-firewall
GitHub: kogunlowo123/terraform-aws-network-firewall
生产级 Terraform 模块,用于部署支持 Suricata 规则和集中式流量检查的 AWS 网络防火墙。
Stars: 0 | Forks: 0
# terraform-aws-network-firewall
生产级 Terraform 模块,用于部署 AWS Network Firewall,支持有状态/无状态规则组、Suricata IDS/IPS 规则、域名过滤以及集中式检查 VPC 模式。
## 架构
### 集中式检查 VPC 模式
```
Internet
|
+------+------+
| Internet GW |
+------+------+
|
+---------+---------+
| Public Subnets |
| (NAT Gateways) |
+---------+---------+
|
+---------+---------+
| Firewall Subnets |
| (Network FW |
| Endpoints) |
+---------+---------+
|
+---------+---------+
| TGW Attachment |
| Subnets |
+---------+---------+
|
+---------+---------+
| Transit Gateway |
+---------+---------+
/ | \
+------+ +---+---+ +------+
|Spoke | |Spoke | |Spoke |
|VPC A | |VPC B | |VPC C |
+------+ +-------+ +------+
```
所有 VPC 间和出口流量都流经集中式检查 VPC,AWS Network Firewall 在此使用无状态 L3/L4 规则、Suricata 兼容的 IDS/IPS 特征以及基于域名的过滤执行深度包检测。
## 功能特性
- **多可用区部署** - 跨多个可用区的防火墙终端节点,实现高可用性
- **无状态规则组** - 具有可配置匹配属性(协议、端口、CIDR、TCP 标志)的 L3/L4 包过滤
- **Suricata IDS/IPS 规则** - 完整的 Suricata 兼容规则引擎,用于深度包检测和威胁检测
- **域名过滤** - 通过 HTTP Host 头和 TLS SNI 检查来阻止或允许域名
- **5-Tuple 规则** - 具有源/目标 IP、端口和协议匹配的传统有状态防火墙规则
- **严格规则排序** - 有状态引擎配置为严格顺序,以实现可预测的规则评估
- **灵活日志记录** - 将 ALERT 和 FLOW 日志发送到 CloudWatch Logs 或 S3
- **S3 日志管理** - 自动创建存储桶,支持版本控制、加密、生命周期策略和屏蔽公开访问
- **KMS 加密** - 支持 AWS 托管或客户托管的 KMS 密钥
- **删除保护** - 可配置的防止意外删除防火墙的保护机制
## 用法
### 基础 - 无状态规则
```
module "network_firewall" {
source = "kogunlowo123/network-firewall/aws"
name = "my-firewall"
vpc_id = "vpc-abc123"
subnet_ids = {
"us-east-1a" = "subnet-111"
"us-east-1b" = "subnet-222"
}
stateless_rule_groups = [
{
name = "block-icmp"
priority = 1
capacity = 100
rules = [
{
priority = 1
actions = ["aws:drop"]
match_attributes = {
protocols = [1]
source = ["0.0.0.0/0"]
destination = ["0.0.0.0/0"]
}
}
]
}
]
}
```
### 高级 - Suricata 规则和域名过滤
```
module "network_firewall" {
source = "kogunlowo123/network-firewall/aws"
name = "advanced-firewall"
vpc_id = "vpc-abc123"
subnet_ids = {
"us-east-1a" = "subnet-111"
"us-east-1b" = "subnet-222"
}
stateful_rule_groups = [
{
name = "suricata-rules"
capacity = 200
type = "SURICATA"
rules_string = <<-EOT
drop ssh any any -> $HOME_NET 22 (msg:"SSH brute force"; threshold:type both, track by_src, count 5, seconds 60; sid:1000001; rev:1;)
drop tcp $HOME_NET any -> $EXTERNAL_NET [4444,5555] (msg:"C2 blocked"; sid:1000002; rev:1;)
EOT
rule_variables = {
HOME_NET = ["10.0.0.0/16"]
EXTERNAL_NET = ["0.0.0.0/0"]
}
},
{
name = "domain-blocklist"
capacity = 100
type = "DOMAIN_LIST"
domain_list = [
".malware-domain.com",
".phishing-site.net"
]
}
]
enable_logging = true
log_destination_type = "s3"
log_types = ["ALERT", "FLOW"]
}
```
## 需求
| Name | Version |
|------|---------|
| terraform | >= 1.5.0 |
| aws | >= 5.20.0 |
## 输入变量
| Name | Description | Type | Default | Required |
|------|-------------|------|---------|----------|
| name | 所有 Network Firewall 资源的名称前缀 | `string` | n/a | yes |
| vpc_id | 部署 Network Firewall 的 VPC ID | `string` | n/a | yes |
| subnet_ids | 用于防火墙终端节点放置的可用区到子网 ID 的映射 | `map(string)` | n/a | yes |
| firewall_policy_name | 防火墙策略的名称 | `string` | `""` | no |
| stateless_rule_groups | 无状态规则组配置列表 | `list(object)` | `[]` | no |
| stateful_rule_groups | 有状态规则组配置列表 (SURICATA, DOMAIN_LIST, 5TUPLE) | `list(object)` | `[]` | no |
| stateless_default_actions | 无状态规则的默认操作 | `list(string)` | `["aws:forward_to_sfe"]` | no |
| stateless_fragment_default_actions | 分片数据包的默认操作 | `list(string)` | `["aws:forward_to_sfe"]` | no |
| enable_logging | 启用 Network Firewall 的日志记录 | `bool` | `true` | no |
| log_destination_type | 防火墙日志的目标类型 (s3 或 cloudwatch) | `string` | `"cloudwatch"` | no |
| log_types | 要启用的日志类型 (ALERT 和/或 FLOW) | `list(string)` | `["ALERT", "FLOW"]` | no |
| deletion_protection | 为防火墙启用删除保护 | `bool` | `false` | no |
| encryption_type | 加密配置类型 (AWS_OWNED_KMS_KEY 或 CUSTOMER_KMS) | `string` | `"AWS_OWNED_KMS_KEY"` | no |
| kms_key_arn | 用于加密的 KMS 密钥 ARN(当 encryption_type 为 CUSTOMER_KMS 时必需) | `string` | `null` | no |
| tags | 应用于所有资源的标签映射 | `map(string)` | `{}` | no |
## 输出
| Name | Description |
|------|-------------|
| firewall_id | Network Firewall 的唯一标识符 |
| firewall_arn | Network Firewall 的 ARN |
| firewall_status | Network Firewall 的当前状态 |
| endpoint_ids | 防火墙的可用区到 VPC 终端节点 ID 的映射 |
| policy_arn | 防火墙策略的 ARN |
| logging_configuration_id | 日志配置的 ID |
## 示例
- [基础](examples/basic/) - 带有无状态规则的简单防火墙
- [高级](examples/advanced/) - 带有 Suricata 规则和域名过滤的完整防火墙
- [完整](examples/complete/) - 具有 Transit Gateway 集成的集中式检查 VPC 模式
## 安全注意事项
1. **纵深防御**:将 Network Firewall 与 Security Groups 和 NACLs 结合使用,实现分层安全
2. **规则排序**:有状态规则使用严格排序 - 确保规则优先级正确
3. **Suricata 规则**:在切换到丢弃操作之前,先在仅告警模式下测试 Suricata 规则
4. **域名过滤**:域名列表检查 HTTP Host 头和 TLS SNI;不解密 TLS 流量
5. **日志记录**:始终启用 ALERT 和 FLOW 日志,以进行取证分析和合规性审计
6. **加密**:对于需要密钥轮换控制的敏感环境,请使用客户托管的 KMS 密钥
7. **设备模式**:在 Transit Gateway 附件上启用设备模式以实现对称路由
8. **删除保护**:在生产环境中启用以防止意外删除防火墙
## 成本估算
AWS Network Firewall 定价(us-east-1,如有变更恕不另行通知):
| Component | Cost |
|-----------|------|
| Firewall endpoint (per AZ) | ~$0.395/hour (~$288/month) |
| Data processed | ~$0.065/GB |
**示例**:处理 1 TB/月的 2 个可用区部署:
- 终端节点:2 x $288 = $576/月
- 数据处理:1000 GB x $0.065 = $65/月
- **总计:约 $641/月**
## 参考资料
- [AWS Network Firewall 文档](https://docs.aws.amazon.com/network-firewall/latest/developerguide/)
- [AWS Network Firewall 定价](https://aws.amazon.com/network-firewall/pricing/)
- [Suricata 规则格式](https://suricata.readthedocs.io/en/latest/rules/)
- [集中式检查架构](https://docs.aws.amazon.com/prescriptive-guidance/latest/inline-traffic-inspection-third-party-appliances/)
- [Terraform AWS Network Firewall 资源](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/networkfirewall_firewall)
## 许可证
MIT 许可。详见 [LICENSE](LICENSE)。
标签:AWS, AWS Network Firewall, DNS 反向解析, DPI, EC2, ECS, IaC, IPS, IP 地址批量处理, Metaprompt, NAT Gateway, Network Firewall, Suricata, Terraform, Transit Gateway, VPC, 代码注入, 入侵防御, 威胁检测与响应, 无状态规则, 流量监控, 深度包检测, 状态检测, 现代安全运营, 网络安全, 网络安全分析, 规则组, 防火墙模块, 隐私保护, 集中式检查