Conftest Verify意外通过:规则未触发预期失败问题排查
问题
运行conftest verify时,尽管规则本应在db.storage_encrypted != true的场景下触发失败,但结果却显示通过。相关代码如下:
# deny.rego deny_unencrypted[msg] { db := input.resource.aws_db_instance[x] db.storage_encrypted != true # 预期此处触发失败 msg = sprintf("RDS `%v` has unencrypted storage", [x]) } # deny_test.rego test_unencrypted { cfg := parse_config("hcl2", ` resource "aws_db_instance" "default" { storage_encrypted = true } `) deny_unencrypted with input as cfg }
分析与解决
问题根源在于测试用例逻辑错误,同时规则的严谨性不足,具体修正点如下:
测试用例逻辑完全写反
当前测试用例配置了storage_encrypted = true,此时规则中db.storage_encrypted != true的条件不成立,deny_unencrypted不会生成任何结果,测试test_unencrypted会直接失败。你需要把测试用例中的storage_encrypted设为false,或者直接删除该字段,来验证规则是否正确触发:# 修正后的 deny_test.rego test_unencrypted { cfg := parse_config("hcl2", ` resource "aws_db_instance" "default" { storage_encrypted = false } `) deny_unencrypted with input as cfg }也可以测试未配置该字段的场景:
test_unencrypted_missing { cfg := parse_config("hcl2", ` resource "aws_db_instance" "default" { engine = "mysql" instance_class = "db.t3.micro" } `) deny_unencrypted with input as cfg }规则补充未配置字段的处理
如果Terraform配置中完全没有设置storage_encrypted字段,db.storage_encrypted的值会是undefined,此时db.storage_encrypted != true的判断在Rego中成立,但为了更严谨,建议显式覆盖这种场景:# 修正后的 deny.rego deny_unencrypted[msg] { db := input.resource.aws_db_instance[x] not db.storage_encrypted == true # 同时覆盖未设置和设置为false的情况 msg = sprintf("RDS `%v` has unencrypted storage", [x]) }确认conftest扫描路径
运行conftest verify时,确保指定了正确的Terraform配置文件路径,比如conftest verify ./terraform,否则conftest可能未扫描到目标资源,导致规则未触发。
内容的提问来源于stack exchange,提问作者Gerald
相关产品推荐
相关产品推荐

