Puede elegir dónde almacenar la información confidencial de los componentes que administra Atlas Kubernetes Operator, pero Atlas Kubernetes Operator debe encontrar los secretos de Kubernetes. Se espera. Puede almacenar secretos para el operador de Kubernetes de Atlas de diversas maneras, incluyendo los siguientes métodos:
Incluya información confidencial directamente en los secretos de Kubernetes. Todos los tutoriales de la documentación de Operador de Kubernetes de Atlas utilizan secretos de Kubernetes de forma predeterminada. Para usar secretos de Kubernetes, siga los pasos de los tutoriales.
Colocar información confidencial en un repositorio de Github siguiendo un flujo GitOps. Para almacenar los datos confidenciales de git de manera segura, puedes utilizar herramientas como Sealed Secrets, que cifra los secretos para el clúster de destino previsto.
Guarde la información confidencial en una herramienta externa de almacenamiento de secretos, como HashiCorp Vault o las soluciones nativas de gestión de secretos de Hyperscalers. Una herramienta intermediaria de aprovisionamiento de secretos obtiene la información confidencial de la herramienta externa de almacenamiento de secretos y crea secretos de Kubernetes a partir de ella. Para obtener más información sobre la herramienta de aprovisionamiento de secretos, consulte Consideraciones.
Este tutorial configura una herramienta externa de almacenamiento de secretos para usar con Atlas Kubernetes Operator. Se centra en configuraciones sin secretos que no requieren que Atlas Kubernetes Operator cree y almacene un secreto para aprovisionarlos en su clúster de Kubernetes.
Considerations
El siguiente tutorial instala o configura las siguientes herramientas y opciones:
Una herramienta de aprovisionamiento de secretos. Esta herramienta utiliza uno o más mecanismos de autenticación para recuperar las credenciales del servicio de gestión de secretos y crear secretos que Atlas Kubernetes Operator puede usar. Este tutorial instala una de las siguientes herramientas de aprovisionamiento de secretos de código abierto:
Autenticación para acceder a secretos. Puede utilizar diferentes métodos para autenticar las cuentas de servicio y los espacios de nombres que pueden acceder a los secretos en HashiCorp Vault:
Para el operador de secretos externos, este tutorial utiliza OIDC AutenticaciónJWT. Para obtener más información, consulte Autenticación JWT/OIDC.
Para el controlador CSI de Secrets Store, este tutorial utiliza la autenticación de Kubernetes.
Como alternativa, el KMS de su proveedor de nube puede usar sistemas IAM nativos para proporcionar esta autenticación, algo que no se explica en este tutorial. Para aprender a configurar el KMS de su proveedor de nube para la autenticación, consulte los siguientes recursos en la documentación del operador de secretos externos:
Requisitos previos
Antes de completar este tutorial, necesitará las siguientes herramientas y configuraciones:
Ejecutar cuentas de servicio para Kubernetes, Atlas Kubernetes Operator y Atlas y privilegios suficientes para configurarlas.
Necesita un clúster de Kubernetes en ejecución con nodos que ejecuten procesadores con la arquitectura x86-64, AMD64 o ARM64. Para este tutorial, el clúster de Kubernetes es
https://kube01.internal.ioescuchando en el puerto predeterminado (443).Puede acceder al proyecto Atlas Kubernetes Operator en GitHub:
Para instalar el operador Atlas Kubernetes mediante la CLI de Atlas, ejecute el siguiente comando:
atlas kubernetes operator install [options] Para obtener más información sobre la sintaxis del comando y los parámetros, consulta la documentación de Atlas CLI para atlas kubernetes operator install.
Para implementar el operador Atlas Kubernetes, ejecute el siguiente comando. Reemplace
<version>con la última versión. número de lanzamientokubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-atlas-kubernetes/<version>/deploy/all-in-one.yaml Para registrarse en una cuenta Atlas, consulte Crear una cuenta Atlas.
Claves API. Debe crear una clave API y configurarla. API Access List.
Necesita la siguiente clave API pública, clave API privada y la información de ID de la organización para configurar el acceso del operador de Kubernetes de Atlas a Atlas.
Si desea que el operador de Kubernetes de Atlascree un nuevo proyecto de Atlas, otorgue acceso programático a unaorganización. Si su organización requiere una lista de acceso de IP para la API de administración de Atlas, también debe configurarla.
Importante
Debe asignar a la clave API el rol de organización Organization Project Creator o superior.
Si desea trabajar con un proyecto de Atlas existente, agregue el acceso al proyecto desdeun proyecto. Si su organización requiere una lista de acceso IP para la API de administración de Atlas, también debe configurarla.
Importante
Debe asignar al clave API el rol de proyecto Project Owner.
Una bóveda de almacenamiento secreto. Este tutorial utiliza HashiCorp Vault, un servicio externo para almacenamiento secreto, que se ejecuta
https://vault.internal.ioen.Puede utilizar otras bóvedas de almacenamiento secretas con Atlas Kubernetes Operator según sea necesario, incluido Cloud KMS de AWS, Azure y Google.
Acceso exclusivo interno. Para evitar la exposición de información confidencial en la red pública de internet, los siguientes componentes de la solución de almacenamiento secreto solo permiten acceso interno:
El servicio HashiCorp Vault o KMS.
El servicio API de clúster de Kubernetes.
La red interna. Este tutorial utiliza
internal.io.
Si bien los componentes anteriores solo permiten acceso interno, permiten el acceso entre sí y a cualquier persona de su equipo u organización. Esta es una práctica recomendada para la seguridad.
Autoridades de certificación (CA) públicas. Puede usar CA públicas para evitar la administración y distribución de certificados raíz de CA personalizados.
Puede automatizar la gestión y renovación de certificados de CA utilizando cualquiera de las siguientes herramientas:
En este tutorial:
Todos los servicios HTTPS
internal.ioson direcciones internas, pero sus sitios HTTPS contienen certificados renovados automáticamente firmados por una CA pública.No se requiere TLS mutuo (mTLS) para esta integración porque solo realiza la validación HTTPS del lado del servidor.
Los clientes pueden confiar en estos certificados de servicio sin necesidad de aprovisionar ningún certificado adicional.
Procedimiento
Siga estos pasos para configurar el almacenamiento secreto para Atlas Kubernetes Operator.
Instale la herramienta de aprovisionamiento secreto en el clúster de destino.
Seleccione una herramienta de aprovisionamiento secreta para instalarla.
Para usar External Secrets operador como herramienta de provisionamineto de secretos:
Ejecute los siguientes comandos para instalar External Secrets Operator con Helm Charts e iniciar el servicio:
helm repo add external-secrets https://charts.external-secrets.io helm upgrade -i --atomic \ -n external-secrets --create-namespace --set extraArgs.loglevel=debug \ external-secrets external-secrets/external-secrets` Asegúrese de que External Secrets se ejecute correctamente:
kubectl get pod -n external-secrets -l app.kubernetes.io/name=external-secrets NAME READY STATUS RESTARTS AGE external-secrets-5779d5d6f6-2lhgd 1/1 Running 0 70s
Para utilizar el controlador CSI de Secrets Store como herramienta de aprovisionamiento de secretos, siga estos pasos:
Ejecute el siguiente comando para instalar Secrets Store CSI Driver con Helm Charts e iniciar el servicio:
helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts helm upgrade -i --atomic --set syncSecret.enabled=true \ -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver Ejecute el siguiente comando para instalar el complemento Secrets Store CSI HashiCorp Vault con Helm Charts. No necesita instalar el servidor HashiCorp Vault ni el inyector de secretos.
helm install vault hashicorp/vault \ --set "server.enabled=false" --set "injector.enabled=false" \ --set "csi.enabled=true" Asegúrese de que Secrets Store CSI se ejecute correctamente:
kubectl get pod -n kube-system -l app.kubernetes.io/name=secrets-store-csi-driver NAME READY STATUS RESTARTS AGE csi-secrets-store-secrets-store-csi-driver-6dcm8 3/3 Running 0 2m2s Asegúrese de que el proveedor CSI de HashiCorp Vault se ejecute correctamente:
kubectl get pods -l app.kubernetes.io/name=vault-csi-provider NAME READY STATUS RESTARTS AGE vault-csi-provider-j7xbr 2/2 Running 0 5m39s
Configurar la autenticación para acceder a los secretos.
Para configurar la autenticación de OIDC JWT y Kubernetes:
Ejecute el siguiente comando para habilitar la autenticación JWT de OIDC para la ruta de montaje. Si configura varios clústeres de Kubernetes, debe habilitar la autenticación JWT de OIDC para la ruta de montaje de cada clúster.
vault auth enable -path=jwt-kube01 jwt Ejecute el siguiente comando para permitir el acceso no autenticado a las URL de descubrimiento de OIDC en el
kube01.internal.ioclúster:$ kubectl create clusterrolebinding oidc-reviewer \ --clusterrole=system:service-account-issuer-discovery \ --group=system:unauthenticated Ejecute el siguiente comando para indicar a HashiCorp Vault que confíe en el clúster. El emisor del clúster en
https://kube01.internal.io/debe coincidir con la URL del documento de descubrimiento de OIDC.well-known/openid-configurationen.curl https://kube01.internal.io/.well-known/openid-configuration | jq .issuer https://kube01.internal.io/ vault write auth/jwt-kube01/config jwks_url="https://kube01.internal.io/openid/v1/jwks" Crea las directivas que permiten el acceso a los secretos que deseas exponer al clúster.
El siguiente ejemplo crea la política
external-secretsque especificará en pasos posteriores.echo external-secrets-policy.hcl path "secret/data/kube01/external-secrets/*" { capabilities = ["read"] } Ejecute el comando para crear un rol de HashiCorp Vault y vincular una cuenta de servicio de Kubernetes al rol, lo que restringe el acceso de la cuenta de servicio dentro de HashiCorp Vault.
El siguiente comando crea el
jwt-kube01-systemrol de tipo JWT (OIDC) para lavaultaudiencia. El comando especifica lasubnotificación de usuario y ladefaultcuenta de servicio de Kubernetes en elmongodb-atlas-systemespacio de nombres como sujeto enlazado. Este comando vincula el rol alexternal-secretsconjunto de permisos de la política dentro de HashiCorp Vault.vault write auth/jwt-kube01/role/jwt-kube01-system role_type="jwt" bound_audiences=vault \ user_claim="sub" bound_subject="system:serviceaccount:mongodb-atlas-system:default" \ policies="external-secrets" Ejecute el comando para crear otro rol para que el External Secrets Operator acceda al namespace
default.El siguiente comando crea el
jwt-kube01-defaultrol de tipo JWT (OIDC) para lavaultaudiencia. Este comando especifica lasubnotificación de usuario y ladefaultcuenta de servicio de Kubernetes en eldefaultespacio de nombres como sujeto enlazado. Este comando vincula el rol alexternal-secretsconjunto de permisos de políticas dentro de HashiCorp Vault.vault write auth/jwt-kube01/role/jwt-kube01-default role_type="jwt" bound_audiences=vault \ user_claim="sub" bound_subject="system:serviceaccount:default:default" \ policies="external-secrets" Asegúrese de que la autenticación OIDC se ejecute correctamente para la cuenta de servicio del sistema:
export TEST_JWT_TOKEN=$(kubectl -n mongodb-atlas-system create token default --audience "vault") vault write auth/jwt-kube01/login role=jwt-kube01-system jwt=$(TEST_JWT_TOKEN) Atlas Kubernetes Operator devuelve sus credenciales JWT de OIDC para la cuenta de servicio del sistema.
Asegúrese de que la autenticación OIDC se ejecute correctamente para la cuenta de servicio predeterminada:
export TEST_JWT_TOKEN=$(kubectl -n default create token default --audience "vault") vault write auth/jwt-kube01/login role=jwt-kube01-default jwt=$(TEST_JWT_TOKEN) Atlas Kubernetes Operator devuelve sus credenciales JWT de OIDC para la cuenta de servicio predeterminada.
Para configurar la autenticación de Kubernetes:
Ejecute el siguiente comando para habilitar la autenticación de Kubernetes en la ruta de montaje. Si configura varios clústeres de Kubernetes, debe habilitar la autenticación de Kubernetes en la ruta de montaje de cada clúster.
vault auth enable -path=jwt-kube01 kubernetes Cuando se instala con Helm, se configura automáticamente la vinculación de roles del clúster.
Cree políticas que permitan el acceso a los secretos que desea exponer al clúster.
El siguiente ejemplo crea la política
vault-secretutilizada en pasos posteriores. Utilizavault, un secreto de Kubernetes vinculado a la cuenta de servicio HashiCorp Vault que configura el proveedor Helm Chart CSI.echo vault-secret.yaml apiVersion: v1 kind: Secret metadata: name: vault annotations: kubernetes.io/service-account.name: vault type: kubernetes.io/service-account-token $ kubectl apply -f vault-secret.yaml Ejecute los comandos para confiar en el clúster de Kubernetes y usar la autenticación de Kubernetes:
export VAULT_JWT ?= $(shell kubectl get secret/vault -o jsonpath='{.data.token}' |base64 -d) vault write auth/k8s-kube01/config kubernetes_host="kube01.internal.io" token_reviewer_jwt=$(VAULT_JWT) Ejecute el comando para crear un rol de HashiCorp Vault y vincular una cuenta de servicio de Kubernetes al rol, lo que restringe el acceso de la cuenta de servicio dentro de HashiCorp Vault.
El siguiente comando crea el rol
k8s-kube01enauth/k8s-kube01vinculado a la cuenta de servicio de Kubernetes en los namespacesdefaultomongodb-atlas-system. Este rol está vinculado a la política de permisos desecrets-storeen HashiCorp Vault.vault write auth/k8s-kube01/role/k8s-kube01-role \ bound_service_account_names=default,mongodb-atlas-operator \ bound_service_account_namespaces=default,mongodb-atlas-system \ policies=secrets-store Las políticas deben existir y permitir el acceso a los secretos. El siguiente ejemplo de política permite el acceso a los secretos KV v2 en la ruta
kube01/secrets-store:path "secret/data/kube01/secrets-store/*" { capabilities = ["read"] } Asegúrese de que la autenticación de Kubernetes se ejecute correctamente para la cuenta de servicio del sistema:
export TEST_JWT_TOKEN=$( kubectl create -n mongodb-atlas-system token mongodb-atlas-operator) vault write auth/jwt-kube01/login role=jwt-kube01-system jwt=$(TEST_JWT_TOKEN) Asegúrese de que la autenticación de Kubernetes se ejecute correctamente para la cuenta predeterminada:
export TEST_JWT_TOKEN=$(kubectl -n default create token default) vault write auth/jwt-kube01/login role=jwt-kube01-default jwt=$(TEST_JWT_TOKEN)
Configura el provisionamineto automático de secretos.
Para aprovisionar secretos con el operador de secretos externos:
Implemente el recurso personalizado
SecretStorepara la cuenta de serviciodefaulten el espacio de nombresmongodb-atlas-system:$ cat external-secrets/vault-system.yaml apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: vault-store namespace: mongodb-atlas-system spec: provider: vault: server: "https://vault.internal.io" path: "secret" version: "v2" auth: jwt: path: "jwt-kube01" role: "jwt-kube01-system" kubernetesServiceAccountToken: expirationSeconds: 600 serviceAccountRef: name: "default" audiences: - vault $ kubectl apply -f external-secrets/vault-system.yaml Implemente el recurso personalizado
SecretStorepara la cuenta de serviciodefaulten el espacio de nombresdefault:$ cat external-secrets/vault-default.yaml apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: vault-store namespace: default spec: provider: vault: server: "https://vault.internal.io" path: "secret" version: "v2" auth: jwt: path: "jwt-kube01" role: "jwt-role" kubernetesServiceAccountToken: expirationSeconds: 600 serviceAccountRef: name: "default" audiences: - vault $ kubectl apply -f external-secrets/vault-default.yaml Implemente el recurso personalizado
ExternalSecretque hace referencia al secreto que contiene la clave API. Debe establecerspec.target.template.metadata.labelsenatlas.mongodb.com/typecon el valorcredentialspara que el operador de Kubernetes de Atlas encuentre el secreto creado por el operador de secretos externos.Antes de ejecutar el siguiente comando, asegúrese de que HashiCorp Vault tenga el secreto rellenado en la ruta Kv V2
secret/data/kube01/external-secrets/atlas-accountcon las siguientes propiedades:orgIdpublicApiKeyprivateApiKey
$ cat external-secrets/atlas.yaml apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: atlas namespace: mongodb-atlas-system spec: refreshInterval: "15s" secretStoreRef: name: vault-store kind: SecretStore target: name: mongodb-atlas-operator-api-key template: metadata: labels: atlas.mongodb.com/type: credentials data: - secretKey: orgId remoteRef: key: secret/data/kube01/external-secrets/atlas-account property: orgId - secretKey: publicApiKey remoteRef: key: secret/data/kube01/external-secrets/atlas-account property: publicApiKey - secretKey: privateApiKey remoteRef: key: secret/data/kube01/external-secrets/atlas-account property: privateApiKey $ kubectl apply -f external-secrets/atlas.yaml Este comando crea el secreto
mongodb-atlas-operator-api-keyde Kubernetes en el namespacemongodb-atlas-system.Implemente el recurso personalizado
ExternalSecretque hace referencia al secreto que contiene las credenciales de usuario de la base de datos. Debe establecerspec.target.template.metadata.labelsenatlas.mongodb.com/typecon el valorcredentialspara que el operador de Kubernetes de Atlas encuentre el secreto creado por el operador de secretos externos.Antes de ejecutar el siguiente comando, asegúrese de que HashiCorp Vault tenga el secreto rellenado en la ruta Kv V2
secret/data/kube01/external-secrets/db-usercon lapasswordpropiedad.$ cat external-secrets/dbuser.yaml apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: dbuser namespace: default spec: refreshInterval: "15s" secretStoreRef: name: vault-store kind: SecretStore target: name: dbuser-password template: metadata: labels: atlas.mongodb.com/type: credentials data: - secretKey: password remoteRef: key: secret/data/kube01/external-secrets/db-user property: password $ kubectl apply -f external-secrets/atlas.yaml Asegúrese de que los secretos regresen como se espera cuando ejecute los siguientes comandos:
$ kubectl get -n mongodb-atlas-system secrets/mongodb-atlas-operator-api-key $ kubectl get -n default secrets/dbuser-password
Para aprovisionar secretos con Secrets Store CSI:
Implemente el recurso personalizado
SecretProviderClassen el espacio de nombresmongodb-atlas-system. Debe establecerspec.secretObjects.labelsenatlas.mongodb.com/typecon el valorcredentialspara que Atlas Kubernetes Operator encuentre el secreto que crea Secrets Store CSI.Antes de ejecutar el siguiente comando, asegúrese de que HashiCorp Vault tenga el secreto rellenado en la ruta Kv V2
secret/data/kube01/external-secrets/atlas-accountcon las siguientes propiedades:orgIdpublicApiKeyprivateApiKey
$ cat secrets-store/atlas.yaml apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: atlas namespace: mongodb-atlas-system spec: provider: vault secretObjects: - data: - key: orgId objectName: atlas-org - key: publicApiKey objectName: atlas-pub-key - key: privateApiKey objectName: atlas-secret-key secretName: mongodb-atlas-operator-api-key type: Opaque labels: atlas.mongodb.com/type: credentials parameters: vaultAddress: https://vault.internal.io vaultKubernetesMountPath: k8s-kube01 roleName: k8s-kube01-role objects: | - objectName: atlas-org secretPath: secret/data/kube01/secrets-store/atlas-account secretKey: orgId - objectName: atlas-pub-key secretPath: secret/data/kube01/secrets-store/atlas-account secretKey: publicApiKey - objectName: atlas-secret-key secretPath: secret/data/kube01/secrets-store/atlas-account secretKey: privateApiKey $ kubectl apply -f secrets-store/atlas.yaml Este comando crea el secreto
mongodb-atlas-operator-api-keyde Kubernetes en el namespacemongodb-atlas-system.Ejecute el siguiente comando para agregar un pod que monte los secretos requeridos:
$ cat secrets-store/ako-patch.yaml template: spec: containers: - name: system-secret-placeholder image: mongodb/atlas command: ["sleep", "infinity"] volumeMounts: - name: secrets-store-mount mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: secrets-store-mount csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: atlas $ kubectl apply -f secrets-store/ako-patch.yaml Implemente el recurso personalizado
SecretProviderClassque hace referencia al secreto que contiene las credenciales de usuario de la base de datos. Debe establecerspec.target.template.metadata.labelsenatlas.mongodb.com/typecon el valorcredentialspara que el operador de Kubernetes de Atlas encuentre el secreto que crea el CSI del almacén de secretos.Antes de ejecutar el siguiente comando, asegúrese de que HashiCorp Vault tenga el secreto rellenado en la ruta Kv V2
secret/data/kube01/external-secrets/db-usercon lapasswordpropiedad.$ cat external-secrets/dbuser.yaml apiVersion: external-secrets.io/v1beta1 kind: SecretProviderClass metadata: name: dbuser namespace: default spec: provider: vault secretObjects: - data: - key: password objectName: dbuser secretName: dbuser-password type: Opaque labels: atlas.mongodb.com/type: credentials parameters: vaultAddress: https://vault.internal.io vaultKubernetesMountPath: k8s-kube01 roleName: k8s-kube01-role objects: | - objectName: "dbuser" secretPath: "secret/data/kube01/secrets-store/db-user" secretKey: "password" $ kubectl apply -f secrets-store/dbuser.yaml Ejecute el siguiente comando para crear el pod centinela
secret-placeholder, que garantiza que el controlador CSI de Secrets Store obtenga las credencialesdbusery las sincronice con Kubernetes:$ cat secrets-store/placeholder.yaml kind: Pod apiVersion: v1 metadata: name: secret-placeholder spec: containers: - image: mongodb/atlas command: ["sleep", "infinity"] name: secret-placeholder volumeMounts: - name: secrets-store-mount mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: secrets-store-mount csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: dbuser $ kubectl apply -f secrets-store/placeholder.yaml Asegúrese de que los secretos regresen como se espera cuando ejecute los siguientes comandos:
$ kubectl get -n mongodb-atlas-system secrets/mongodb-atlas-operator-api-key $ kubectl get -n default secrets/dbuser-password
Implemente recursos personalizados de Atlas Kubernetes Operator.
Ahora puede implementar recursos personalizados de Atlas Kubernetes Operator. Atlas Kubernetes Operator se autentica con los secretos de Kubernetes que hacen referencia a su almacén de HashiCorp. Ajuste los timeout valores según sea necesario para sus implementaciones.
kubectl apply -f ako/project.yaml kubectl apply -f ako/deployment.yaml kubectl apply -f ako/user.yaml kubectl wait --for=condition=ready atlasdeployment/serverless-deployment --timeout=10m kubectl wait --for=condition=ready atlasdatabaseuser/user --timeout=10m
Para obtener más información sobre estos recursos personalizados, consulte Recursos personalizados.
Pruebe su implementación de Atlas Kubernetes Operator.
Para probar tu implementación del Atlas Kubernetes Operator, ejecuta el siguiente comando:
export ATLAS_DEPLOYMENT_CONN_STR=$(kubectl get secrets/test-atlas-operator-project-test-serverless-deployment-dbuser -o jsonpath='{.data.connectionStringStandardSrv}' |base64 -d) mongosh $(ATLAS_DEPLOYMENT_CONN_STR) --apiVersion 1 --eval "show dbs"
Atlas Kubernetes Operator devuelve una lista de sus implementaciones de base de datos.