add managed secret creation policy

This commit is contained in:
Maidul Islam
2024-03-19 14:58:17 -04:00
parent 02b2851990
commit 3eef023c30
12 changed files with 112 additions and 51 deletions
+2 -2
View File
@@ -13,9 +13,9 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes # This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version. # to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/) # Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.3.3 version: v0.4.0
# This is the version number of the application being deployed. This version number should be # This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to # incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using. # follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes. # It is recommended to use it with quotes.
appVersion: "0.3.0" appVersion: "v0.4.0"
@@ -1,13 +1,3 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "secrets-operator.fullname" . }}-controller-manager
labels:
app.kubernetes.io/component: rbac
app.kubernetes.io/created-by: k8-operator
app.kubernetes.io/part-of: k8-operator
{{- include "secrets-operator.labels" . | nindent 4 }}
---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
@@ -49,36 +39,29 @@ spec:
values: values:
- linux - linux
containers: containers:
- args: - args: {{- toYaml .Values.controllerManager.kubeRbacProxy.args | nindent 8 }}
- --secure-listen-address=0.0.0.0:8443
- --upstream=http://127.0.0.1:8080/
- --logtostderr=true
- --v=0
env: env:
- name: KUBERNETES_CLUSTER_DOMAIN - name: KUBERNETES_CLUSTER_DOMAIN
value: {{ .Values.kubernetesClusterDomain }} value: {{ quote .Values.kubernetesClusterDomain }}
image: {{ .Values.controllerManager.kubeRbacProxy.image.repository }}:{{ .Values.controllerManager.kubeRbacProxy.image.tag | default .Chart.AppVersion }} image: {{ .Values.controllerManager.kubeRbacProxy.image.repository }}:{{ .Values.controllerManager.kubeRbacProxy.image.tag
| default .Chart.AppVersion }}
name: kube-rbac-proxy name: kube-rbac-proxy
ports: ports:
- containerPort: 8443 - containerPort: 8443
name: https name: https
protocol: TCP protocol: TCP
resources: {{- toYaml .Values.controllerManager.kubeRbacProxy.resources | nindent 10 }} resources: {{- toYaml .Values.controllerManager.kubeRbacProxy.resources | nindent
securityContext: 10 }}
allowPrivilegeEscalation: false securityContext: {{- toYaml .Values.controllerManager.kubeRbacProxy.containerSecurityContext
capabilities: | nindent 10 }}
drop: - args: {{- toYaml .Values.controllerManager.manager.args | nindent 8 }}
- ALL
- args:
- --health-probe-bind-address=:8081
- --metrics-bind-address=127.0.0.1:8080
- --leader-elect
command: command:
- /manager - /manager
env: env:
- name: KUBERNETES_CLUSTER_DOMAIN - name: KUBERNETES_CLUSTER_DOMAIN
value: {{ .Values.kubernetesClusterDomain }} value: {{ quote .Values.kubernetesClusterDomain }}
image: {{ .Values.controllerManager.manager.image.repository }}:{{ .Values.controllerManager.manager.image.tag | default .Chart.AppVersion }} image: {{ .Values.controllerManager.manager.image.repository }}:{{ .Values.controllerManager.manager.image.tag
| default .Chart.AppVersion }}
livenessProbe: livenessProbe:
httpGet: httpGet:
path: /healthz path: /healthz
@@ -92,12 +75,10 @@ spec:
port: 8081 port: 8081
initialDelaySeconds: 5 initialDelaySeconds: 5
periodSeconds: 10 periodSeconds: 10
resources: {{- toYaml .Values.controllerManager.manager.resources | nindent 10 }} resources: {{- toYaml .Values.controllerManager.manager.resources | nindent 10
securityContext: }}
allowPrivilegeEscalation: false securityContext: {{- toYaml .Values.controllerManager.manager.containerSecurityContext
capabilities: | nindent 10 }}
drop:
- ALL
securityContext: securityContext:
runAsNonRoot: true runAsNonRoot: true
serviceAccountName: {{ include "secrets-operator.fullname" . }}-controller-manager serviceAccountName: {{ include "secrets-operator.fullname" . }}-controller-manager
@@ -96,6 +96,14 @@ spec:
type: string type: string
managedSecretReference: managedSecretReference:
properties: properties:
creationPolicy:
default: Orphan
description: 'The Kubernetes Secret creation policy. Enum with values:
''Owner'', ''Orphan''. Owner creates the secret and sets .metadata.ownerReferences
of the InfisicalSecret CRD that created it. Orphan will not set
the secret owner. This will result in the secret being orphaned
and not deleted when the resource is deleted.'
type: string
secretName: secretName:
description: The name of the Kubernetes Secret description: The name of the Kubernetes Secret
type: string type: string
@@ -14,4 +14,4 @@ spec:
control-plane: controller-manager control-plane: controller-manager
{{- include "secrets-operator.selectorLabels" . | nindent 4 }} {{- include "secrets-operator.selectorLabels" . | nindent 4 }}
ports: ports:
{{- .Values.metricsService.ports | toYaml | nindent 2 -}} {{- .Values.metricsService.ports | toYaml | nindent 2 }}
@@ -0,0 +1,11 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "secrets-operator.fullname" . }}-controller-manager
labels:
app.kubernetes.io/component: rbac
app.kubernetes.io/created-by: k8-operator
app.kubernetes.io/part-of: k8-operator
{{- include "secrets-operator.labels" . | nindent 4 }}
annotations:
{{- toYaml .Values.controllerManager.serviceAccount.annotations | nindent 4 }}
+22 -1
View File
@@ -1,5 +1,15 @@
controllerManager: controllerManager:
kubeRbacProxy: kubeRbacProxy:
args:
- --secure-listen-address=0.0.0.0:8443
- --upstream=http://127.0.0.1:8080/
- --logtostderr=true
- --v=0
containerSecurityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
image: image:
repository: gcr.io/kubebuilder/kube-rbac-proxy repository: gcr.io/kubebuilder/kube-rbac-proxy
tag: v0.15.0 tag: v0.15.0
@@ -11,9 +21,18 @@ controllerManager:
cpu: 5m cpu: 5m
memory: 64Mi memory: 64Mi
manager: manager:
args:
- --health-probe-bind-address=:8081
- --metrics-bind-address=127.0.0.1:8080
- --leader-elect
containerSecurityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
image: image:
repository: infisical/kubernetes-operator repository: infisical/kubernetes-operator
tag: latest tag: v0.4.0 # fixed to prevent accidental upgrade
resources: resources:
limits: limits:
cpu: 500m cpu: 500m
@@ -22,6 +41,8 @@ controllerManager:
cpu: 10m cpu: 10m
memory: 64Mi memory: 64Mi
replicas: 1 replicas: 1
serviceAccount:
annotations: {}
kubernetesClusterDomain: cluster.local kubernetesClusterDomain: cluster.local
metricsService: metricsService:
ports: ports:
+13 -3
View File
@@ -37,9 +37,19 @@ help: ## Display this help.
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
## Chart - NOTE: change helper file to have 15 length for full name method # ## Chart - NOTE: change helper file to have 15 length for full name method
helm-chart: # helm-chart:
$(KUSTOMIZE) build config/default | helmify ../helm-charts/secrets-operator # $(KUSTOMIZE) build config/default | helmify ../helm-charts/secrets-operator
HELMIFY ?= $(LOCALBIN)/helmify
.PHONY: helmify
helmify: $(HELMIFY) ## Download helmify locally if necessary.
$(HELMIFY): $(LOCALBIN)
test -s $(LOCALBIN)/helmify || GOBIN=$(LOCALBIN) go install github.com/arttor/helmify/cmd/helmify@latest
helm: manifests kustomize helmify
$(KUSTOMIZE) build config/default | $(HELMIFY) ../helm-charts/secrets-operator
## Yaml for Kubectl ## Yaml for Kubectl
kubectl-install: manifests kustomize kubectl-install: manifests kustomize
@@ -56,6 +56,14 @@ type MangedKubeSecretConfig struct {
// +kubebuilder:validation:Optional // +kubebuilder:validation:Optional
// +kubebuilder:default:=Opaque // +kubebuilder:default:=Opaque
SecretType string `json:"secretType"` SecretType string `json:"secretType"`
// The Kubernetes Secret creation policy.
// Enum with values: 'Owner', 'Orphan'.
// Owner creates the secret and sets .metadata.ownerReferences of the InfisicalSecret CRD that created it.
// Orphan will not set the secret owner. This will result in the secret being orphaned and not deleted when the resource is deleted.
// +kubebuilder:validation:Optional
// +kubebuilder:default:=Orphan
CreationPolicy string `json:"creationPolicy"`
} }
// InfisicalSecretSpec defines the desired state of InfisicalSecret // InfisicalSecretSpec defines the desired state of InfisicalSecret
@@ -96,6 +96,15 @@ spec:
type: string type: string
managedSecretReference: managedSecretReference:
properties: properties:
creationPolicy:
default: Orphan
description: 'The Kubernetes Secret creation policy. Enum with
values: ''Owner'', ''Orphan''. Owner creates the secret and
sets .metadata.ownerReferences of the InfisicalSecret CRD that
created it. Orphan will not set the secret owner. This will
result in the secret being orphaned and not deleted when the
resource is deleted.'
type: string
secretName: secretName:
description: The name of the Kubernetes Secret description: The name of the Kubernetes Secret
type: string type: string
+3 -2
View File
@@ -5,9 +5,9 @@ metadata:
labels: labels:
label-to-be-passed-to-managed-secret: sample-value label-to-be-passed-to-managed-secret: sample-value
annotations: annotations:
example.com/annotation-to-be-passed-to-managed-secret: "sample-value" reflector.v1.k8s.emberstack.com/reflection-allowed: 'true'
spec: spec:
hostAPI: https://app.infisical.com/api hostAPI: http://localhost:8888/api
resyncInterval: 10 resyncInterval: 10
authentication: authentication:
serviceAccount: serviceAccount:
@@ -26,6 +26,7 @@ spec:
managedSecretReference: managedSecretReference:
secretName: managed-secret secretName: managed-secret
secretNamespace: default secretNamespace: default
creationPolicy: "Orphan" ## Owner | Orphan
# secretType: kubernetes.io/dockerconfigjson # secretType: kubernetes.io/dockerconfigjson
# # To be depreciated soon # # To be depreciated soon
@@ -142,8 +142,18 @@ func (r *InfisicalSecretReconciler) CreateInfisicalManagedKubeSecret(ctx context
} }
annotations := map[string]string{} annotations := map[string]string{}
systemPrefixes := []string{"kubectl.kubernetes.io/", "kubernetes.io/", "k8s.io/", "helm.sh/"}
for k, v := range infisicalSecret.Annotations { for k, v := range infisicalSecret.Annotations {
annotations[k] = v isSystem := false
for _, prefix := range systemPrefixes {
if strings.HasPrefix(k, prefix) {
isSystem = true
break
}
}
if !isSystem {
annotations[k] = v
}
} }
annotations[SECRET_VERSION_ANNOTATION] = encryptedSecretsResponse.ETag annotations[SECRET_VERSION_ANNOTATION] = encryptedSecretsResponse.ETag
@@ -160,13 +170,15 @@ func (r *InfisicalSecretReconciler) CreateInfisicalManagedKubeSecret(ctx context
Data: plainProcessedSecrets, Data: plainProcessedSecrets,
} }
// Set InfisicalSecret instance as the owner and controller if infisicalSecret.Spec.ManagedSecretReference.CreationPolicy == "Owner" {
err := ctrl.SetControllerReference(&infisicalSecret, newKubeSecretInstance, r.Scheme) // Set InfisicalSecret instance as the owner and controller of the managed secret
if err != nil { err := ctrl.SetControllerReference(&infisicalSecret, newKubeSecretInstance, r.Scheme)
return err if err != nil {
return err
}
} }
err = r.Client.Create(ctx, newKubeSecretInstance) err := r.Client.Create(ctx, newKubeSecretInstance)
if err != nil { if err != nil {
return fmt.Errorf("unable to create the managed Kubernetes secret : %w", err) return fmt.Errorf("unable to create the managed Kubernetes secret : %w", err)
} }
+1 -1
View File
@@ -77,7 +77,7 @@ func CallGetSecretsV3(httpClient *resty.Client, request GetEncryptedSecretsV3Req
return GetEncryptedSecretsV3Response{}, fmt.Errorf("CallGetSecretsV3: Unsuccessful response. Please make sure your secret path, workspace and environment name are all correct [response=%s]", response) return GetEncryptedSecretsV3Response{}, fmt.Errorf("CallGetSecretsV3: Unsuccessful response. Please make sure your secret path, workspace and environment name are all correct [response=%s]", response)
} }
if response.StatusCode() == 304 { if response.Header().Get("etag") == request.ETag {
secretsResponse.Modified = false secretsResponse.Modified = false
} else { } else {
secretsResponse.Modified = true secretsResponse.Modified = true