diff --git a/cmd/controller/server.go b/cmd/controller/server.go index 763517ee1..7ded17825 100644 --- a/cmd/controller/server.go +++ b/cmd/controller/server.go @@ -26,6 +26,9 @@ type certProvider func() []*x509.Certificate type secretChecker func([]byte) (bool, error) type secretRotator func([]byte) ([]byte, error) +// httpserver starts an HTTP that exposes core functionality like serving the public key +// or secret rotation and validation. This endpoint is designed to be accessible by +// all users of a given cluster. It must not leak any secret material. func httpserver(cp certProvider, sc secretChecker, sr secretRotator) { httpRateLimiter := rateLimter() diff --git a/controller.jsonnet b/controller.jsonnet index bc14c89b3..88424cb7e 100644 --- a/controller.jsonnet +++ b/controller.jsonnet @@ -38,6 +38,26 @@ controller { ], }, + serviceProxierRole: kube.Role('sealed-secrets-service-proxier') + $.namespace { + rules: [ + { + apiGroups: [ + '', + ], + resources: [ + 'services/proxy', + ], + resourceNames: [ + 'http:sealed-secrets-controller:', // kubeseal uses net.JoinSchemeNamePort when crafting proxy subresource URLs + 'sealed-secrets-controller', // but often services are referred by name only, let's not make it unnecessarily cryptic + ], + verbs: [ + 'get', + ], + }, + ], + }, + unsealerBinding: kube.ClusterRoleBinding('sealed-secrets-controller') { roleRef_: $.unsealerRole, subjects_+: [$.account], @@ -48,6 +68,13 @@ controller { subjects_+: [$.account], }, + serviceProxierBinding: kube.RoleBinding('sealed-secrets-service-proxier') + $.namespace { + roleRef_: $.serviceProxierRole, + // kube.libsonnet assumes object here have a namespace, but system groups don't + // thus are not supposed to use the magic "_" here. + subjects+: [kube.Group('system:authenticated')], + }, + controller+: { spec+: { template+: {