diff --git a/cmd/go.mod b/cmd/go.mod index f9bd0560..f9985710 100644 --- a/cmd/go.mod +++ b/cmd/go.mod @@ -7,7 +7,7 @@ replace github.com/armosec/kubescape/core => ../core require ( github.com/armosec/k8s-interface v0.0.68 github.com/armosec/kubescape/core v0.0.0-00010101000000-000000000000 - github.com/armosec/opa-utils v0.0.127 + github.com/armosec/opa-utils v0.0.129 github.com/armosec/rbac-utils v0.0.14 github.com/google/uuid v1.3.0 github.com/mattn/go-isatty v0.0.14 diff --git a/cmd/go.sum b/cmd/go.sum index a56d5ba2..92081779 100644 --- a/cmd/go.sum +++ b/cmd/go.sum @@ -109,8 +109,8 @@ github.com/armosec/k8s-interface v0.0.66/go.mod h1:vwprS8qn/iowd5yf0JHpqDsLA5I8W github.com/armosec/k8s-interface v0.0.68 h1:6CtSakISiI47YHkxh+Va9FzZQIBkWa6g9sbiNxq1Zkk= github.com/armosec/k8s-interface v0.0.68/go.mod h1:PeWn41C2uenZi+xfZdyFF/zG5wXACA00htQyknDUWDE= github.com/armosec/opa-utils v0.0.64/go.mod h1:6tQP8UDq2EvEfSqh8vrUdr/9QVSCG4sJfju1SXQOn4c= -github.com/armosec/opa-utils v0.0.127 h1:uVyH/+pjpiA0oBO6QODjtdCiPgHx7KQ/TcxxkPvAl4c= -github.com/armosec/opa-utils v0.0.127/go.mod h1:gap+EaLG5rnyqvIRGxtdNDC9y7VvoGNm90zK8Ls7avQ= +github.com/armosec/opa-utils v0.0.129 h1:5ezMd558f9MtLlwLWHBeyrBGThaFYSeGhY9f1KQPemw= +github.com/armosec/opa-utils v0.0.129/go.mod h1:gap+EaLG5rnyqvIRGxtdNDC9y7VvoGNm90zK8Ls7avQ= github.com/armosec/rbac-utils v0.0.1/go.mod h1:pQ8CBiij8kSKV7aeZm9FMvtZN28VgA7LZcYyTWimq40= github.com/armosec/rbac-utils v0.0.14 h1:CKYKcgqJEXWF2Hen/B1pVGtS3nDAG1wp9dDv6oNtq90= github.com/armosec/rbac-utils v0.0.14/go.mod h1:Ex/IdGWhGv9HZq6Hs8N/ApzCKSIvpNe/ETqDfnuyah0= diff --git a/core/cautils/scaninfo.go b/core/cautils/scaninfo.go index bc2cbf74..839fdc3a 100644 --- a/core/cautils/scaninfo.go +++ b/core/cautils/scaninfo.go @@ -226,8 +226,28 @@ func scanInfoToScanMetadata(scanInfo *ScanInfo) *reporthandlingv2.Metadata { metadata.ScanMetadata.ScanningTarget = reporthandlingv2.Cluster if scanInfo.GetScanningEnvironment() == ScanLocalFiles { - metadata.ScanMetadata.ScanningTarget = reporthandlingv2.Files + metadata.ScanMetadata.ScanningTarget = reporthandlingv2.File } return metadata } + +func setContextMetadata(contextMetadata *reporthandlingv2.ContextMetadata, input string) { + // if cluster + if input == "" { + return + } + + // if url + if strings.HasPrefix(input, "http") { // TODO - check if can parse + return + } + + // if single file + if strings.HasPrefix(input, "http") { // TODO - check if can parse + return + } + + // if dir/glob + +} diff --git a/core/go.mod b/core/go.mod index 79aa77d9..539ddfdb 100644 --- a/core/go.mod +++ b/core/go.mod @@ -5,7 +5,7 @@ go 1.17 require ( github.com/armosec/armoapi-go v0.0.58 github.com/armosec/k8s-interface v0.0.68 - github.com/armosec/opa-utils v0.0.127 + github.com/armosec/opa-utils v0.0.129 github.com/armosec/rbac-utils v0.0.14 github.com/armosec/utils-go v0.0.3 github.com/armosec/utils-k8s-go v0.0.3 diff --git a/core/go.sum b/core/go.sum index f6ac1fc5..6e7d0eda 100644 --- a/core/go.sum +++ b/core/go.sum @@ -109,8 +109,8 @@ github.com/armosec/k8s-interface v0.0.66/go.mod h1:vwprS8qn/iowd5yf0JHpqDsLA5I8W github.com/armosec/k8s-interface v0.0.68 h1:6CtSakISiI47YHkxh+Va9FzZQIBkWa6g9sbiNxq1Zkk= github.com/armosec/k8s-interface v0.0.68/go.mod h1:PeWn41C2uenZi+xfZdyFF/zG5wXACA00htQyknDUWDE= github.com/armosec/opa-utils v0.0.64/go.mod h1:6tQP8UDq2EvEfSqh8vrUdr/9QVSCG4sJfju1SXQOn4c= -github.com/armosec/opa-utils v0.0.127 h1:uVyH/+pjpiA0oBO6QODjtdCiPgHx7KQ/TcxxkPvAl4c= -github.com/armosec/opa-utils v0.0.127/go.mod h1:gap+EaLG5rnyqvIRGxtdNDC9y7VvoGNm90zK8Ls7avQ= +github.com/armosec/opa-utils v0.0.129 h1:5ezMd558f9MtLlwLWHBeyrBGThaFYSeGhY9f1KQPemw= +github.com/armosec/opa-utils v0.0.129/go.mod h1:gap+EaLG5rnyqvIRGxtdNDC9y7VvoGNm90zK8Ls7avQ= github.com/armosec/rbac-utils v0.0.1/go.mod h1:pQ8CBiij8kSKV7aeZm9FMvtZN28VgA7LZcYyTWimq40= github.com/armosec/rbac-utils v0.0.14 h1:CKYKcgqJEXWF2Hen/B1pVGtS3nDAG1wp9dDv6oNtq90= github.com/armosec/rbac-utils v0.0.14/go.mod h1:Ex/IdGWhGv9HZq6Hs8N/ApzCKSIvpNe/ETqDfnuyah0= diff --git a/core/pkg/resultshandling/printer/v2/controltable.go b/core/pkg/resultshandling/printer/v2/controltable.go index d71cb3d1..d0282753 100644 --- a/core/pkg/resultshandling/printer/v2/controltable.go +++ b/core/pkg/resultshandling/printer/v2/controltable.go @@ -7,68 +7,121 @@ import ( "github.com/armosec/opa-utils/reporthandling/apis" "github.com/armosec/opa-utils/reporthandling/results/v1/reportsummary" "github.com/fatih/color" + "github.com/olekukonko/tablewriter" ) -func generateRow(controlSummary reportsummary.IControlSummary, infoToPrintInfo []infoStars) []string { - row := []string{controlSummary.GetName()} - row = append(row, fmt.Sprintf("%d", controlSummary.NumberOfResources().Failed())) - row = append(row, fmt.Sprintf("%d", controlSummary.NumberOfResources().Excluded())) - row = append(row, fmt.Sprintf("%d", controlSummary.NumberOfResources().All())) +const ( + columnSeverity = iota + columnName = iota + columnCounterFailed = iota + columnCounterExclude = iota + columnCounterAll = iota + columnRiskScore = iota + columnInfo = iota + _rowLen = iota +) - if controlSummary.GetStatus().IsPassed() { - row = append(row, color.CyanString("Passed")) - } else if controlSummary.GetStatus().IsSkipped() { - row = append(row, "skipped") - } else { - row = append(row, setColor(apis.ControlSeverityToString(controlSummary.GetScoreFactor()))) +func generateRow(controlSummary reportsummary.IControlSummary, infoToPrintInfo []infoStars, verbose bool) []string { + row := make([]string, _rowLen) + + // ignore passed results + if !verbose && (controlSummary.GetStatus().IsPassed()) { + return []string{} } - if !controlSummary.GetStatus().IsSkipped() { - row = append(row, fmt.Sprintf("%d", int(controlSummary.GetScore()))+"%") - row = append(row, "") - } else { - row = append(row, string(controlSummary.GetStatus().Status())) - if controlSummary.GetStatus().IsSkipped() { - stars := "" - for i := range infoToPrintInfo { - if infoToPrintInfo[i].info == controlSummary.GetStatus().Info() { - stars = infoToPrintInfo[i].stars - break - } - } - row = append(row, stars) - } else { - row = append(row, "") - } + // ignore irelevant results + if !verbose && (controlSummary.GetStatus().IsSkipped() && controlSummary.GetStatus().Status() == apis.StatusIrrelevant) { + return []string{} } + + row[columnSeverity] = getSeverityColumn(controlSummary) + row[columnName] = controlSummary.GetName() + row[columnCounterFailed] = fmt.Sprintf("%d", controlSummary.NumberOfResources().Failed()) + row[columnCounterExclude] = fmt.Sprintf("%d", controlSummary.NumberOfResources().Excluded()) + row[columnCounterAll] = fmt.Sprintf("%d", controlSummary.NumberOfResources().All()) + row[columnRiskScore] = getRiskScoreColumn(controlSummary) + row[columnInfo] = getInfoColumn(controlSummary, infoToPrintInfo) + return row } -func setColor(controlSeverity string) string { +func getInfoColumn(controlSummary reportsummary.IControlSummary, infoToPrintInfo []infoStars) string { + if !controlSummary.GetStatus().IsSkipped() { + return "" + } + + if controlSummary.GetStatus().IsSkipped() { + for i := range infoToPrintInfo { + if infoToPrintInfo[i].info == controlSummary.GetStatus().Info() { + return infoToPrintInfo[i].stars + } + } + } + return "" +} + +func getRiskScoreColumn(controlSummary reportsummary.IControlSummary) string { + if controlSummary.GetStatus().IsSkipped() { + return string(controlSummary.GetStatus().Status()) + } + return fmt.Sprintf("%d", int(controlSummary.GetScore())) + "%" +} + +func getSeverityColumn(controlSummary reportsummary.IControlSummary) string { + // if controlSummary.GetStatus().IsPassed() || controlSummary.GetStatus().IsSkipped() { + // return " " + // } + severity := apis.ControlSeverityToString(controlSummary.GetScoreFactor()) + return color.New(getColor(severity), color.Bold).SprintFunc()(severity) +} +func getColor(controlSeverity string) color.Attribute { switch controlSeverity { case "Critical": - return color.New(color.FgRed, color.Bold).Add(color.Underline).SprintFunc()(controlSeverity) + return color.FgRed case "High": - return color.New(color.FgRed, color.Bold).SprintFunc()(controlSeverity) + return color.FgYellow case "Medium": - return color.New(color.FgYellow, color.Bold).SprintFunc()(controlSeverity) + return color.FgCyan case "Low": - return color.New(color.FgGreen, color.Bold).SprintFunc()(controlSeverity) + return color.FgWhite default: - return color.New(color.FgBlue, color.Bold).SprintFunc()(controlSeverity) + return color.FgWhite } } -func getSortedControlsNames(controls reportsummary.ControlSummaries) []string { - controlNames := make([]string, 0, len(controls)) +func getSortedControlsNames(controls reportsummary.ControlSummaries) [][]string { + controlNames := make([][]string, 5) for k := range controls { c := controls[k] - controlNames = append(controlNames, c.GetName()) + i := apis.ControlSeverityToInt(c.GetScoreFactor()) + controlNames[i] = append(controlNames[i], c.GetName()) + } + for i := range controlNames { + sort.Strings(controlNames[i]) } - sort.Strings(controlNames) return controlNames } func getControlTableHeaders() []string { - return []string{"CONTROL NAME", "FAILED RESOURCES", "EXCLUDED RESOURCES", "ALL RESOURCES", "SEVERITY", "% RISK-SCORE", "INFO"} + headers := make([]string, _rowLen) + headers[columnName] = "CONTROL NAME" + headers[columnCounterFailed] = "FAILED RESOURCES" + headers[columnCounterExclude] = "EXCLUDED RESOURCES" + headers[columnCounterAll] = "ALL RESOURCES" + headers[columnSeverity] = "SEVERITY" + headers[columnRiskScore] = "% RISK-SCORE" + headers[columnInfo] = "INFO" + return headers +} + +func getColumnsAlignments() []int { + alignments := make([]int, _rowLen) + alignments[columnName] = tablewriter.ALIGN_LEFT + alignments[columnCounterFailed] = tablewriter.ALIGN_CENTER + alignments[columnCounterExclude] = tablewriter.ALIGN_CENTER + alignments[columnCounterAll] = tablewriter.ALIGN_CENTER + alignments[columnSeverity] = tablewriter.ALIGN_LEFT + alignments[columnRiskScore] = tablewriter.ALIGN_CENTER + alignments[columnRiskScore] = tablewriter.ALIGN_CENTER + return alignments } diff --git a/core/pkg/resultshandling/printer/v2/pdf.go b/core/pkg/resultshandling/printer/v2/pdf.go index 43cccd82..197434d9 100644 --- a/core/pkg/resultshandling/printer/v2/pdf.go +++ b/core/pkg/resultshandling/printer/v2/pdf.go @@ -31,8 +31,7 @@ var ( ) type PdfPrinter struct { - writer *os.File - sortedControlNames []string + writer *os.File } func NewPdfPrinter() *PdfPrinter { @@ -76,13 +75,13 @@ func (pdfPrinter *PdfPrinter) printInfo(m pdf.Maroto, summaryDetails *reportsumm } func (pdfPrinter *PdfPrinter) ActionPrint(opaSessionObj *cautils.OPASessionObj) { - pdfPrinter.sortedControlNames = getSortedControlsNames(opaSessionObj.Report.SummaryDetails.Controls) + sortedControlNames := getSortedControlsNames(opaSessionObj.Report.SummaryDetails.Controls) infoToPrintInfo := mapInfoToPrintInfo(opaSessionObj.Report.SummaryDetails.Controls) m := pdf.NewMaroto(consts.Portrait, consts.A4) pdfPrinter.printHeader(m) pdfPrinter.printFramework(m, opaSessionObj.Report.SummaryDetails.ListFrameworks()) - pdfPrinter.printTable(m, &opaSessionObj.Report.SummaryDetails) + pdfPrinter.printTable(m, &opaSessionObj.Report.SummaryDetails, sortedControlNames) pdfPrinter.printFinalResult(m, &opaSessionObj.Report.SummaryDetails) pdfPrinter.printInfo(m, &opaSessionObj.Report.SummaryDetails, infoToPrintInfo) @@ -149,15 +148,17 @@ func (pdfPrinter *PdfPrinter) printFramework(m pdf.Maroto, frameworks []reportsu } // Create pdf table -func (pdfPrinter *PdfPrinter) printTable(m pdf.Maroto, summaryDetails *reportsummary.SummaryDetails) { +func (pdfPrinter *PdfPrinter) printTable(m pdf.Maroto, summaryDetails *reportsummary.SummaryDetails, sortedControlNames [][]string) { headers := getControlTableHeaders() infoToPrintInfoMap := mapInfoToPrintInfo(summaryDetails.Controls) - controls := make([][]string, len(pdfPrinter.sortedControlNames)) + controls := make([][]string, len(sortedControlNames)) for i := range controls { controls[i] = make([]string, len(headers)) } - for i := 0; i < len(pdfPrinter.sortedControlNames); i++ { - controls[i] = generateRow(summaryDetails.Controls.GetControl(reportsummary.EControlCriteriaName, pdfPrinter.sortedControlNames[i]), infoToPrintInfoMap) + for i := len(sortedControlNames) - 1; i >= 0; i-- { + for _, c := range sortedControlNames[i] { + controls[i] = generateRow(summaryDetails.Controls.GetControl(reportsummary.EControlCriteriaName, c), infoToPrintInfoMap, true) + } } m.TableList(headers, controls, props.TableList{ @@ -186,7 +187,7 @@ func (pdfPrinter *PdfPrinter) printTable(m pdf.Maroto, summaryDetails *reportsum // Add final results. func (pdfPrinter *PdfPrinter) printFinalResult(m pdf.Maroto, summaryDetails *reportsummary.SummaryDetails) { - m.Row(5, func() { + m.Row(_rowLen, func() { m.Col(3, func() { m.Text("Resource summary", props.Text{ Align: consts.Left, diff --git a/core/pkg/resultshandling/printer/v2/prettyprinter.go b/core/pkg/resultshandling/printer/v2/prettyprinter.go index 67385a0b..f7b34ea2 100644 --- a/core/pkg/resultshandling/printer/v2/prettyprinter.go +++ b/core/pkg/resultshandling/printer/v2/prettyprinter.go @@ -17,10 +17,9 @@ import ( ) type PrettyPrinter struct { - formatVersion string - writer *os.File - verboseMode bool - sortedControlNames []string + formatVersion string + writer *os.File + verboseMode bool } func NewPrettyPrinter(verboseMode bool, formatVersion string) *PrettyPrinter { @@ -31,14 +30,20 @@ func NewPrettyPrinter(verboseMode bool, formatVersion string) *PrettyPrinter { } func (prettyPrinter *PrettyPrinter) ActionPrint(opaSessionObj *cautils.OPASessionObj) { - prettyPrinter.sortedControlNames = getSortedControlsNames(opaSessionObj.Report.SummaryDetails.Controls) // ListControls().All()) + sortedControlNames := getSortedControlsNames(opaSessionObj.Report.SummaryDetails.Controls) // ListControls().All()) - if prettyPrinter.formatVersion == "v1" { - prettyPrinter.printResults(&opaSessionObj.Report.SummaryDetails.Controls, opaSessionObj.AllResources) - } else if prettyPrinter.formatVersion == "v2" { - prettyPrinter.resourceTable(opaSessionObj.ResourcesResult, opaSessionObj.AllResources) + if prettyPrinter.verboseMode { + if prettyPrinter.formatVersion == "v1" { + prettyPrinter.printResults(&opaSessionObj.Report.SummaryDetails.Controls, opaSessionObj.AllResources, sortedControlNames) + } else if prettyPrinter.formatVersion == "v2" { + prettyPrinter.resourceTable(opaSessionObj.ResourcesResult, opaSessionObj.AllResources) + } + } + prettyPrinter.printSummaryTable(&opaSessionObj.Report.SummaryDetails, sortedControlNames) + + if !prettyPrinter.verboseMode { + cautils.SimpleDisplay(prettyPrinter.writer, "\n%s Run with '--verbose' flag for full scan details\n", emoji.Detective) } - prettyPrinter.printSummaryTable(&opaSessionObj.Report.SummaryDetails) } @@ -49,13 +54,14 @@ func (prettyPrinter *PrettyPrinter) SetWriter(outputFile string) { func (prettyPrinter *PrettyPrinter) Score(score float32) { } -func (prettyPrinter *PrettyPrinter) printResults(controls *reportsummary.ControlSummaries, allResources map[string]workloadinterface.IMetadata) { - for i := 0; i < len(prettyPrinter.sortedControlNames); i++ { - - controlSummary := controls.GetControl(reportsummary.EControlCriteriaName, prettyPrinter.sortedControlNames[i]) // summaryDetails.Controls ListControls().All() Controls.GetControl(ca) - prettyPrinter.printTitle(controlSummary) - prettyPrinter.printResources(controlSummary, allResources) - prettyPrinter.printSummary(prettyPrinter.sortedControlNames[i], controlSummary) +func (prettyPrinter *PrettyPrinter) printResults(controls *reportsummary.ControlSummaries, allResources map[string]workloadinterface.IMetadata, sortedControlNames [][]string) { + for i := len(sortedControlNames) - 1; i >= 0; i-- { + for _, c := range sortedControlNames[i] { + controlSummary := controls.GetControl(reportsummary.EControlCriteriaName, c) // summaryDetails.Controls ListControls().All() Controls.GetControl(ca) + prettyPrinter.printTitle(controlSummary) + prettyPrinter.printResources(controlSummary, allResources) + prettyPrinter.printSummary(c, controlSummary) + } } } @@ -167,28 +173,33 @@ func generateRelatedObjectsStr(workload WorkloadSummary) string { } func generateFooter(summaryDetails *reportsummary.SummaryDetails) []string { // Control name | # failed resources | all resources | % success - row := []string{} - row = append(row, "Resource Summary") //fmt.Sprintf(""%d", numControlers")) - row = append(row, fmt.Sprintf("%d", summaryDetails.NumberOfResources().Failed())) - row = append(row, fmt.Sprintf("%d", summaryDetails.NumberOfResources().Excluded())) - row = append(row, fmt.Sprintf("%d", summaryDetails.NumberOfResources().All())) - row = append(row, " ") - row = append(row, fmt.Sprintf("%.2f%s", summaryDetails.Score, "%")) - row = append(row, " ") + row := make([]string, _rowLen) + row[columnName] = "Resource Summary" + row[columnCounterFailed] = fmt.Sprintf("%d", summaryDetails.NumberOfResources().Failed()) + row[columnCounterExclude] = fmt.Sprintf("%d", summaryDetails.NumberOfResources().Excluded()) + row[columnCounterAll] = fmt.Sprintf("%d", summaryDetails.NumberOfResources().All()) + row[columnSeverity] = " " + row[columnRiskScore] = fmt.Sprintf("%.2f%s", summaryDetails.Score, "%") + row[columnInfo] = " " return row } -func (prettyPrinter *PrettyPrinter) printSummaryTable(summaryDetails *reportsummary.SummaryDetails) { +func (prettyPrinter *PrettyPrinter) printSummaryTable(summaryDetails *reportsummary.SummaryDetails, sortedControlNames [][]string) { summaryTable := tablewriter.NewWriter(prettyPrinter.writer) summaryTable.SetAutoWrapText(false) summaryTable.SetHeader(getControlTableHeaders()) summaryTable.SetHeaderLine(true) - alignments := []int{tablewriter.ALIGN_LEFT, tablewriter.ALIGN_CENTER, tablewriter.ALIGN_CENTER, tablewriter.ALIGN_CENTER, tablewriter.ALIGN_CENTER, tablewriter.ALIGN_CENTER} - summaryTable.SetColumnAlignment(alignments) + summaryTable.SetColumnAlignment(getColumnsAlignments()) + infoToPrintInfo := mapInfoToPrintInfo(summaryDetails.Controls) - for i := 0; i < len(prettyPrinter.sortedControlNames); i++ { - summaryTable.Append(generateRow(summaryDetails.Controls.GetControl(reportsummary.EControlCriteriaName, prettyPrinter.sortedControlNames[i]), infoToPrintInfo)) + for i := len(sortedControlNames) - 1; i >= 0; i-- { + for _, c := range sortedControlNames[i] { + row := generateRow(summaryDetails.Controls.GetControl(reportsummary.EControlCriteriaName, c), infoToPrintInfo, prettyPrinter.verboseMode) + if len(row) > 0 { + summaryTable.Append(row) + } + } } summaryTable.SetFooter(generateFooter(summaryDetails)) @@ -227,14 +238,6 @@ func frameworksScoresToString(frameworks []reportsummary.IFrameworkSummary) stri return "" } -// func getSortedControlsNames(controls []reportsummary.IPolicies) []string { -// controlNames := make([]string, 0, len(controls)) -// for k := range controls { -// controlNames = append(controlNames, controls[k].Get()) -// } -// sort.Strings(controlNames) -// return controlNames -// } func getControlLink(controlID string) string { return fmt.Sprintf("https://hub.armo.cloud/docs/%s", strings.ToLower(controlID)) } diff --git a/httphandler/go.mod b/httphandler/go.mod index 959b3dc5..ff589c14 100644 --- a/httphandler/go.mod +++ b/httphandler/go.mod @@ -6,7 +6,7 @@ replace github.com/armosec/kubescape/core => ../core require ( github.com/armosec/kubescape/core v0.0.0-00010101000000-000000000000 - github.com/armosec/opa-utils v0.0.127 + github.com/armosec/opa-utils v0.0.129 github.com/armosec/utils-go v0.0.3 github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 diff --git a/httphandler/go.sum b/httphandler/go.sum index e0f03bb9..bf2fb157 100644 --- a/httphandler/go.sum +++ b/httphandler/go.sum @@ -109,8 +109,8 @@ github.com/armosec/k8s-interface v0.0.66/go.mod h1:vwprS8qn/iowd5yf0JHpqDsLA5I8W github.com/armosec/k8s-interface v0.0.68 h1:6CtSakISiI47YHkxh+Va9FzZQIBkWa6g9sbiNxq1Zkk= github.com/armosec/k8s-interface v0.0.68/go.mod h1:PeWn41C2uenZi+xfZdyFF/zG5wXACA00htQyknDUWDE= github.com/armosec/opa-utils v0.0.64/go.mod h1:6tQP8UDq2EvEfSqh8vrUdr/9QVSCG4sJfju1SXQOn4c= -github.com/armosec/opa-utils v0.0.127 h1:uVyH/+pjpiA0oBO6QODjtdCiPgHx7KQ/TcxxkPvAl4c= -github.com/armosec/opa-utils v0.0.127/go.mod h1:gap+EaLG5rnyqvIRGxtdNDC9y7VvoGNm90zK8Ls7avQ= +github.com/armosec/opa-utils v0.0.129 h1:5ezMd558f9MtLlwLWHBeyrBGThaFYSeGhY9f1KQPemw= +github.com/armosec/opa-utils v0.0.129/go.mod h1:gap+EaLG5rnyqvIRGxtdNDC9y7VvoGNm90zK8Ls7avQ= github.com/armosec/rbac-utils v0.0.1/go.mod h1:pQ8CBiij8kSKV7aeZm9FMvtZN28VgA7LZcYyTWimq40= github.com/armosec/rbac-utils v0.0.14 h1:CKYKcgqJEXWF2Hen/B1pVGtS3nDAG1wp9dDv6oNtq90= github.com/armosec/rbac-utils v0.0.14/go.mod h1:Ex/IdGWhGv9HZq6Hs8N/ApzCKSIvpNe/ETqDfnuyah0=