- 应用安全
- SAST
- IaC
【免费下载链接】tfsec
Tfsec is now part of Trivy
本篇技术指南围绕 tfsec 内置检查规则azure-database-no-public-firewall-access展开,说明其检查原理、默认严重级别、触发条件与合规写法。读者将掌握如何在 Terraform 配置中识别"允许公共访问"的 Azure SQL / PostgreSQL 防火墙规则,并学会结合 tfsec 命令行参数进行过滤、排除与豁免管理,将数据库防火墙加固落实到 IaC 扫描流程中。
检查规则概览
该规则属于 tfsec 的 Azure 数据库(azure/database)检查类别,在 数据库检查索引 中与no-public-access、enable-ssl-enforcement、enable-audit等规则并列,用于覆盖 Azure 数据库的访问控制面。
| 项目 | 内容 |
|---|---|
| 规则 ID | azure-database-no-public-firewall-access |
| 分类 | azure / database |
| 默认严重级别 | high(高) |
| 检查目标 | azurerm_sql_firewall_rule、azurerm_postgresql_firewall_rule等数据库防火墙规则 |
说明:旧版 tfsec 使用
AZUxxx形式的 legacy 规则 ID,其映射关系维护在 internal/pkg/legacy/map.go 中。从源码结构看,Azure 类规则(AZU001~AZU028)均通过该映射表与azure-*新 ID 关联,因此历史告警记录如需迁移,可参考该文件核对对应关系。
规则原理:为什么起始地址为 0.0.0.0 是危险的
Azure 数据库的防火墙规则通过start_ip_address与end_ip_address定义允许访问的 IP 段。官方文档的解释明确指出了风险模式:
Azure services can be allowed access through the firewall using a start and end IP address of 0.0.0.0. No other end ip address should be combined with a start of 0.0.0.0
即:Azure 服务可以通过"起始与结束 IP 均为 0.0.0.0"的规则获得防火墙放行(该写法语义上代表"允许所有 Azure 内部服务访问")。但若把起始 IP 设为0.0.0.0、结束 IP 设为其他宽泛地址(如255.255.255.255),则会形成对整个公网 IPv4 地址空间的开放,任何互联网主机都能尝试连接数据库。
因此规则的核心判定逻辑可以概括为:
- 起始 IP 为
0.0.0.0,且结束 IP 不是0.0.0.0→不安全,触发 high 告警(存在公共可达的 IP 段); - 起始 IP 与结束 IP 均为
0.0.0.0→ 视为仅向 Azure 内部服务开放,判定通过。
可能的影响
按文档声明,该问题的影响为:
Publicly accessible databases could lead to compromised data
公开可达的数据库会暴露在公网扫描与暴力破解之下,一旦被攻破,将直接导致数据泄露、篡改或勒索。这正是该规则被标记为high严重级别的原因——它不只是一个最佳实践建议,而是关乎数据资产底线的高危风险。
不安全示例(触发检查)
以下 Terraform 配置将触发azure-database-no-public-firewall-access检查失败,因为它把 SQL 与 PostgreSQL 的防火墙规则均配置为0.0.0.0→255.255.255.255:
resource "azurerm_sql_firewall_rule" "bad_example" { name = "bad_rule" resource_group_name = azurerm_resource_group.example.name server_name = azurerm_sql_server.example.name start_ip_address = "0.0.0.0" end_ip_address = "255.255.255.255" } resource "azurerm_postgresql_firewall_rule" "bad_example" { name = "bad_example" resource_group_name = azurerm_resource_group.example.name server_name = azurerm_postgresql_server.example.name start_ip_address = "0.0.0.0" end_ip_address = "255.255.255.255" }触发条件要点
start_ip_address = "0.0.0.0"且end_ip_address = "255.255.255.255":允许全部 IPv4 地址访问,属于最典型的公共访问配置;- 从规则解释推断,任何"起始为
0.0.0.0而结束地址非0.0.0.0"的组合都在告警范围内——即只要该 IP 段宽度超出"仅 Azure 服务"语义,就会被视为公共可达。
安全示例(合规写法)
以下配置会通过检查:起始与结束 IP 均为0.0.0.0,表示仅允许 Azure 服务本身访问,不向公网开放:
resource "azurerm_sql_firewall_rule" "good_example" { name = "good_rule" resource_group_name = azurerm_resource_group.example.name server_name = azurerm_sql_server.example.name start_ip_address = "0.0.0.0" end_ip_address = "0.0.0.0" }更严格的合规建议
原文档建议"不要使用过宽的 IP 段作为 SQL 防火墙范围"。在实际加固中,除0.0.0.0/0.0.0.0写法外,还应遵循以下原则:
- 为每个连接方(办公出口、应用服务器、运维跳板机等)配置精确的单个 IP,即
start_ip_address与end_ip_address相同; - 使用明确的 CIDR 表达内网段,避免
1.0.0.0~255.255.255.255这类宽泛区间; - 优先配合虚拟网络服务终结点(VNet Service Endpoint)或专用链接(Private Link)替代公网防火墙规则;
- 将"允许 Azure 服务访问"的能力限制在确实需要集成的场景(如应用层服务访问),并配合 enable-ssl-enforcement 规则 强制 TLS、no-public-access 规则 检查其他公共暴露面,形成纵深防御。
如何运行检查
tfsec 默认对当前目录递归扫描,无需参数即可执行:
tfsec .针对该规则,常用的观察方式如下。
仅报告本规则:使用--filter-results只保留指定规则的结果:
tfsec --filter-results azure-database-no-public-firewall-access .包含通过项:默认只输出失败结果,使用--include-passed可以看到该规则的"通过"清单,便于验证加固效果:
tfsec --include-passed .按严重级别收敛:该规则为 high,可通过--minimum-severity控制输出下限(CRITICAL、HIGH、MEDIUM、LOW):
tfsec --minimum-severity HIGH .其他常用参数还包括--format(json、sarif、markdown、junit等输出格式)、--out(结果写入文件)、--exclude(排除规则 ID)与--config-file(使用配置文件),完整参数表见 使用指南,也可通过tfsec --help随时查阅。
在 CI 中排除或豁免该规则
临时排除:若团队确实需要宽泛防火墙段(例如非生产环境),可在命令行层面排除规则 ID:
tfsec --exclude azure-database-no-public-firewall-access .代码内豁免:更推荐的方式是在 Terraform 源码中添加忽略注释,tfsec 的豁免机制支持指定规则 ID、过期时间与工作区范围,详见 忽略指南:
resource "azurerm_sql_firewall_rule" "example" { name = "dev_rule" resource_group_name = azurerm_resource_group.example.name server_name = azurerm_sql_server.example.name start_ip_address = "0.0.0.0" end_ip_address = "10.0.0.0" #tfsec:ignore:azure-database-no-public-firewall-access }若希望豁免自动过期、避免"永久忽略"造成的安全债,可追加:exp:yyyy-mm-dd过期声明:
#tfsec:ignore:azure-database-no-public-firewall-access:exp:2027-01-01 resource "azurerm_sql_firewall_rule" "example" { ... }过期后该豁免自动失效,规则将重新生效,强制团队定期复核是否仍需要公共访问。
相关检查与文档导航
同一azure/database分类下的其他规则共同构成了 Azure 数据库安全基线,建议一并启用:
- no-public-access:确保数据库本身不对外公开访问;
- enable-ssl-enforcement:强制数据库连接使用 SSL;
- enable-audit:开启数据库审计;
- retention-period-set:审计日志保留期不低于 90 天。
规则在文档站中的导航配置见 mkdocs.yml(checks/azure/database/no-public-firewall-access节点),完整规则清单可查看 rules.md。
总结
azure-database-no-public-firewall-access是 tfsec 针对 Azure SQL/PostgreSQL 防火墙配置的高危检查:只要start_ip_address为0.0.0.0且结束地址宽于0.0.0.0,即判定为公共可达并产生 high 告警。修复方向是收敛 IP 段为精确地址、以0.0.0.0/0.0.0.0仅放行 Azure 服务,或在 CI 中通过--filter-results、--exclude与tfsec:ignore注释管理例外场景。将该规则纳入 Terraform 扫描流水线,可以在基础设施代码提交阶段就拦截潜在的数据暴露风险。
- 应用安全
- SAST
- IaC
【免费下载链接】tfsec
Tfsec is now part of Trivy
相关推荐
tfsec 安全规则详解:确保 Azure 数据库不公开可访问(azure-database-no-public-access)
tfsec 安全规则详解:确保 Azure 数据库不公开可访问(azure database no public access) 本篇技术指南围绕 tfsec
应用安全SASTIaCtfsec 检查规则详解:禁用 EKS 集群公共访问端点(aws-eks-no-public-cluster-access)
tfsec 检查规则详解:禁用 EKS 集群公共访问端点(aws eks no public cluster access) 本文是 tfsec 内置 AWS
应用安全SASTIaCtfsec 规则详解:aws-rds-no-public-db-access 检查 RDS 数据库公网暴露
tfsec 规则详解:aws rds no public db access 检查 RDS 数据库公网暴露 本文基于 tfsec 官方检查文档 aws rds
应用安全SASTIaC
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考