Skip to content

Commit 5522d45

Browse files
authored
Merge pull request #2 from Webfleet-Solutions/feature/circumvent-insecure-secrets-listing
Feature/circumvent insecure secrets listing
2 parents 1d0a6e8 + 9885736 commit 5522d45

File tree

4 files changed

+19
-1
lines changed

4 files changed

+19
-1
lines changed

helm/charts/k8s-image-availability-exporter/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
This chart bootstraps a [k8s-image-availability-exporter](https://github.com/flant/k8s-image-availability-exporter) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
66

7+
> [!WARNING]
8+
> By default, k8s-iae has unconstrained access to **all** secrets in the cluster!
9+
710
## Prerequisites
811
- Kubernetes 1.12+
912
- Helm 2+
@@ -39,6 +42,7 @@ The following tables list the configurable parameters of the k8s-image-availabil
3942
### General
4043
| Parameter | Description | Default |
4144
| ----- | ----------- | ------ |
45+
| `k8sImageAvailabilityExporter.useSecretsForPrivateRepositories` | Give k8s-iae unconstrained access to all secrets in the cluster. This is necessary if there are images that are referenced from private registries, which are deployed in pods, where the pull secret is not defined in `spec.imagePullSecrets` in plaintext but rather in an external secret. This setting only modifies the RBAC rules. | `true` |
4246
| `k8sImageAvailabilityExporter.image.pullPolicy` | Image pull policy to use for the k8s-image-availability-exporter deployment | `IfNotPresent` |
4347
| `k8sImageAvailabilityExporter.image.repository` | Repository to use for the k8s-image-availability-exporter deployment | `ghcr.io/Webfleet-Solutions/k8s-image-availability-exporter` |
4448
| `k8sImageAvailabilityExporter.image.tag` | Tag to use for the k8s-image-availability-exporter deployment | `latest` |

helm/charts/k8s-image-availability-exporter/templates/rbac.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ kind: ClusterRole
44
metadata:
55
name: {{ template "k8s-image-availability-exporter.fullname" . }}
66
rules:
7+
{{- if .Values.k8sImageAvailabilityExporter.useSecretsForPrivateRepositories }}
78
- apiGroups:
89
- ""
910
resources:
@@ -12,6 +13,7 @@ rules:
1213
- list
1314
- watch
1415
- get
16+
{{- end }}
1517
- apiGroups:
1618
- ""
1719
resources:

helm/charts/k8s-image-availability-exporter/values.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ k8sImageAvailabilityExporter:
55
pullPolicy: IfNotPresent
66
replicas: 1
77
resources: {}
8+
useSecretsForPrivateRepositories: true # Setting this to false will prevent k8s-iae having unconstrained cluster-wide secret access
89
args:
910
- --bind-address=:8080
1011

pkg/registry_checker/checker.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
appsv1informers "k8s.io/client-go/informers/apps/v1"
2222
batchv1informers "k8s.io/client-go/informers/batch/v1"
2323
corev1informers "k8s.io/client-go/informers/core/v1"
24+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2425

2526
"k8s.io/client-go/informers"
2627

@@ -193,7 +194,17 @@ func NewRegistryChecker(
193194
}
194195
rc.controllerIndexers.cronJobIndexer = rc.cronJobsInformer.Informer().GetIndexer()
195196

196-
rc.controllerIndexers.secretIndexer = rc.secretsInformer.Informer().GetIndexer()
197+
namespace := "default"
198+
// Create a context
199+
ctx := context.TODO()
200+
// Attempt to list secrets in the default namespace
201+
_, enumerr := kubeClient.CoreV1().Secrets(namespace).List(ctx, metav1.ListOptions{})
202+
if enumerr != nil {
203+
// Not add the secret indexer to automatic cache updater
204+
logrus.Warn("The provided ServiceAccount is not able to list secrets. The check for images in private registries requires 'spec.imagePullSecrets' to be configured correctly.")
205+
} else {
206+
rc.controllerIndexers.secretIndexer = rc.secretsInformer.Informer().GetIndexer()
207+
}
197208

198209
go informerFactory.Start(stopCh)
199210
logrus.Info("Waiting for cache sync")

0 commit comments

Comments
 (0)