Skip to content

Commit 8ada54f

Browse files
committed
OCPBUGS-59768: metrics endpoints security - add client cert auth to kube-rbac-proxy
**Problem:** OLM metrics endpoints were exposed without proper authentication, allowing unauthorized access to sensitive operational data. **Root Cause:** kube-rbac-proxy configuration was missing critical authentication arguments: - `--client-ca-file` - `--auth-mode=rbac` **Solution:** - Add missing authentication arguments to kube-rbac-proxy in package-server-manager - Mount client CA certificate from new `metrics-client-ca` ConfigMap - Update ServiceMonitor to use `scrapeClass: tls-client-certificate-auth` - Create ConfigMap with service CA injection for automatic CA bundle sync **Security Impact:** - **Before:** Any HTTPS client could access metrics endpoints - **After:** Only authorized Prometheus service account (`system:serviceaccount:openshift-monitoring:prometheus-k8s`) can access metrics
1 parent e53cf30 commit 8ada54f

10 files changed

+83
-9
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: metrics-client-ca
5+
namespace: openshift-operator-lifecycle-manager
6+
annotations:
7+
include.release.openshift.io/self-managed-high-availability: "true"
8+
service.beta.openshift.io/inject-cabundle: "true"
9+
include.release.openshift.io/ibm-cloud-managed: "true"
10+
capability.openshift.io/name: "OperatorLifecycleManager"
11+
include.release.openshift.io/hypershift: "true"
12+
data: {}

manifests/0000_50_olm_06-psm-operator.deployment.ibm-cloud-managed.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ spec:
3535
- --upstream=http://127.0.0.1:9090/
3636
- --tls-cert-file=/etc/tls/private/tls.crt
3737
- --tls-private-key-file=/etc/tls/private/tls.key
38+
- --client-ca-file=/etc/tls/client/client-ca-file
39+
- --auth-mode=rbac
3840
- --logtostderr=true
3941
image: quay.io/openshift/origin-kube-rbac-proxy:latest
4042
imagePullPolicy: IfNotPresent
@@ -57,6 +59,9 @@ spec:
5759
volumeMounts:
5860
- mountPath: /etc/tls/private
5961
name: package-server-manager-serving-cert
62+
- mountPath: /etc/tls/client
63+
name: metrics-client-ca
64+
readOnly: true
6065
- name: package-server-manager
6166
securityContext:
6267
allowPrivilegeEscalation: false
@@ -120,3 +125,6 @@ spec:
120125
- name: package-server-manager-serving-cert
121126
secret:
122127
secretName: package-server-manager-serving-cert
128+
- name: metrics-client-ca
129+
configMap:
130+
name: metrics-client-ca

manifests/0000_50_olm_06-psm-operator.deployment.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ spec:
3535
- --upstream=http://127.0.0.1:9090/
3636
- --tls-cert-file=/etc/tls/private/tls.crt
3737
- --tls-private-key-file=/etc/tls/private/tls.key
38+
- --client-ca-file=/etc/tls/client/client-ca-file
39+
- --auth-mode=rbac
3840
- --logtostderr=true
3941
image: quay.io/openshift/origin-kube-rbac-proxy:latest
4042
imagePullPolicy: IfNotPresent
@@ -57,6 +59,9 @@ spec:
5759
volumeMounts:
5860
- mountPath: /etc/tls/private
5961
name: package-server-manager-serving-cert
62+
- mountPath: /etc/tls/client
63+
name: metrics-client-ca
64+
readOnly: true
6065
- name: package-server-manager
6166
securityContext:
6267
allowPrivilegeEscalation: false
@@ -121,3 +126,6 @@ spec:
121126
- name: package-server-manager-serving-cert
122127
secret:
123128
secretName: package-server-manager-serving-cert
129+
- name: metrics-client-ca
130+
configMap:
131+
name: metrics-client-ca

manifests/0000_50_olm_06-psm-operator.servicemonitor.yaml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,12 @@ metadata:
99
capability.openshift.io/name: "OperatorLifecycleManager"
1010
spec:
1111
endpoints:
12-
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
13-
interval: 30s
12+
- interval: 30s
1413
port: metrics
1514
scheme: https
1615
tlsConfig:
17-
caFile: /etc/prometheus/configmaps/serving-certs-ca-bundle/service-ca.crt
1816
serverName: package-server-manager-metrics.openshift-operator-lifecycle-manager.svc
17+
scrapeClass: tls-client-certificate-auth
1918
namespaceSelector:
2019
matchNames:
2120
- openshift-operator-lifecycle-manager
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: metrics-client-ca
5+
namespace: openshift-operator-lifecycle-manager
6+
annotations:
7+
include.release.openshift.io/self-managed-high-availability: "true"
8+
service.beta.openshift.io/inject-cabundle: "true"
9+
include.release.openshift.io/ibm-cloud-managed: "true"
10+
capability.openshift.io/name: "OperatorLifecycleManager"
11+
include.release.openshift.io/hypershift: "true"
12+
data: {}

microshift-manifests/0000_50_olm_06-psm-operator.deployment.ibm-cloud-managed.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ spec:
3535
- --upstream=http://127.0.0.1:9090/
3636
- --tls-cert-file=/etc/tls/private/tls.crt
3737
- --tls-private-key-file=/etc/tls/private/tls.key
38+
- --client-ca-file=/etc/tls/client/client-ca-file
39+
- --auth-mode=rbac
3840
- --logtostderr=true
3941
image: quay.io/openshift/origin-kube-rbac-proxy:latest
4042
imagePullPolicy: IfNotPresent
@@ -57,6 +59,9 @@ spec:
5759
volumeMounts:
5860
- mountPath: /etc/tls/private
5961
name: package-server-manager-serving-cert
62+
- mountPath: /etc/tls/client
63+
name: metrics-client-ca
64+
readOnly: true
6065
- name: package-server-manager
6166
securityContext:
6267
allowPrivilegeEscalation: false
@@ -120,3 +125,6 @@ spec:
120125
- name: package-server-manager-serving-cert
121126
secret:
122127
secretName: package-server-manager-serving-cert
128+
- name: metrics-client-ca
129+
configMap:
130+
name: metrics-client-ca

