Implementing container image name normalization built-in function for Rego (#1334)

* Implementing container image name normalization built-in function for Rego

Signed-off-by: Ben <ben@armosec.io>

* updating go.mod t include docker/distribution

Signed-off-by: Ben <ben@armosec.io>

* fix test

Signed-off-by: Ben <ben@armosec.io>

---------

Signed-off-by: Ben <ben@armosec.io>
This commit is contained in:
Ben Hirschberg
2023-08-08 09:35:32 +03:00
committed by GitHub
parent 4c9fec8ef4
commit 266029eb23
5 changed files with 57 additions and 1 deletions
@@ -0,0 +1,13 @@
package opaprocessor
import (
"github.com/docker/distribution/reference"
)
func normalize_image_name(img string) (string, error) {
name, err := reference.ParseNormalizedNamed(img)
if err != nil {
return "", err
}
return name.String(), nil
}
@@ -0,0 +1,28 @@
package opaprocessor
import (
"testing"
"github.com/stretchr/testify/assert"
)
func Test_normalize_name(t *testing.T) {
tests := []struct {
name string
img string
want string
}{
{
name: "Normalize image name",
img: "nginx",
want: "docker.io/library/nginx",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
name, _ := normalize_image_name(tt.img)
assert.Equal(t, tt.want, name, tt.name)
})
}
}
@@ -370,6 +370,7 @@ func (opap *OPAProcessor) runRegoOnK8s(ctx context.Context, rule *reporthandling
// register signature verification methods for the OPA ast engine (since these are package level symbols, we do it only once)
rego.RegisterBuiltin2(cosignVerifySignatureDeclaration, cosignVerifySignatureDefinition)
rego.RegisterBuiltin1(cosignHasSignatureDeclaration, cosignHasSignatureDefinition)
rego.RegisterBuiltin1(imageNameNormalizeDeclaration, imageNameNormalizeDefinition)
})
modules[rule.Name] = getRuleData(rule)
+14
View File
@@ -95,3 +95,17 @@ var cosignHasSignatureDefinition = func(bctx rego.BuiltinContext, a *ast.Term) (
}
return ast.BooleanTerm(has_signature(string(aStr))), nil
}
var imageNameNormalizeDeclaration = &rego.Function{
Name: "image.parse_normalized_name",
Decl: types.NewFunction(types.Args(types.S), types.S),
Memoize: true,
}
var imageNameNormalizeDefinition = func(bctx rego.BuiltinContext, a *ast.Term) (*ast.Term, error) {
aStr, err := builtins.StringOperand(a.Value, 1)
if err != nil {
return nil, fmt.Errorf("invalid parameter type: %v", err)
}
normalizedName, err := normalize_image_name(string(aStr))
return ast.StringTerm(normalizedName), err
}
+1 -1
View File
@@ -12,6 +12,7 @@ require (
github.com/armosec/utils-go v0.0.20
github.com/armosec/utils-k8s-go v0.0.16
github.com/briandowns/spinner v1.18.1
github.com/docker/distribution v2.8.2+incompatible
github.com/enescakir/emoji v1.0.0
github.com/fatih/color v1.15.0
github.com/francoispqt/gojay v1.2.13
@@ -170,7 +171,6 @@ require (
github.com/deitch/magic v0.0.0-20230404182410-1ff89d7342da // indirect
github.com/dimchansky/utfbom v1.1.1 // indirect
github.com/docker/cli v23.0.5+incompatible // indirect
github.com/docker/distribution v2.8.2+incompatible // indirect
github.com/docker/docker v24.0.5+incompatible // indirect
github.com/docker/docker-credential-helpers v0.7.0 // indirect
github.com/docker/go-connections v0.4.0 // indirect