使用OPA Rego包时如何统计已评估的规则数量与名称
解决OPA Rego评估规则数量与名称统计问题
问题原因
你查询的是整个data.dockerfile_validation包,OPA会将整个包的评估结果封装为单个ResultSet条目返回,而非每个规则对应一条结果。所以len(rs)返回1,这是正常的ResultSet条目数,不是实际评估的规则数量。
解决方案
方法1:明确查询单个规则(需提前知晓规则名)
修改查询语句,用分号分隔多个规则,让每个规则的评估结果单独出现在ResultSet中:
regoQuery := rego.New( rego.Query("data.dockerfile_validation.untrusted_base_image; data.dockerfile_validation.latest_base_image"), rego.Module("./policy/security.rego", string(regoPolicyCode)), rego.Input(inputData), )
此时len(rs)会返回规则的数量(这里是2),每个ResultSet条目对应一条规则的评估结果。
方法2:遍历包结果提取所有规则(无需提前知晓规则名)
如果不知道包内所有规则名称,可通过遍历ResultSet中的表达式结果,提取包下的规则键值对:
rs, err := regoQuery.Eval(context.Background()) if err != nil { // 处理错误逻辑 } // 统计规则数量并收集名称 ruleCount := 0 var ruleNames []string if len(rs) > 0 && rs[0].Expressions[0].Value != nil { packageResults, ok := rs[0].Expressions[0].Value.(map[string]interface{}) if ok { for ruleName := range packageResults { ruleCount++ ruleNames = append(ruleNames, ruleName) } } } fmt.Printf("评估的规则数量:%d\n", ruleCount) fmt.Printf("规则名称:%v\n", ruleNames)
这段代码会从包的结果中解析出所有规则的名称和数量,适配包内任意数量的规则。
额外提示
你的Rego规则中第二个规则的split(input[i].Value[0], ":")存在潜在风险(若input[i].Value不是数组会报错),既然你确认策略能正常评估,说明输入结构匹配,但建议后续验证输入格式避免异常。
内容的提问来源于stack exchange,提问作者santoshdts
相关产品推荐
相关产品推荐