microshift-manifests/0000_50_olm_06-psm-operator.deployment.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ spec:
3535
- --upstream=http://127.0.0.1:9090/
3636
- --tls-cert-file=/etc/tls/private/tls.crt
3737
- --tls-private-key-file=/etc/tls/private/tls.key
38+
- --client-ca-file=/etc/tls/client/client-ca-file
39+
- --auth-mode=rbac
3840
- --logtostderr=true
3941
image: quay.io/openshift/origin-kube-rbac-proxy:latest
4042
imagePullPolicy: IfNotPresent
@@ -57,6 +59,9 @@ spec:
5759
volumeMounts:
5860
- mountPath: /etc/tls/private
5961
name: package-server-manager-serving-cert
62+
- mountPath: /etc/tls/client
63+
name: metrics-client-ca
64+
readOnly: true
6065
- name: package-server-manager
6166
securityContext:
6267
allowPrivilegeEscalation: false
@@ -121,3 +126,6 @@ spec:
121126
- name: package-server-manager-serving-cert
122127
secret:
123128
secretName: package-server-manager-serving-cert
129+
- name: metrics-client-ca
130+
configMap:
131+
name: metrics-client-ca

microshift-manifests/0000_50_olm_06-psm-operator.servicemonitor.yaml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,12 @@ metadata:
99
capability.openshift.io/name: "OperatorLifecycleManager"
1010
spec:
1111
endpoints:
12-
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
13-
interval: 30s
12+
- interval: 30s
1413
port: metrics
1514
scheme: https
1615
tlsConfig:
17-
caFile: /etc/prometheus/configmaps/serving-certs-ca-bundle/service-ca.crt
1816
serverName: package-server-manager-metrics.openshift-operator-lifecycle-manager.svc
17+
scrapeClass: tls-client-certificate-auth
1918
namespaceSelector:
2019
matchNames:
2120
- openshift-operator-lifecycle-manager

microshift-manifests/kustomization.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ resources:
1515
- 0000_50_olm_00-pprof-secret.yaml
1616
- 0000_50_olm_00-subscriptions.crd.yaml
1717
- 0000_50_olm_01-networkpolicies.yaml
18+
- 0000_50_olm_02-metrics-client-ca.configmap.yaml
1819
- 0000_50_olm_02-olm-operator.serviceaccount.yaml
1920
- 0000_50_olm_03-olmconfig.yaml
2021
- 0000_50_olm_03-services.yaml

scripts/generate_crds_manifests.sh

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,18 @@ spec:
123123
name: quay.io/openshift/origin-kube-rbac-proxy:latest
124124
EOF
125125

126+
cat << EOF > manifests/0000_50_olm_02-metrics-client-ca.configmap.yaml
127+
apiVersion: v1
128+
kind: ConfigMap
129+
metadata:
130+
name: metrics-client-ca
131+
namespace: openshift-operator-lifecycle-manager
132+
annotations:
133+
include.release.openshift.io/self-managed-high-availability: "true"
134+
service.beta.openshift.io/inject-cabundle: "true"
135+
data: {}
136+
EOF
137+
126138
cat << EOF > manifests/0000_50_olm_06-psm-operator.networkpolicy.yaml
127139
apiVersion: networking.k8s.io/v1
128140
kind: NetworkPolicy
@@ -196,6 +208,8 @@ spec:
196208
- --upstream=http://127.0.0.1:9090/
197209
- --tls-cert-file=/etc/tls/private/tls.crt
198210
- --tls-private-key-file=/etc/tls/private/tls.key
211+
- --client-ca-file=/etc/tls/client/client-ca-file
212+
- --auth-mode=rbac
199213
- --logtostderr=true
200214
image: quay.io/openshift/origin-kube-rbac-proxy:latest
201215
imagePullPolicy: IfNotPresent
@@ -218,6 +232,9 @@ spec:
218232
volumeMounts:
219233
- mountPath: /etc/tls/private
220234
name: package-server-manager-serving-cert
235+
- mountPath: /etc/tls/client
236+
name: metrics-client-ca
237+
readOnly: true
221238
- name: package-server-manager
222239
securityContext:
223240
allowPrivilegeEscalation: false
@@ -282,6 +299,9 @@ spec:
282299
- name: package-server-manager-serving-cert
283300
secret:
284301
secretName: package-server-manager-serving-cert
302+
- name: metrics-client-ca
303+
configMap:
304+
name: metrics-client-ca
285305
EOF
286306

287307
cat << EOF > manifests/0000_50_olm_06-psm-operator.service.yaml
@@ -315,13 +335,12 @@ metadata:
315335
include.release.openshift.io/self-managed-high-availability: "true"
316336
spec:
317337
endpoints:
318-
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
319-
interval: 30s
338+
- interval: 30s
320339
port: metrics
321340
scheme: https
322341
tlsConfig:
323-
caFile: /etc/prometheus/configmaps/serving-certs-ca-bundle/service-ca.crt
324342
serverName: package-server-manager-metrics.openshift-operator-lifecycle-manager.svc
343+
scrapeClass: tls-client-certificate-auth
325344
namespaceSelector:
326345
matchNames:
327346
- openshift-operator-lifecycle-manager

0 commit comments

Comments
 (0)