- 应用安全
- SAST
- IaC
【免费下载链接】tfsec
Tfsec is now part of Trivy
本文是 tfsec 安全检查规则google-sql-enable-backup的深度技术解读。该规则用于检测 Terraform 中 Google Cloud SQL(google_sql_database_instance)实例是否启用了自动备份,属于 Google SQL 服务、默认严重级别为medium的内置检查。读完本文,你将掌握该规则的判定逻辑、不安全的 Terraform 写法与正确修复写法、如何在本地与 CI 中运行/过滤该检查,以及如何基于源码理解 tfsec 规则文档的生成机制。
一、规则概览:身份、归属与严重级别
google-sql-enable-backup是 tfsec 针对 Google 云平台提供的内置检查之一,其官方规则文档位于 docs/checks/google/sql/enable-backup/index.md,规则全称(Check ID)为google-sql-enable-backup,主题是“Enable automated backups to recover from>resource "google_sql_database_instance" "db" { name = "db" database_version = "POSTGRES_12" region = "us-central1" settings { backup_configuration { enabled = false } } }
需要特别说明:即使完全省略backup_configuration块,也同样无法通过该检查。因为 Cloud SQL 的自动备份默认关闭,tfsec 判定的是“实例最终是否处于备份开启状态”。因此,安全写法必须显式声明enabled = true。
3.2 安全示例(通过google-sql-enable-backup检查)
以下配置通过将enabled设置为true,显式开启了自动备份:
resource "google_sql_database_instance" "db" { name = "db" database_version = "POSTGRES_12" region = "us-central1" settings { backup_configuration { enabled = true } } }3.3 关键字段说明
| 字段 | 取值 | 说明 |
|---|---|---|
database_version | POSTGRES_12等 | 数据库引擎版本,示例为 PostgreSQL 12 |
region | us-central1等 | 实例部署区域 |
settings.backup_configuration.enabled | true/false | 自动备份开关,本规则唯一关注的判定点 |
需要指出的是,backup_configuration块在官方 Terraform 资源文档中还支持start_time(备份开始时间)、日志保留等附加配置;本规则只要求enabled为true,其余字段可结合实际容灾需求(如备份窗口、PITR 时间点恢复)进一步补充,相关细节可参见原文档 Links 部分指向的 Terraform 官方资源文档与 Google Cloud 备份/恢复文档。
四、tfsec 如何执行与渲染该检查(源码级解析)
4.1 规则文档的自动生成
本文解读的这份规则页面并非手写,而是由 tfsec 文档生成器自动产出的。在 cmd/tfsec-docs/webpage.go 的generateWebPage函数中,每个检查的ID、ShortCode、Severity、Summary、Explanation、Impact、Resolution、BadExample、GoodExample、Links会被填充进baseWebPageTemplate模板,最终渲染为docs/checks/google/sql/enable-backup/index.md这样的页面文件。也就是说,你看到的“不安全示例/安全示例/影响/修复”结构,正是 tfsec 规则元数据的标准化呈现。
4.2 扫描引擎与依赖
当前 tfsec 的扫描能力由 aquasecurity/defsec 中,项目直接依赖github.com/aquasecurity/defsec v0.84.1;internal/app/tfsec/cmd/flags.go 与 internal/app/tfsec/cmd/root.go 中则通过 defsec 的terraformscanner 加载并执行规则。因此,google-sql-enable-backup的实际判定逻辑运行在 defsec 的 Google SQL 规则集中,tfsec 负责解析 HCL、构建执行上下文并汇总结果。
从源码结构可以推断:与 AWS 规则拥有独立旧编号(如AWS052)不同,google-sql-enable-backup直接使用 defsec 的统一 ID 体系——internal/pkg/legacy/map.go 与 internal/pkg/ignores/migration.go 中列出的旧 ID 到新 ID 的迁移映射仅覆盖 AWS 规则,未包含任何google-*规则。
4.3 命令行为:退出码与严重级别过滤
tfsec 可直接对当前目录或指定目录执行扫描:
# 扫描当前目录下的 Terraform 文件 tfsec . # 扫描指定目录 tfsec path/to/terraform运行入口见 cmd/tfsec/main.go,其中还会在 stderr 打印一条提示:tfsec 已加入 Trivy 家族,后续工程重心将转向 Trivy,tfsec 本体在一段时间内仍可使用。
执行结果对应的退出码逻辑定义在 internal/app/tfsec/cmd/root.go 的getDetailedExitCode函数中:
- 退出码 0:没有规则失败;
- 退出码 2:有失败的规则,但全部为 LOW 严重级别;
- 退出码 1:存在任意 CRITICAL / HIGH / MEDIUM 级别的失败规则。
由于google-sql-enable-backup是 medium 级别,一旦触发失败,命令将以退出码1结束,非常适合直接接入 CI 门禁——任何未开启自动备份的 Cloud SQL 实例都会让流水线失败。
如需按严重级别过滤报告,可使用--minimum-severity/-m参数(见 docs/guides/usage.md):
# 仅报告 MEDIUM 及以上级别的结果 tfsec --minimum-severity MEDIUM . # 排除该规则 tfsec --exclude google-sql-enable-backup .也可以在配置文件(.tfsec/config.json或config.yml,或通过--config-file指定)中设置全局最小严重级别,详见 docs/guides/configuration/config.md:
{ "minimum_severity": "MEDIUM" }配置文件的解析实现位于 internal/pkg/config/config.go,其中MinimumSeverity字段对应配置键minimum_severity,SeverityOverrides字段还允许把某个检查的默认级别覆盖为其他级别(例如把google-sql-enable-backup提升为 HIGH),从而按团队策略调整告警优先级。
五、合理豁免:ignore 机制与风险提示
在某些场景下,团队可能希望临时豁免该检查(例如短生命周期的临时分析库、明确不开启备份的开发环境)。tfsec 支持在 HCL 源码中通过注释行内豁免,完整语法见 docs/guides/configuration/ignores.md:
resource "google_sql_database_instance" "db" { name = "db" database_version = "POSTGRES_12" region = "us-central1" settings { backup_configuration { enabled = false #tfsec:ignore:google-sql-enable-backup } } }或把 ignore 注释单独放在问题行上方:
settings { #tfsec:ignore:google-sql-enable-backup backup_configuration { enabled = false } }还可以为豁免设置过期时间,避免“忽略后被永久遗忘”:
#tfsec:ignore:google-sql-enable-backup:exp:2026-12-31过期之后,该豁免自动失效,检查会重新生效。需要注意的是:忽略不等于修复。在涉及生产数据的关键数据库上,建议优先按安全示例显式开启自动备份,而不是依赖 ignore 注释。
六、从检查到落地:推荐实践清单
结合本文内容,可将google-sql-enable-backup的落地实践总结为以下步骤:
- 编写时:在所有
google_sql_database_instance资源的settings.backup_configuration中显式设置enabled = true; - 本地验证:运行
tfsec .或tfsec --minimum-severity MEDIUM .,确认无 medium 及以上告警,退出码为 0; - CI 集成:将 tfsec 加入流水线,利用退出码 1/2/0 语义控制门禁;
- 豁免管理:确需豁免的场景使用
#tfsec:ignore:google-sql-enable-backup:exp:yyyy-mm-dd并设置过期时间; - 配套加固:结合同目录下的 encrypt-in-transit-data、no-public-access 等 SQL 规则,构建完整的 Cloud SQL 安全基线。
七、相关资源
- 规则原文:docs/checks/google/sql/enable-backup/index.md
- SQL 服务检查索引:docs/checks/google/sql/index.md
- 命令行完整参数表:docs/guides/usage.md
- 配置文件(最小严重级别、级别覆盖):docs/guides/configuration/config.md
- 忽略/豁免机制:docs/guides/configuration/ignores.md
- 规则文档生成器:cmd/tfsec-docs/webpage.go
- 扫描依赖声明:go.mod
- 应用安全
- SAST
- IaC
【免费下载链接】tfsec
Tfsec is now part of Trivy
相关推荐
tfsec 规则详解:为 Azure SQL 数据库启用审计(azure-database-enable-audit)
tfsec 规则详解:为 Azure SQL 数据库启用审计(azure database enable audit) 本篇技术指南围绕 tfsec 内置检查规
应用安全SASTIaCtfsec 检查项详解:google-sql-no-contained-db-auth —— Google Cloud SQL 包含数据库身份验证安全配置
tfsec 检查项详解:google sql no contained db auth —— Google Cloud SQL 包含数据库身份验证安全配置 本篇
应用安全SASTIaCtfsec 检查项详解:确保 Google Cloud SQL PostgreSQL 实例开启锁等待日志(google-sql-pg-log-lock-waits)
tfsec 检查项详解:确保 Google Cloud SQL PostgreSQL 实例开启锁等待日志(google sql pg log lock wait
应用安全SASTIaC
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考