Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: cert rotator #488

Merged
merged 8 commits into from
Aug 26, 2024
6 changes: 1 addition & 5 deletions charts/kubewarden-controller/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,17 @@ The kubewarden-controller can be deployed using a helm chart.

## Installing the charts

Make sure you have [`cert-manager` installed](https://cert-manager.io/docs/installation/)
and then install the kubewarden-controller chart.

If you want to enable telemetry, you also need to install [OpenTelemetry Operator](https://github.com/open-telemetry/opentelemetry-operator).

For example:
```console
$ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml
$ helm repo add kubewarden https://charts.kubewarden.io
$ helm install --create-namespace -n kubewarden kubewarden-crds kubewarden/kubewarden-crds
$ helm install --wait -n kubewarden kubewarden-controller kubewarden/kubewarden-controller
$ helm install --wait -n kubewarden kubewarden-defaults kubewarden/kubewarden-defaults
```

This will install cert-manager, kubewarden-crds, kubewarden-controller, and a
This will install kubewarden-crds, kubewarden-controller, and a
default PolicyServer on the Kubernetes cluster in the default configuration
(which includes self-signed TLS certs).

Expand Down
20 changes: 0 additions & 20 deletions charts/kubewarden-controller/questions.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -114,26 +114,6 @@ questions:
description: |
Number of replicas of the Controller Deployment
group: "Controller HA"
# Certificates:
- variable: tls.source
default: "cert-manager-self-signed"
description: "Source for TLS certificates"
label: TLS certificates source
type: enum
options:
- "cert-manager-self-signed"
- "cert-manager"
show_subquestion_if: "cert-manager"
group: "Certificates"
subquestions:
- variable: "tls.certManagerIssuerName"
type: string
default: ""
label: cert-manager Issuer name
description: |
Name of cert-manager Issuer
group: "Certificates"
show_if: "tls.source=cert-manager"
# Telemetry:
- variable: "telemetry.metrics.enabled"
type: boolean
Expand Down
2 changes: 1 addition & 1 deletion charts/kubewarden-controller/templates/_helpers.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ Create the name of the service account to use for kubewarden-controller
- --disable-store
{{- end }}
- --extra-ca
- "/pki/policy-server-root-ca-pem"
- "/pki/ca.crt"
{{- if .Values.auditScanner.outputScan }}
- --output-scan
{{- end }}
Expand Down
10 changes: 5 additions & 5 deletions charts/kubewarden-controller/templates/audit-scanner.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,13 @@ spec:
{{- end }}
restartPolicy: {{ .Values.auditScanner.containerRestartPolicy }}
volumes:
- name: policyservers-ca-cert
- name: kubewarden-ca
secret:
defaultMode: 420
secretName: policy-server-root-ca
secretName: kuebewarden-ca
items:
- key: policy-server-root-ca-pem
path: "policy-server-root-ca-pem"
- key: ca.crt
path: "ca.crt"
{{- if .Values.global.affinity }}
affinity: {{ .Values.global.affinity | toYaml | nindent 14 }}
{{- end }}
Expand All @@ -54,7 +54,7 @@ spec:
{{- with .Values.containerSecurityContext }}
volumeMounts:
- mountPath: "/pki"
name: policyservers-ca-cert
name: kubewarden-ca
readOnly: true
securityContext:
{{- toYaml . | nindent 14 }}
Expand Down
35 changes: 0 additions & 35 deletions charts/kubewarden-controller/templates/cert-tls.yaml

This file was deleted.

3 changes: 2 additions & 1 deletion charts/kubewarden-controller/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ spec:
args:
- --leader-elect
- --deployments-namespace={{ .Release.Namespace }}
- --webhook-service-name={{ include "kubewarden-controller.fullname" . }}-webhook-service
{{- if .Values.telemetry.metrics.enabled }}
- --enable-metrics
{{- end }}
Expand Down Expand Up @@ -94,7 +95,7 @@ spec:
- name: cert
secret:
defaultMode: 420
secretName: webhook-server-cert
secretName: kubewarden-webhook-server-cert
{{- if .Values.podSecurityContext }}
securityContext:
{{ toYaml .Values.podSecurityContext | indent 8 }}
Expand Down
1 change: 1 addition & 0 deletions charts/kubewarden-controller/templates/rbac.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ rules:
- create
- delete
- list
- get
- patch
- watch
- apiGroups:
Expand Down
53 changes: 51 additions & 2 deletions charts/kubewarden-controller/templates/webhooks.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,53 @@
# generate certificates
{{ $dnsName := printf "%s-webhook-service.%s.svc" (include "kubewarden-controller.fullname" .) .Release.Namespace }}
fabriziosestito marked this conversation as resolved.
Show resolved Hide resolved
{{ $ca := genCA "kubewarden-controller-ca" 365 }}
{{ $cert := genSignedCert $dnsName nil ( list $dnsName ) 3650 $ca }}
{{ $caCert := ($ca.Cert | b64enc) }}
{{ $oldCaCert := "" }}
{{ $caBundle := $caCert }}
{{ $caPrivateKey := ($ca.Key | b64enc) }}
{{ $serverCert := ($cert.Cert | b64enc) }}
{{ $serverPrivateKey := ($cert.Key | b64enc) }}
# check if the secrets already exist and if so, use the existing values
{{ $caSecret := (lookup "v1" "Secret" .Release.Namespace "kubewarden-ca") }}
{{ if $caSecret }}
Copy link
Member

@viccuad viccuad Aug 7, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't we add the genCA, genSignedCert and related variables as part of an else block of this if?
Variables aren't global and are indeed scoped, but we could create them empty, and only call the cert gen if needed.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(I don't consider this a blocker for merging)

{{ $caCert = (index $caSecret.data "ca.crt") }}
{{ $caPrivateKey = (index $caSecret.data "ca.key") }}
{{ $oldCaCert = (index $caSecret.data "old-ca.crt") }}
{{ $caBundle = printf "%s%s" ($caCert | b64dec) ($oldCaCert | b64dec) | b64enc }}
{{ end }}
{{ $serverCertSecret := (lookup "v1" "Secret" .Release.Namespace "kubewarden-webhook-server-cert") }}
{{ if $serverCertSecret }}
{{ $serverCert = (index $serverCertSecret.data "tls.crt") }}
{{ $serverPrivateKey = (index $serverCertSecret.data "tls.key") }}
{{ end }}
apiVersion: v1
kind: Secret
metadata:
name: kubewarden-ca
namespace: {{ .Release.Namespace }}
labels:
{{- include "kubewarden-controller.labels" . | nindent 4 }}
data:
ca.crt: {{ $caCert }}
ca.key: {{ $caPrivateKey }}
old-ca.crt: {{ $oldCaCert }}
---
apiVersion: v1
kind: Secret
metadata:
name: kubewarden-webhook-server-cert
namespace: {{ .Release.Namespace }}
labels:
{{- include "kubewarden-controller.labels" . | nindent 4 }}
data:
tls.crt: {{ $serverCert }}
tls.key: {{ $serverPrivateKey }}
---
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
annotations:
cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ include "kubewarden-controller.fullname" . }}-serving-cert
{{- include "kubewarden-controller.annotations" . | nindent 4 }}
name: kubewarden-controller-mutating-webhook-configuration
labels:
Expand All @@ -13,6 +57,7 @@ webhooks:
- v1
- v1beta1
clientConfig:
caBundle: {{ $caBundle }}
service:
name: {{ include "kubewarden-controller.fullname" . }}-webhook-service
namespace: {{ .Release.Namespace }}
Expand All @@ -34,6 +79,7 @@ webhooks:
- v1
- v1beta1
clientConfig:
caBundle: {{ $caBundle }}
service:
name: {{ include "kubewarden-controller.fullname" . }}-webhook-service
namespace: {{ .Release.Namespace }}
Expand All @@ -55,6 +101,7 @@ webhooks:
- v1
- v1beta1
clientConfig:
caBundle: {{ $caBundle }}
service:
name: {{ include "kubewarden-controller.fullname" . }}-webhook-service
namespace: {{ .Release.Namespace }}
Expand All @@ -78,7 +125,6 @@ apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
annotations:
cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ include "kubewarden-controller.fullname" . }}-serving-cert
{{- include "kubewarden-controller.annotations" . | nindent 4 }}
name: kubewarden-controller-validating-webhook-configuration
labels:
Expand All @@ -88,6 +134,7 @@ webhooks:
- v1
- v1beta1
clientConfig:
caBundle: {{ $caBundle }}
service:
name: {{ include "kubewarden-controller.fullname" . }}-webhook-service
namespace: {{ .Release.Namespace }}
Expand All @@ -109,6 +156,7 @@ webhooks:
- v1
- v1beta1
clientConfig:
caBundle: {{ $caBundle }}
service:
name: {{ include "kubewarden-controller.fullname" . }}-webhook-service
namespace: {{ .Release.Namespace }}
Expand All @@ -129,6 +177,7 @@ webhooks:
- admissionReviewVersions:
- v1
clientConfig:
caBundle: {{ $caBundle }}
service:
name: {{ include "kubewarden-controller.fullname" . }}-webhook-service
namespace: {{ .Release.Namespace }}
Expand Down
11 changes: 0 additions & 11 deletions charts/kubewarden-controller/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -162,17 +162,6 @@ preDeleteJob:
# kubewarden-controller deployment settings:
podAnnotations: {}
nodeSelector: {}
tls:
# source options:
# - "cert-manager-self-signed": Scaffold cert-manager integration, and create
# a self-signed certificate with a cert-manager self-signed Issuer. Depends
# on cert-manager. (default)
# - "cert-manager": Scafffold cert-manager integration. User configures their
# own Issuer. Depends on cert-manager. Set tls.certManagerIssuerName to the
# desired Issuer.
source: cert-manager-self-signed
# "cert-manager"-only options:
certManagerIssuerName: ""
# Resource limits & requests
# Ref: https://kubernetes.io/docs/user-guide/compute-resources/
resources:
Expand Down
Loading