|
Dieses Dokument wurde mithilfe automatisierter maschineller Übersetzungstechnologie übersetzt. Wir bemühen uns um korrekte Übersetzungen, übernehmen jedoch keine Gewähr für die Vollständigkeit, Richtigkeit oder Zuverlässigkeit der übersetzten Inhalte. Im Falle von Abweichungen ist die englische Originalversion maßgebend und stellt den verbindlichen Text dar. |
|
Dies ist eine unveröffentlichte Dokumentation für Admission Controller 1.34-dev. |
Sichere Lieferkette
Eine Infrastruktur für eine sichere Lieferkette kann die Gültigkeit ihrer Bestandteile beziehungsweise Glieder überprüfen. Es ermöglicht Benutzern und Entwicklern, die Besitzkette ihrer Softwarekomponenten oder Artefakte nachzuweisen. Es ist ein aktiver Ansatz zur Minderung von Sicherheitsproblemen.
Das Sigstore-Projekt bietet Werkzeuge und Infrastruktur dafür. Es dient der Validierung der Integrität der Lieferkette von Artefakten.
Admission Controller verwendet cosign zusammen mit der fulcio und rekor Infrastruktur, die vom Sigstore-Projekt angeboten wird.
Clusterbetreiber können SUSE Security Admission Controller so konfigurieren, dass nur Richtlinien ausgeführt werden, die von vertrauenswürdigen Stellen signiert sind. Richtlinienentwickler können ihre Richtlinien signieren und in einem Register veröffentlichen.
Voraussetzungen
In den folgenden Abschnitten müssen Sie einige Werkzeuge installieren. Diese sind erforderlich, damit Benutzer OCI-Artefaktsignaturen signieren und überprüfen können. Die Beispiele zeigen die Verwendung von cosign und kwctl Dienstprogrammen zum Signieren und Überprüfen von Richtlinien.
Um GitHub zum Signieren von Richtlinien zu verwenden, müssen Sie GitHub Actions installieren.
Richtlinien signieren
Admission Controller empfiehlt die Verwendung des cosign Dienstprogramms von Sigstore zum Signieren von Richtlinien. Dieser Abschnitt zeigt eine schlüsselbasierte Methode zum Signieren von Richtlinien. Sie müssen ein Paar aus privatem und öffentlichem Schlüssel generieren. Die generierten Schlüssel helfen zu überprüfen, ob die signierten Artefakte vom erwarteten Benutzer stammen. Um dieses Schlüsselpaar zu generieren, verwenden Sie diesen cosign generate-key-pair Befehl:
cosign generate-key-pair
Was zu einer Eingabeaufforderung führt, um ein Passwort einzugeben und zu bestätigen:
Enter password for private key: ●●●●●●●●
Enter password for private key again: ●●●●●●●●
Private key written to cosign.key
Public key written to cosign.pub
Jetzt können Sie diesen Schlüssel verwenden, um Richtlinien zu signieren.
Teilen Sie die private Schlüsseldatei nicht, cosign.key. Dies ist eine geheime Datei, die nur vom Schlüsselinhaber zum Signieren von Richtlinien verwendet werden darf.
Um eine Richtlinie zu signieren, können Sie cosign sign verwenden und das --key Befehlszeilenargument mit Ihrer privaten Schlüsseldatei mitgeben:
cosign sign --key cosign.key ghcr.io/kubewarden/policies/user-group-psp:latest
Was zu einer Eingabeaufforderung für das Passwort für den angegebenen privaten Schlüssel führt:
an error occurred: no provider found for that key reference, will try to load key from disk...
Enter password for private key: ●●●●●●●●
Pushing signature to: ghcr.io/kubewarden/policies/user-group-psp
Dieser Befehl signiert die Richtlinie, indem er ein neues Signaturobjekt erstellt. Das Signaturobjekt wird dann zusammen mit der Richtlinie in das Registry hochgeladen. Jetzt ist die Richtlinie bereit zur Verwendung in einer Admission Controller-Installation mit Signaturüberprüfung.
Die gleiche Richtlinie kann mehrfach von demselben Benutzer oder von verschiedenen Benutzern signiert werden. Diese Signaturen werden zusammen mit der ursprünglichen Signatur dem Signaturobjekt hinzugefügt.
Für weitere Informationen darüber, wie der Signierungsprozess funktioniert, schauen Sie sich die Dokumentation des Sigstore-Projekts an.
Schlüsselloses Signieren
Oft werden Richtlinien automatisch mit CI/CD-Pipelines erstellt. Dies kompliziert den Prozess der Schlüsselgenerierung. Dieser schlüssellose Workflow von Sigstore ist für diese Situationen. Anstelle von langfristig gültigen Signierschlüsseln verwendet der schlüssellose Workflow Zertifizierungsstellen (CAs) und Zertifikatketten.
Sie verknüpfen den generierten, kurzfristigen Zertifikatschlüssel in eine Vertrauenskette. Dies geschieht durch eine Identitätsherausforderung, um die Identität des Unterzeichners zu bestätigen. Die Lebensdauer des Zertifikatschlüssels ist lang genug, damit die Unterzeichnung erfolgen kann. Die Identitätsherausforderung erfolgt durch Authentifizierung bei einem OpenID Connect (OIDC) Anbieter. Die öffentliche Infrastruktur von Sigstore, Fulcio, stellt die Vertrauenskette bereit.
Die Unterzeichnung erfolgt mit dem Dienstprogramm cosign von Sigstore.
$ cosign sign ghcr.io/kubewarden/policies/user-group-psp:latest
cosign-Ausgabe
Generating ephemeral keys...
Retrieving signed certificate...
Your browser will now be opened to:
https://oauth2.sigstore.dev/auth/auth?access_type=online&client_id=sigstore&code_challenge=<REDACTED>&code_challenge_method=S256&nonce=<REDACTED>&redirect_uri=http%3A%2F%2Flocalhost%3A34021%2Fauth%2Fcallback&response_type=code&scope=openid+email&state=<REDACTED>
client.go:196: root pinning is not supported in Spec 1.0.19
Successfully verified SCT...
tlog entry created with index: 1819248
Pushing signature to: ghcr.io/kubewarden/policies/user-group-psp
Dies unterzeichnet die Richtlinie und schiebt sie in das Repository. Es werden keine Schlüssel als Nebenprodukt generiert.
Wie man Artefakte in GitHub-Workflows signiert
Bei der Verwendung der schlüssellosen Unterzeichnung benötigt cosign in einer GitHub-Aktion nicht, dass der Benutzer sich bei einem OIDC-Anbieter anmeldet. Ein GitHub-Token ist während der Ausführung des GitHub-Workflows verfügbar. Es wird verwendet, um den Benutzer zu authentifizieren und die temporären Schlüssel zu generieren. Der Unterzeichnungsprozess ist derselbe, der im schlüssellosen Modus verwendet wird. Dies ist ein Beispiel dafür, wie das Admission Controller Projekt seine Richtlinien signiert:
YAML, das die Signierung der Admission Controller-Richtlinie beschreibt.
# ... beginning of the workflow file ...
jobs:
build:
name: Build container image
runs-on: ubuntu-latest
steps:
# ... other steps building the container image ...
-
name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ inputs.GITHUB_TOKEN }}
-
name: Publish Wasm policy artifact to OCI registry with the 'latest' tag
shell: bash
if: ${{ startsWith(github.ref, 'refs/heads/') }}
env:
COSIGN_EXPERIMENTAL: 1
run: |
set -ex
echo Pushing policy to OCI container registry
IMMUTABLE_REF=$(kwctl push -o json ${{ PATH_TO_BUILT_WASM_FILE }} ghcr.io/myorg/policies/my-great-policy:latest | jq -r .immutable_ref)
echo Keyless signing of policy using cosign
cosign sign ${IMMUTABLE_REF}
# ... other build steps ...
# ... remainder of the workflow file ...
|
Richtlinienentwickler können die Admission Controller Richtlinienvorlagen verwenden. Sie haben GitHub-Aktionen, um Richtlinien zu erstellen, zu testen, zu signieren und zu veröffentlichen. |
Auflistung der Richtlinienunterschriften
Sie können die Signatur in einer veröffentlichten Richtlinie mit kwctl inspect überprüfen. Dies zeigt die Informationen über die Richtlinie und ihre Signaturen wie unten dargestellt:
kwctl inspect registry://ghcr.io/kubewarden/policies/us….
$ kwctl inspect registry://ghcr.io/kubewarden/policies/user-group-psp:v0.2.0
Details
title: psp-user-group
description: Short description
author: José Guilherme Vanz <jguilhermevanz@suse.com>
url: https://github.com/kubewarden/user-group-psp-policy
source: https://github.com/kubewarden/user-group-psp-policy
license: Apache-2.0
mutating: true
context aware: false
execution mode: kubewarden-wapc
protocol version: 1
Annotations
io.kubewarden.kwctl 0.2.5-rc2
Rules
────────────────────
---
- apiGroups:
- ""
apiVersions:
- v1
resources:
- pods
operations:
- CREATE
────────────────────
Usage
This policy enforce the user and group used in the container.
Sigstore signatures
Digest: sha256:026af67682a85d424e7d95db460171635f5c3957d67b53499bece912cc0413cc
Media type: application/vnd.dev.cosign.simplesigning.v1+json
Size: 258
Annotations
dev.sigstore.cosign/certificate -----BEGIN CERTIFICATE-----
MIIDRzCCAsygAwIBAgITbPUZlUFkkAHtbzc3rzC/3zXj1DAKBggqhkjOPQQDAzAq
MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxETAPBgNVBAMTCHNpZ3N0b3JlMB4XDTIy
MDIyNTE2MzAwMloXDTIyMDIyNTE2NDAwMVowEzERMA8GA1UEChMIc2lnc3RvcmUw
WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR/O5c6ZI5BzBweoEIam4uWu5fqzHx0
3PTCgfXyyvIjorz9wX08bsndkHdWfFObU+PztbxX78An43Yw9/fHtO93o4IB5jCC
AeIwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMAwGA1UdEwEB
/wQCMAAwHQYDVR0OBBYEFCP/v7NEJQglbDmyC5VMgnvhiuBUMB8GA1UdIwQYMBaA
FFjAHl+RRaVmqXrMkKGTItAqxcX6MHgGA1UdEQRxMG+GbWh0dHBzOi8vZ2l0aHVi
LmNvbS9rdWJld2FyZGVuL2dpdGh1Yi1hY3Rpb25zLy5naXRodWIvd29ya2Zsb3dz
L3JldXNhYmxlLXJlbGVhc2UtcG9saWN5LXJ1c3QueW1sQHJlZnMvaGVhZHMvdjEw
NgYKKwYBBAGDvzABAwQoMmJiMGQ4NjZjMzFmOGMyZTQ3NDMxMDI4M2ExNmFkMWFi
NjBlZjA1YjAuBgorBgEEAYO/MAEFBCBrdWJld2FyZGVuL3VzZXItZ3JvdXAtcHNw
LXBvbGljeTAcBgorBgEEAYO/MAEEBA5SZWxlYXNlIHBvbGljeTASBgorBgEEAYO/
MAECBARwdXNoMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5n
aXRodWJ1c2VyY29udGVudC5jb20wHgYKKwYBBAGDvzABBgQQcmVmcy90YWdzL3Yw
LjIuMDAKBggqhkjOPQQDAwNpADBmAjEAyGQbNCkOifStO7yCCfF8yXyc144ANn2x
Ty92WYC0pTaVhviOED47fgD6TncKf+92AjEAjBfjLmCG/Mwrh8t+gfHJEAWWEc9Q
+j9NR4wF66uABS/TTh5CYlrnIuqSD+GBHGwV
-----END CERTIFICATE-----
dev.sigstore.cosign/timestamp {"signatures":[{"keyid":"b6710623a30c010738e64c5209d367df1c0a18cf90e6ab5292fb01680f83453d","sig":"3046022100f666a7f4b3d85d8003f2c166e27827dfa0c4ab9282e9dab19485f4e702c61700022100dfe826e0edab5f80a40f08cc87b87777a4db30775d85684fe4950e797f2f565c"}],"signed":{"_type":"timestamp","spec_version":"1.0","version":15,"expires":"2022-03-08T19:14:05Z","meta":{"snapshot.json":{"length":1655,"hashes":{"sha256":"36cf063d0717f6dc03e23027721adcd69b684d293956d3a1a7db7b0848f711d7","sha512":"f90946d0a2dc58dae4505cfb91517a40299adf9e8719f52af187e2025aad69fcdeaeded271ec25db24869841c16fbe24f3fc56f56af8fdbb8808dccec4636b64"},"version":15}}}}
dev.sigstore.cosign/bundle {"SignedEntryTimestamp":"MEUCIEfu4qR+HsexSDk5h2QXMduvoRCX10J+4CLQWtYw5VD6AiEAyYCEjvJdv2Sr5tZ4LApnddH/4v+CoV1QkuvbCQ3iIUM=","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIwMjZhZjY3NjgyYTg1ZDQyNGU3ZDk1ZGI0NjAxNzE2MzVmNWMzOTU3ZDY3YjUzNDk5YmVjZTkxMmNjMDQxM2NjIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUUNXNWZRZ1BUUTdaTlNuRkhzbHJOTlFrS2dTSVFpOGNSMTU5UEExc0s4VGlRSWhBSndMOWJPcUJKbVduN1lLZG9Tem80c2xPZ2s4SkJCanFYZHNydDNyeVF0QiIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVUlNla05EUVhONVowRjNTVUpCWjBsVVlsQlZXbXhWUm10clFVaDBZbnBqTTNKNlF5OHplbGhxTVVSQlMwSm5aM0ZvYTJwUFVGRlJSRUY2UVhFS1RWSlZkMFYzV1VSV1VWRkxSWGQ0ZW1GWFpIcGtSemw1V2xNMWExcFlXWGhGVkVGUVFtZE9Wa0pCVFZSRFNFNXdXak5PTUdJelNteE5RalJZUkZSSmVRcE5SRWw1VGxSRk1rMTZRWGROYkc5WVJGUkplVTFFU1hsT1ZFVXlUa1JCZDAxV2IzZEZla1ZTVFVFNFIwRXhWVVZEYUUxSll6SnNibU16VW5aamJWVjNDbGRVUVZSQ1oyTnhhR3RxVDFCUlNVSkNaMmR4YUd0cVQxQlJUVUpDZDA1RFFVRlNMMDgxWXpaYVNUVkNla0ozWlc5RlNXRnROSFZYZFRWbWNYcEllREFLTTFCVVEyZG1XSGw1ZGtscWIzSjZPWGRZTURoaWMyNWthMGhrVjJaR1QySlZLMUI2ZEdKNFdEYzRRVzQwTTFsM09TOW1TSFJQT1ROdk5FbENOV3BEUXdwQlpVbDNSR2RaUkZaU01GQkJVVWd2UWtGUlJFRm5aVUZOUWsxSFFURlZaRXBSVVUxTlFXOUhRME56UjBGUlZVWkNkMDFFVFVGM1IwRXhWV1JGZDBWQ0NpOTNVVU5OUVVGM1NGRlpSRlpTTUU5Q1FsbEZSa05RTDNZM1RrVktVV2RzWWtSdGVVTTFWazFuYm5ab2FYVkNWVTFDT0VkQk1WVmtTWGRSV1UxQ1lVRUtSa1pxUVVoc0sxSlNZVlp0Y1ZoeVRXdExSMVJKZEVGeGVHTllOazFJWjBkQk1WVmtSVkZTZUUxSEswZGlWMmd3WkVoQ2VrOXBPSFphTW13d1lVaFdhUXBNYlU1MllsTTVjbVJYU214a01rWjVXa2RXZFV3eVpIQmtSMmd4V1dreGFGa3pVbkJpTWpWNlRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2Q2t3elNteGtXRTVvV1cxNGJFeFlTbXhpUjFab1l6SlZkR05IT1hOaFYwNDFURmhLTVdNelVYVmxWekZ6VVVoS2JGcHVUWFpoUjFab1draE5kbVJxUlhjS1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU5iVXBwVFVkUk5FNXFXbXBOZWtadFQwZE5lVnBVVVROT1JFMTRUVVJKTkUweVJYaE9iVVpyVFZkR2FRcE9ha0pzV21wQk1WbHFRWFZDWjI5eVFtZEZSVUZaVHk5TlFVVkdRa05DY21SWFNteGtNa1o1V2tkV2RVd3pWbnBhV0VsMFdqTktkbVJZUVhSalNFNTNDa3hZUW5aaVIyeHFaVlJCWTBKbmIzSkNaMFZGUVZsUEwwMUJSVVZDUVRWVFdsZDRiRmxZVG14SlNFSjJZa2RzYW1WVVFWTkNaMjl5UW1kRlJVRlpUeThLVFVGRlEwSkJVbmRrV0U1dlRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpCaFZ6bDFZM2sxYmdwaFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NHZFpTMHQzV1VKQ1FVZEVkbnBCUWtKblVWRmpiVlp0WTNrNU1GbFhaSHBNTTFsM0NreHFTWFZOUkVGTFFtZG5jV2hyYWs5UVVWRkVRWGRPY0VGRVFtMUJha1ZCZVVkUllrNURhMDlwWmxOMFR6ZDVRME5tUmpoNVdIbGpNVFEwUVU1dU1uZ0tWSGs1TWxkWlF6QndWR0ZXYUhacFQwVkVORGRtWjBRMlZHNWpTMllyT1RKQmFrVkJha0ptYWt4dFEwY3ZUWGR5YURoMEsyZG1TRXBGUVZkWFJXTTVVUW9yYWpsT1VqUjNSalkyZFVGQ1V5OVVWR2cxUTFsc2NtNUpkWEZUUkN0SFFraEhkMVlLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0=","integratedTime":1645806604,"logIndex":1506651,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}
dev.sigstore.cosign/chain -----BEGIN CERTIFICATE-----
MIIB9zCCAXygAwIBAgIUALZNAPFdxHPwjeDloDwyYChAO/4wCgYIKoZIzj0EAwMw
KjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MREwDwYDVQQDEwhzaWdzdG9yZTAeFw0y
MTEwMDcxMzU2NTlaFw0zMTEwMDUxMzU2NThaMCoxFTATBgNVBAoTDHNpZ3N0b3Jl
LmRldjERMA8GA1UEAxMIc2lnc3RvcmUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAT7
XeFT4rb3PQGwS4IajtLk3/OlnpgangaBclYpsYBr5i+4ynB07ceb3LP0OIOZdxex
X69c5iVuyJRQ+Hz05yi+UF3uBWAlHpiS5sh0+H2GHE7SXrk1EC5m1Tr19L9gg92j
YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRY
wB5fkUWlZql6zJChkyLQKsXF+jAfBgNVHSMEGDAWgBRYwB5fkUWlZql6zJChkyLQ
KsXF+jAKBggqhkjOPQQDAwNpADBmAjEAj1nHeXZp+13NWBNa+EDsDP8G1WWg1tCM
WP/WHPqpaVo0jhsweNFZgSs0eE7wYI4qAjEA2WB9ot98sIkoF3vZYdd3/VtWB5b9
TNMea7Ix/stJ5TfcLLeABLE4BNJOsQ4vnBHJ
-----END CERTIFICATE-----
dev.cosignproject.cosign/signature MEYCIQCW5fQgPTQ7ZNSnFHslrNNQkKgSIQi8cR159PA1sK8TiQIhAJwL9bOqBJmWn7YKdoSzo4slOgk8JBBjqXdsrt3ryQtB
Richtlinien überprüfen
Sie können überprüfen, ob eine Richtlinie korrekt signiert ist mit cosign oder kwctl. Sie haben ähnliche Befehlszeilenoptionen zum Überprüfen von Richtliniensignaturen. Um die Signatur-Binärdatei mit einem Schlüssel zu überprüfen, verwenden Sie kwctl wie folgt:
$ kwctl verify -k cosign.pub ghcr.io/kubewarden/policies/user-group-psp:latest
2022-03-29T14:49:31.878180Z INFO kwctl::verify: Policy successfully verified
Oder cosign :
$ cosign verify --key cosign.pub ghcr.io/kubewarden/policies/user-group-psp:latest
Verification for ghcr.io/kubewarden/policies/user-group-psp:latest --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- The signatures were verified against the specified public key
- Any certificates were verified against the Fulcio roots.
[{"critical":{"identity":{"docker-reference":"ghcr.io/kubewarden/policies/user-group-psp"},"image":{"docker-manifest-digest":"sha256:af520a8ccee03811d426c48634b7007f1220c121cc23e14962bb64510585ce97"},"type":"cosign container image signature"},"optional":null}]
Konfigurieren des Richtliniendienstes zur Überprüfung von Richtliniensignaturen
Sie können Admission Controller mit einem ConfigMap konfigurieren, um nur vertrauenswürdige Richtlinien auszuführen. Die ConfigMap Struktur wird in Signatur-Konfigurationsreferenz beschrieben. Es wird verwendet, um eine Richtlinie mit kwctl zu überprüfen. Die ConfigMap sollte zulässige Konfigurationen im verification-config-Feld definieren.
Zum Beispiel möchten Sie Richtlinien ausführen, die von der Admission Controller GitHub-Organisation signiert sind. Ein Beispiel für ConfigMap in diesem Szenario wäre:
$ cat kubewarden_signatures.yaml
$ cat kubewarden_signatures.yaml
apiVersion: v1
allOf:
- kind: githubAction
owner: kubewarden
# note that the data is stored under verification-config field
$ kubectl create configmap my-signatures-configuration --from-file=verification-config=kubewarden_signatures.yaml
$ kubectl get configmap -o yaml my-signatures-configuration
apiVersion: v1
data:
verification-config: |
apiVersion: v1
allOf:
- kind: githubAction
owner: kubewarden
kind: ConfigMap
metadata:
creationTimestamp: "2022-03-29T18:27:20Z"
name: my-signatures-configuration
namespace: default
resourceVersion: "10279"
uid: d53e1c56-1fee-45de-92f5-9bd73b8cead4
Sie können kwctl scaffold verification-config verwenden, um eine Standard-Konfigurationsdatei zur Überprüfung für die ConfigMap zu generieren:
$ kwctl scaffold verification-config > verification_config.yaml
$ cat verification_config.yaml
$ kwctl scaffold verification-config > verification_config.yaml
$ cat verification_config.yaml
# Default Admission Controller verification config
#
# With this config, the only valid policies are those signed by Admission Controller
# infrastructure.
#
# This config can be saved to its default location (for this OS) with:
# kwctl scaffold verification-config > /home/kubewarden/.config/kubewarden/verification-config.yml
#
# Providing a config in the default location enables Sigstore verification.
# See https://docs.kubewarden.io for more Sigstore verification options.
---
apiVersion: v1
allOf:
- kind: githubAction
owner: kubewarden
repo: ~
annotations: ~
anyOf: ~
Sie können dieses verification_config.yml verwenden, um die ConfigMap zu erstellen.
$ kubectl create configmap my-signatures-configuration --from-file==verification_config.yaml
configmap/my-signatures-configuration created
Dann können wir mit get configmap überprüfen.
kubectl get configmap
$ kubectl get configmap -o yaml my-signatures-configuration
apiVersion: v1
data:
verification-config: |+
# Default Admission Controller verification config
#
# With this config, the only valid policies are those signed by Admission Controller
# infrastructure.
#
# This config can be saved to its default location (for this OS) with:
# kwctl scaffold verification-config > /home/kubewarden/.config/kubewarden/verification-config.yml
#
# Providing a config in the default location enables Sigstore verification.
# See https://docs.kubewarden.io for more Sigstore verification options.
---
apiVersion: v1
allOf:
- kind: githubAction
owner: kubewarden
repo: ~
annotations: ~
anyOf: ~
kind: ConfigMap
metadata:
creationTimestamp: "2022-04-07T11:54:27Z"
name: my-signatures-configuration
namespace: default
resourceVersion: "1317"
uid: 74dec846-7fcd-4b4b-8184-700c816f685a
Nachdem Sie die ConfigMap zur Speicherung der Signaturanforderungen erstellt haben, können Sie einen Policy Server konfigurieren. Um die Signaturen der Richtlinien zu validieren, setzen Sie den ConfigMap-Namen im Feld verificationConfig (markiert ➀).
apiVersion: policies.kubewarden.io/v1alpha2
kind: PolicyServer
metadata:
name: default
finalizers:
- kubewarden
spec:
image: ghcr.io/kubewarden/policy-server:v0.2.7
serviceAccountName: policy-server
replicas: 1
//highlight-next-l
# name of the confimap with the signatures requirements
verificationConfig: your_configmap (1)
env:
- name: KUBEWARDEN_ENABLE_METRICS
value: "1"
- name: KUBEWARDEN_LOG_FMT
value: otlp
- name: "KUBEWARDEN_LOG_LEVEL"
value: "info"
| 1 | verificationConfig |
Wenn Sie den Standard-Policy Server mit dem kubewarden-defaults Helm-Chart bereitstellen, konfigurieren Sie dieses Feld, indem Sie den ConfigMap-Namen im policyServer.verificationConfig-Wert setzen.
Jetzt lehnt der PolicyServer nicht vertrauenswürdige AdmissionPolicies und ClusterAdmissionPolicies ab, indem er sich weigert zu starten. Sie müssen die nicht vertrauenswürdige Richtlinie entfernen oder die Anforderungen an die Signaturen für einen laufenden PolicyServer ändern.
Referenz zur Signaturkonfiguration
Sie können die in einer Datei enthaltenen Signaturanforderungen validieren. Hier ist ein Beispiel:
Eine Datei mit Signaturanforderungen
apiVersion: v1
allOf: (1)
- kind: githubAction
owner: kubewarden # mandatory
annotations:
env: prod
anyOf: # at least `+anyOf.minimumMatches+` are required to match (2)
minimumMatches: 2 # default is 1
signatures:
- kind: pubKey
owner: flavio # optional
key: .... # mandatory
annotations: # optional
env: prod
foo: bar
- kind: pubKey
owner: victor # optional
key: .... # mandatory
- kind: genericIssuer
issuer: https://github.com/login/oauth
subject:
equal: alice@example.com
- kind: genericIssuer
issuer: https://token.actions.githubusercontent.com
subject:
equal: https://github.com/flavio/policy-secure-pod-images/.github/workflows/release.yml@refs/heads/main
- kind: genericIssuer
issuer: https://token.actions.githubusercontent.com
subject:
urlPrefix: https://github.com/flavio/
- kind: genericIssuer
issuer: https://token.actions.githubusercontent.com
subject:
urlPrefix: https://github.com/kubewarden # <- it will be post-fixed with `+/+` for security reasons
- kind: githubAction
owner: flavio # mandatory
repo: policy1 # optional
- kind: pubKey
owner: alice # optional
key: .... # mandatory
| 1 | allOf |
| 2 | anyOf |
Signaturvalidierung
Die obige Konfiguration enthält die beiden hervorgehobenen Abschnitte, allOf und anyOf:
-
allOf: die Richtlinie ist nur vertrauenswürdig, wenn alle hier angegebenen Signaturanforderungen gültig sind. -
anyOf: die Richtlinie ist vertrauenswürdig, wenn dasminimumMatchesKriterium erfüllt ist.
Oben ist im minimumMatches Feld 2. Daher müssen mindestens zwei der Signaturanforderungen erfüllt sein. Der Standardwert für das minimumMatches Feld ist 1.
Alle Signaturanforderungen aus allOf und die Mindestanzahl aus anyOf müssen erfüllt sein.
Validierung des öffentlichen Schlüssels
Um zu überprüfen, ob eine Richtlinie mit dem richtigen öffentlichen Schlüssel signiert ist, geben Sie die Schlüsseldaten und den Eigentümer des Schlüssels an. In diesem Beispiel setzen Sie kind, auf pubKey und der key hat den öffentlichen Schlüssel. Das Feld des Eigentümers ist optional, kann aber nützlich sein, um zu klären, wer den Schlüssel besitzt.
- kind: pubKey
owner: bob # optional
key: |
-----BEGIN PUBLIC KEY-----
MBFKHFDGHKIJH0CAQYIKoZIzj0DAQcDQgAEX0HFTtCfTtPmkx5p1RbDE6HJSGAVD
BVDF6SKFSF87AASUspkQsN3FO4iyWodCy5j3o0CdIJD/KJHDJFHDFIu6sA==
-----END PUBLIC KEY-----
Schlüssellose Signaturvalidierung
Eine im schlüssellosen Modus signierte Richtlinie hat keinen öffentlichen Schlüssel zur Verifizierung. Sie können die Richtlinie dennoch mit den OIDC-Daten verifizieren, die während des Signierungsprozesses verwendet wurden. Dafür ist es notwendig, die Signaturvalidierung als genericIssuer zu definieren.
Es ist möglich, Informationen aus der Signatur zu verifizieren:
-
issuer(obligatorisch): Dies entspricht demIssuerAttribut im Zertifikat, das von Fulcio generiert wurde. Dies zeigt das OIDC, das zur Signierung der Richtlinie verwendet wurde. -
subject: Feld, das verwendet wird, um dasSubjectAttribut im Zertifikat von Fulcio abzugleichen. DasSubject(Fulcio) Feld enthält den Benutzer, der zur Authentifizierung gegen den OIDC-Anbieter verwendet wurde. Das Verifizierungsfeld,subject, kann eines von zwei Unterfeldern haben:-
equal: DasSubject(Fulcio) aus dem Zertifikat muss gleich dem Wert in der Signaturvalidierung sein; -
urlPrefix: Der Wert desSubject(Fulcio) Feldes des Zertifikats muss mit dem in der Signaturvalidierung definierten Wert vorangestellt werden.
-
|
Sowohl das |
Zum Beispiel bedeutet diese Konfiguration, dass die Richtlinie eine schlüssellose Signatur von Alice unter Verwendung des GitHub OIDC haben muss:
- kind: genericIssuer
issuer: https://github.com/login/oauth
subject:
equal: alice@example.com
Diese Konfiguration erfordert, dass die Richtlinie in GitHub-Aktionen signiert wird, von einem Repository, das dem GitHub-Benutzer flavio gehört:
- kind: genericIssuer
issuer: https://token.actions.githubusercontent.com
subject:
urlPrefix: https://github.com/flavio
GitHub-Aktionen Signaturverifizierung
Die Art githubAction dient zur Validierung von in GitHub Actions signierten Richtlinien.
Das können Sie auch mit der genericIssuer Art tun. Um den Prozess der Signaturanforderung zu vereinfachen, verwenden Sie zwei zusätzliche Felder für githubAction:
-
owner(obligatorisch): GitHub-ID des Benutzers oder der Organisation, denen vertraut werden soll -
repo: der Name des Repositories, dem vertraut werden soll
Zum Beispiel könnte der letzte Ausschnitt, der genericIssuer verwendet, wie folgt umgeschrieben werden:
- kind: githubAction
owner: flavio
Validierung der Signaturannotationen
Alle Signaturtypen können andere optionale Validierungsfelder haben, annotations.
Diese Felder sind Schlüssel/Wert-Daten, die während des Signierungsprozesses hinzugefügt werden.
Mit Admission Controller können Sie überprüfen, ob die Richtliniensignatur von vertrauenswürdigen Benutzern und stammt, die spezifische Annotationen haben.
Die nächste Validierung überprüft 2 Bedingungen für die Richtlinie:
-
dass sie mit einem bestimmten Schlüssel signiert ist
-
dass sie eine Annotation für die Produktionsumgebung hat
- kind: pubKey
key: |
-----BEGIN PUBLIC KEY-----
MBFKHFDGHKIJH0CAQYIKoZIzj0DAQcDQgAEX0HFTtCfTtPmkx5p1RbDE6HJSGAVD
BVDF6SKFSF87AASUspkQsN3FO4iyWodCy5j3o0CdIJD/KJHDJFHDFIu6sA==
-----END PUBLIC KEY-----
annotations:
environment: production
Verwendung einer Konfigurationsdatei zur Überprüfung einer Richtlinie als OCI-Artefakt.
Sie können testen, ob eine Richtlinie die Überprüfung besteht, indem Sie die Konfigurationsdatei für die Überprüfung verwenden.
Verwenden Sie das --verification-config-path Flag des kwctl verify Befehls
$ cat signatures_requirements.yaml
apiVersion: v1
allOf:
- kind: pubKey
key: |
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5Q+cN1Jj2S7N05J4AXnqwP2DyzSg
Mc+raYce2Wthrd30MSgFtoh5ADAkCd/nML2Nx8UD9KBuASRb0gG5jXqgMQ==
-----END PUBLIC KEY-----
$ kwctl verify --verification-config-path signatures_requirements.yaml ghcr.io/kubewarden/policies/user-group-psp:latest
2022-03-29T17:34:37.847169Z INFO kwctl::verify: Policy successfully verified
Dieses letzte Beispiel testet, ob eine gegebene Richtlinie von der Admission Controller Organisation stammt:
$ cat kubewarden_signatures.yaml
apiVersion: v1
allOf:
- kind: githubAction
owner: kubewarden
$ kwctl verify --verification-config-path kubewarden_signatures.yaml ghcr.io/kubewarden/policies/user-group-psp:latest
2022-03-29T18:07:39.062292Z INFO kwctl::verify: Policy successfully verified