diff --git a/.github/workflows/check-actions.yaml b/.github/workflows/check-actions.yaml index 68ea48807..b2dbb3243 100644 --- a/.github/workflows/check-actions.yaml +++ b/.github/workflows/check-actions.yaml @@ -17,7 +17,7 @@ jobs: - name: Checkout uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - name: Ensure SHA pinned actions - uses: zgosalvez/github-actions-ensure-sha-pinned-actions@40e45e738b3cad2729f599d8afc6ed02184e1dbd # v3.0.5 + uses: zgosalvez/github-actions-ensure-sha-pinned-actions@2f2ebc6d914ab515939dc13f570f91baeb2c194c # v3.0.6 with: # slsa-github-generator requires using a semver tag for reusable workflows. # See: https://github.com/slsa-framework/slsa-github-generator#referencing-slsa-builders-and-generators diff --git a/.github/workflows/codeql.yaml b/.github/workflows/codeql.yaml index 14ea20ff3..fcc634d18 100644 --- a/.github/workflows/codeql.yaml +++ b/.github/workflows/codeql.yaml @@ -28,7 +28,7 @@ jobs: with: fetch-depth: 0 - name: Run Trivy vulnerability scanner in repo mode - uses: aquasecurity/trivy-action@fd25fed6972e341ff0007ddb61f77e88103953c2 # v0.21.0 + uses: aquasecurity/trivy-action@595be6a0f6560a0a8fc419ddf630567fc623531d # v0.22.0 with: scan-type: fs ignore-unfixed: false @@ -39,7 +39,7 @@ jobs: exit-code: '0' vuln-type: os,library - name: Upload Trivy scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@f079b8493333aace61c81488f8bd40919487bd9f # v3.25.7 + uses: github/codeql-action/upload-sarif@2e230e8fe0ad3a14a340ad0815ddb96d599d2aff # v3.25.8 with: sarif_file: trivy-results.sarif category: code diff --git a/.github/workflows/ct-lint.yaml b/.github/workflows/ct-lint.yaml index 99c52a683..eab7ba81d 100644 --- a/.github/workflows/ct-lint.yaml +++ b/.github/workflows/ct-lint.yaml @@ -22,9 +22,9 @@ jobs: with: fetch-depth: 0 - name: Set up Helm - uses: azure/setup-helm@5119fcb9089d432beecbf79bb2c7915207344b78 # v3.5 + uses: azure/setup-helm@fe7b79cd5ee1e45176fcad797de68ecaf3ca4814 # v4.2.0 - name: Setup python - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: 3.7 - name: Set up chart-testing diff --git a/.github/workflows/helm-release.yaml b/.github/workflows/helm-release.yaml index 7ae47b2bf..8209b159e 100644 --- a/.github/workflows/helm-release.yaml +++ b/.github/workflows/helm-release.yaml @@ -19,7 +19,7 @@ jobs: - name: Checkout uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - name: Install Helm - uses: azure/setup-helm@5119fcb9089d432beecbf79bb2c7915207344b78 # v3.5 + uses: azure/setup-helm@fe7b79cd5ee1e45176fcad797de68ecaf3ca4814 # v4.2.0 - name: Set version run: | set -e diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 8ccbb0ea0..0c3baa69f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -53,7 +53,7 @@ jobs: uses: ko-build/setup-ko@ace48d793556083a76f1e3e6068850c1f4a369aa # v0.6 - name: Run GoReleaser id: goreleaser - uses: goreleaser/goreleaser-action@7ec5c2b0c6cdda6e8bbb49444bc797dd33d74dd8 # v5.0.0 + uses: goreleaser/goreleaser-action@286f3b13b1b49da4ac219696163fb8c1c93e1200 # v6.0.0 with: distribution: goreleaser version: latest diff --git a/go.mod b/go.mod index 522a8c635..47cfa2128 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.9.0 github.com/zach-klippenstein/goregen v0.0.0-20160303162051-795b5e3961ea - golang.org/x/crypto v0.23.0 + golang.org/x/crypto v0.24.0 gopkg.in/inf.v0 v0.9.1 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 @@ -118,10 +118,10 @@ require ( golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect golang.org/x/net v0.25.0 // indirect golang.org/x/oauth2 v0.17.0 // indirect - golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe // indirect diff --git a/go.sum b/go.sum index 5c73d8f40..a83736bf7 100644 --- a/go.sum +++ b/go.sum @@ -328,8 +328,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= @@ -362,8 +362,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -377,18 +377,18 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -402,8 +402,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= -golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/kyverno-json.rb b/kyverno-json.rb index e6ce69122..6b4a56871 100644 --- a/kyverno-json.rb +++ b/kyverno-json.rb @@ -5,20 +5,20 @@ class KyvernoJson < Formula desc "Kyverno for any JSON-compatible payload." homepage "https://kyverno.github.io/kyverno-json" - version "0.0.2" + version "0.0.3" on_macos do - if Hardware::CPU.arm? - url "https://github.com/kyverno/kyverno-json/releases/download/v0.0.2/kyverno-json_darwin_arm64.tar.gz" - sha256 "732203f163892f672a095828ec1d8c81875b1848fbae74d39e350cae95b92bc6" + on_intel do + url "https://github.com/kyverno/kyverno-json/releases/download/v0.0.3/kyverno-json_darwin_amd64.tar.gz" + sha256 "7f08f3d9f3d1d7d600c851441f42e1026c71c68c1af421817df8993a6af95409" def install bin.install "kyverno-json" end end - if Hardware::CPU.intel? - url "https://github.com/kyverno/kyverno-json/releases/download/v0.0.2/kyverno-json_darwin_amd64.tar.gz" - sha256 "911e7d51f45028c5349c2669d10a503fad1d5f1d1f87edccc9cccbfc2e531835" + on_arm do + url "https://github.com/kyverno/kyverno-json/releases/download/v0.0.3/kyverno-json_darwin_arm64.tar.gz" + sha256 "308bfb39133c6f5c94173f9ebe6d2375fc14110b6c7d19fd89d3fe35a910655e" def install bin.install "kyverno-json" @@ -27,20 +27,24 @@ def install end on_linux do - if Hardware::CPU.intel? - url "https://github.com/kyverno/kyverno-json/releases/download/v0.0.2/kyverno-json_linux_amd64.tar.gz" - sha256 "9cb5d41b19024f9a081c74a18d3149d831593bdcb0472f91ef95e1779291a4a2" + on_intel do + if Hardware::CPU.is_64_bit? + url "https://github.com/kyverno/kyverno-json/releases/download/v0.0.3/kyverno-json_linux_amd64.tar.gz" + sha256 "5c82ba8cb4e91748cee0910d9b3ce0eba7df722a025f85a7b024064cda16fde7" - def install - bin.install "kyverno-json" + def install + bin.install "kyverno-json" + end end end - if Hardware::CPU.arm? && Hardware::CPU.is_64_bit? - url "https://github.com/kyverno/kyverno-json/releases/download/v0.0.2/kyverno-json_linux_arm64.tar.gz" - sha256 "b18f3609385f4b8ffdaf465ed13eff830618bfe763dca2610a11f9904b00499b" + on_arm do + if Hardware::CPU.is_64_bit? + url "https://github.com/kyverno/kyverno-json/releases/download/v0.0.3/kyverno-json_linux_arm64.tar.gz" + sha256 "e85723d9a37bbe328307f39f1db9253732ee1c56c5babca6a43e7f1b0b99dc1b" - def install - bin.install "kyverno-json" + def install + bin.install "kyverno-json" + end end end end diff --git a/pkg/commands/scan/command.go b/pkg/commands/scan/command.go index 10ae111aa..4884c0181 100644 --- a/pkg/commands/scan/command.go +++ b/pkg/commands/scan/command.go @@ -14,6 +14,7 @@ func Command() *cobra.Command { SilenceUsage: true, RunE: command.run, } + cmd.Flags().StringVar(&command.bindings, "bindings", "", "Bindings file (json or yaml file). Top level keys will be interpreted as bindings names.") cmd.Flags().StringVar(&command.payload, "payload", "", "Path to payload (json or yaml file)") cmd.Flags().StringSliceVar(&command.preprocessors, "pre-process", nil, "JMESPath expression used to pre process payload") cmd.Flags().StringSliceVar(&command.policies, "policy", nil, "Path to kyverno-json policies") diff --git a/pkg/commands/scan/command_test.go b/pkg/commands/scan/command_test.go index 6afa9e18c..162e1d2c9 100644 --- a/pkg/commands/scan/command_test.go +++ b/pkg/commands/scan/command_test.go @@ -12,6 +12,7 @@ import ( func Test_Execute(t *testing.T) { tests := []struct { name string + bindings string payload string preprocessors []string policies []string @@ -29,6 +30,13 @@ func Test_Execute(t *testing.T) { policies: []string{"../../../test/commands/scan/wildcard/policy.yaml"}, out: "../../../test/commands/scan/wildcard/out.txt", wantErr: false, + }, { + name: "bindings", + bindings: "../../../test/commands/scan/bindings/bindings.yaml", + payload: "../../../test/commands/scan/bindings/payload.yaml", + policies: []string{"../../../test/commands/scan/bindings/policy.yaml"}, + out: "../../../test/commands/scan/bindings/out.txt", + wantErr: false, }, { name: "pod-no-latest", payload: "../../../test/commands/scan/pod-no-latest/payload.yaml", @@ -135,6 +143,9 @@ func Test_Execute(t *testing.T) { args = append(args, "--policy", policy) } args = append(args, "--payload", tt.payload) + if tt.bindings != "" { + args = append(args, "--bindings", tt.bindings) + } cmd.SetArgs(args) out := bytes.NewBufferString("") cmd.SetOut(out) diff --git a/pkg/commands/scan/options.go b/pkg/commands/scan/options.go index 95f9b0157..ecd134e15 100644 --- a/pkg/commands/scan/options.go +++ b/pkg/commands/scan/options.go @@ -17,6 +17,7 @@ import ( ) type options struct { + bindings string payload string preprocessors []string policies []string @@ -48,6 +49,24 @@ func (c *options) run(cmd *cobra.Command, _ []string) error { } policies = filteredPolicies } + var bindings map[string]any + if c.bindings != "" { + out.println("Loading bindings ...") + payload, err := payload.Load(c.bindings) + if err != nil { + return err + } + if payload != nil { + if m, ok := payload.(map[string]any); ok { + bindings = m + for key, value := range bindings { + out.println("-", key, "->", value) + } + } else { + return errors.New("bindings are not a map[string]any object") + } + } + } out.println("Loading payload ...") payload, err := payload.Load(c.payload) if err != nil { @@ -80,6 +99,7 @@ func (c *options) run(cmd *cobra.Command, _ []string) error { responses = append(responses, e.Run(context.Background(), jsonengine.Request{ Resource: resource, Policies: policies, + Bindings: bindings, })) } for _, response := range responses { diff --git a/test/commands/scan/bindings/bindings.yaml b/test/commands/scan/bindings/bindings.yaml new file mode 100644 index 000000000..20e9ff3fe --- /dev/null +++ b/test/commands/scan/bindings/bindings.yaml @@ -0,0 +1 @@ +foo: bar diff --git a/test/commands/scan/bindings/out.txt b/test/commands/scan/bindings/out.txt new file mode 100644 index 000000000..2fab40f85 --- /dev/null +++ b/test/commands/scan/bindings/out.txt @@ -0,0 +1,8 @@ +Loading policies ... +Loading bindings ... +- foo -> bar +Loading payload ... +Pre processing ... +Running ( evaluating 1 resource against 1 policy ) ... +- test / foo-bar-4 / PASSED +Done diff --git a/test/commands/scan/bindings/payload.yaml b/test/commands/scan/bindings/payload.yaml new file mode 100644 index 000000000..a48ec4748 --- /dev/null +++ b/test/commands/scan/bindings/payload.yaml @@ -0,0 +1,2 @@ +foo: + bar: 4 diff --git a/test/commands/scan/bindings/policy.yaml b/test/commands/scan/bindings/policy.yaml new file mode 100644 index 000000000..ae62aa223 --- /dev/null +++ b/test/commands/scan/bindings/policy.yaml @@ -0,0 +1,15 @@ +apiVersion: json.kyverno.io/v1alpha1 +kind: ValidatingPolicy +metadata: + name: test +spec: + rules: + - name: foo-bar-4 + match: + all: + - ($foo): bar + assert: + all: + - check: + foo: + bar: 4 diff --git a/website/docs/cli/commands/kyverno-json_scan.md b/website/docs/cli/commands/kyverno-json_scan.md index 1aef9f723..3777fa1cc 100644 --- a/website/docs/cli/commands/kyverno-json_scan.md +++ b/website/docs/cli/commands/kyverno-json_scan.md @@ -13,6 +13,7 @@ kyverno-json scan [flags] ### Options ``` + --bindings string Bindings file (json or yaml file). Top level keys will be interpreted as bindings names. -h, --help help for scan --labels strings Labels selectors for policies --output string Output format (text or json) (default "text")