Skip to content

Commit 3ffc8d8

Browse files
committed
docs: add image signature verification section to README
1 parent e6b7f01 commit 3ffc8d8

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

chart/README.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,76 @@ helm rollback dvls -n devolutions-server
302302
| `securityContext.capabilities.drop` | Linux capabilities to drop | `["ALL"]` |
303303
| `securityContext.seccompProfile.type` | Seccomp profile type | `RuntimeDefault` |
304304

305+
## Image Signature Verification
306+
307+
Devolutions Server container images are signed with [cosign](https://docs.sigstore.dev/cosign/overview/). You can verify the signature of any image using the public key below:
308+
309+
```
310+
-----BEGIN PUBLIC KEY-----
311+
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuyxOC+3ZeSW8eUalDsYQJ7411UJJ
312+
pvL+FPxCQzgP7XnvX8nuSqN9kgd2qhBOB547Dc75eIkZC0KPm3PRvmkbGQ==
313+
-----END PUBLIC KEY-----
314+
```
315+
316+
### Manual verification
317+
318+
```bash
319+
cosign verify \
320+
--key cosign.pub \
321+
devolutions/devolutions-server:<tag>
322+
```
323+
324+
### Kyverno policy
325+
326+
If you use [Kyverno](https://kyverno.io/), you can enforce image signature verification at the cluster level with an `ImageValidatingPolicy`. The example below audits pods in a specific namespace — change `validationActions` to `["Enforce"]` to block unsigned images.
327+
328+
```yaml
329+
apiVersion: policies.kyverno.io/v1
330+
kind: ImageValidatingPolicy
331+
metadata:
332+
name: verify-dvls-image-signatures
333+
spec:
334+
webhookConfiguration:
335+
timeoutSeconds: 15
336+
evaluation:
337+
background:
338+
enabled: true
339+
validationActions: ["Audit"]
340+
matchConstraints:
341+
resourceRules:
342+
- apiGroups: [""]
343+
apiVersions: ["v1"]
344+
operations: ["CREATE", "UPDATE"]
345+
resources: ["pods"]
346+
namespaceSelector:
347+
matchLabels:
348+
kubernetes.io/metadata.name: devolutions-server # adjust to your namespace
349+
matchImageReferences:
350+
- glob: "devolutions/devolutions-server:*"
351+
credentials:
352+
secrets: ["docker-hub"] # your Docker Hub pull secret
353+
attestors:
354+
- name: cosign
355+
cosign:
356+
key:
357+
data: |
358+
-----BEGIN PUBLIC KEY-----
359+
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuyxOC+3ZeSW8eUalDsYQJ7411UJJ
360+
pvL+FPxCQzgP7XnvX8nuSqN9kgd2qhBOB547Dc75eIkZC0KPm3PRvmkbGQ==
361+
-----END PUBLIC KEY-----
362+
validationConfigurations:
363+
required: false
364+
verifyDigest: false
365+
mutateDigest: false
366+
validations:
367+
- expression: >-
368+
images.containers
369+
.filter(image, image.matches("(docker\\.io/)?devolutions/devolutions-server:.*"))
370+
.map(image, verifyImageSignatures(image, [attestors.cosign]))
371+
.all(e, e > 0)
372+
message: "failed image signature verification"
373+
```
374+
305375
## Troubleshooting
306376
307377
### Pod not starting

0 commit comments

Comments
 (0)