Puedes elegir dónde almacenan la información sensible los componentes que gestiona Atlas Kubernetes Operator, pero Atlas Kubernetes Operator debe encontrar Kubernetes Secretos lo espera. Puede almacenar secretos para Atlas Kubernetes Operator de varias maneras, incluidos los siguientes métodos:
Coloca información sensible directamente en secretos de Kubernetes secrets. Todos los tutoriales en la documentación del Atlas Kubernetes Operator utilizan secreto de Kubernetes por defecto. Para usar secretos de Kubernetes, sigue 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.
Coloque información confidencial en una herramienta externa de almacenamiento de secretos, como HashiCorp Vault o soluciones nativas de gestión de secretos de Hyperscalers. Una herramienta intermediaria de aprovisionamiento secreto obtiene información confidencial del almacenamiento externo de secretos y crea secretos de Kubernetes a partir de la información confidencial. Para obtener más información sobre la herramienta de provisionamineto secreto, consulta Consideraciones.
Este tutorial configura una herramienta externa de almacenamiento de secretos para usar con Atlas Kubernetes Operator. Este tutorial se centra en configuraciones "sin secretos" que no requieren que el Atlas Kubernetes Operator cree y almacene un secreto para aprovisionar secretos en su clúster de Kubernetes.
Considerations
El siguiente tutorial instala o configura las siguientes herramientas y opciones:
Una herramienta de provisionamineto secreta. La herramienta de aprovisionamiento de secretos utiliza uno o más mecanismos de autenticación para recuperar las credenciales del servicio de gestión de secretos y crear secretos que el Atlas Kubernetes Operator puede utilizar. Este tutorial instala una de las siguientes herramientas de provisionamineto de secretos de código abierto:
Autenticación para acceder a los secretos. Puedes usar diferentes métodos para autenticar las cuentas de servicio y los espacios de nombres que pueden acceder a secretos en HashiCorp Vault:
Para el External Secrets Operator, este tutorial utiliza OIDC JSON web token authentication. Para obtener más información, consulte autenticación JWT/OIDC.
Para Secrets Store CSI Driver, este tutorial utiliza la autenticación de Kubernetes.
Alternativamente, el KMS de tu proveedor de nube puede utilizar sistemas nativos de IAM para proporcionar esta autenticación, que no está cubierta en este tutorial. Para saber cómo configurar el KMS de tu 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, necesita las siguientes herramientas y configuraciones:
Cuentas de servicio en ejecución para Kubernetes, Atlas Kubernetes Operator y Atlas y privilegios suficientes para configurarlas.
Se necesita un clúster de Kubernetes en funcionamiento 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 por defecto (443).Puedes acceder al proyecto Atlas Kubernetes Operator en GitHub:
Para instalar el operador Atlas Kubernetes utilizando Atlas CLI, ejecuta 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 Atlas Kubernetes Operator, ejecuta el siguiente comando. Reemplazar
<version>por la última versión número de versión.kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-atlas-kubernetes/<version>/deploy/all-in-one.yaml Para registrarte en un cuenta de Atlas, consulta Crea una cuenta de Atlas.
Claves API. Debe crear una clave API y configurar el API Access List.
Necesita la siguiente llave pública de API, llave privada de API y la información del Identificador de la Organización para configurar el acceso de Atlas Kubernetes Operator a Atlas.
Si deseas que el Atlas Kubernetes Operator cree un nuevo Proyecto de Atlas, otorga acceso programático a una organización. Si tu organización requiere una lista de acceso IP para la API de administración de Atlas, también deberás configurar la lista de acceso a la API.
Importante
Debes asignar a la clave API el rol organizacional Organization Project Creator o superior.
Si deseas trabajar con un proyecto Atlas existente, Añadir acceso al proyecto desde un proyecto. Si tu organización requiere una lista de acceso IP para la API de Administración de Atlas, también debes configurar la lista de acceso a la API.
Importante
Debe asignar al clave API el rol de proyecto Project Owner.
Una bóveda de almacenamiento secreta. Este tutorial utiliza HashiCorp Vault, que es un servicio externo para el almacenamiento de secretos, ejecutándose en
https://vault.internal.io.Puedes usar otros almacenes de almacenamiento secreto con Atlas Kubernetes Operator según sea necesario, incluido el Cloud KMS de AWS, Azure y Google.
Solo acceso interno. Para evitar exponer información sensible a través de internet pública, los siguientes componentes de la solución de almacenamiento de secretos permiten solo el acceso interno:
El HashiCorp Vault o servicio KMS.
El servicio de APIs de clúster de Kubernetes.
La red interna. Este tutorial usa
internal.io.
Mientras que los componentes anteriores solo permiten el acceso interno, permiten el acceso entre sí y permiten el acceso a cualquier persona dentro de tu equipo u organización. Esta es una de las mejores prácticas para la seguridad.
Autoridades certificadoras (AC) públicas. Puedes utilizar autoridades de certificación públicas para evitar gestionar y distribuir certificados raíz de autoridades de certificación personalizados.
Puede automatizar la gestión y renovación de los certificados CA utilizando cualquiera de las siguientes herramientas:
En este tutorial:
Todos los
internal.ioservicios HTTPs son direcciones internas, pero sus sitios HTTPS presentan certificados firmados por una Autoridad Certificadora (CA) pública, renovados automáticamente.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 provisionamiento extra de certificados.
Procedimiento
Siga estos pasos para configurar el almacenamiento de secretos para Atlas Kubernetes Operator.
Instalar la herramienta secreta de provisionamineto en el clúster objetivo.
Seleccione una herramienta secreta de provisionamineto 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 Secrets Almacenar CSI Driver como la herramienta de provisionamineto de secretos, sigue 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 Ejecuta el siguiente comando para instalar el complemento de Secrets Store CSI HashiCorp Vault con Helm Charts. No es necesario instalar el servidor o el inyector de secretos HashiCorp Vault.
helm install vault hashicorp/vault \ --set "server.enabled=false" --set "injector.enabled=false" \ --set "csi.enabled=true" Asegúrate de que Secrets Almacén 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úrate de que el proveedor CSI HashiCorp Vault funcione 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
Configura la autenticación para acceder a los secretos.
Para configurar la autenticación OIDC JWT y Kubernetes:
Ejecute el siguiente comando para habilitar la autenticación OIDC JWT para la ruta de montaje. Si se configuran varios clústeres de Kubernetes, se debe habilitar la autenticación OIDC JWT 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 clúster
kube01.internal.io:$ kubectl create clusterrolebinding oidc-reviewer \ --clusterrole=system:service-account-issuer-discovery \ --group=system:unauthenticated Ejecuta 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 el URL en el documento de descubrimiento OIDC en.well-known/openid-configuration.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 se especifica en pasos posteriores.echo external-secrets-policy.hcl path "secret/data/kube01/external-secrets/*" { capabilities = ["read"] } Ejecuta el comando para crear un rol de HashiCorp Vault y enlazar una cuenta de servicio de Kubernetes a este rol, lo que restringe el acceso de la cuenta de servicio dentro del HashiCorp Vault.
El siguiente comando crea el rol
jwt-kube01-systempara el públicovaultdel tipo JWT (OIDC). El comando especifica la reclamación de usuariosub, y la cuenta de servicio de Kubernetesdefaulten el namespacemongodb-atlas-systemcomo el sujeto vinculado. Este comando vincula el rol al conjunto de permisos de la políticaexternal-secretsdentro 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 rol
jwt-kube01-defaultpara el públicovaultdel tipo JWT (OIDC). Este comando especifica el reclamo de usuariosuby la cuenta de servicio de Kubernetesdefaulten el namespacedefaultcomo el sujeto vinculado. Este comando vincula el rol al conjunto de permisos de la políticaexternal-secretsdentro 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úrate 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 las credenciales OIDC JWT de la cuenta de servicio del sistema.
Asegúrese de que la autenticación OIDC se ejecute correctamente para la cuenta de servicio por defecto:
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 tus credenciales OIDC JWT para la cuenta de servicio por defecto.
Para configurar la autenticación de Kubernetes:
Ejecute el siguiente comando para habilitar la autenticación de Kubernetes para la ruta de montaje. Si configura varios clústeres de Kubernetes, debe habilitar la autenticación de Kubernetes para la ruta de montaje de cada clúster.
vault auth enable -path=jwt-kube01 kubernetes Cuando instalas con Helm, configura automáticamente la vinculación de roles del clúster.
Crea directivas que permitan el acceso a los secretos que deseas 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 Ejecuta los comandos para confiar en el clúster de Kubernetes y utilizar 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) Ejecuta el comando para crear un rol de HashiCorp Vault y enlazar una cuenta de servicio de Kubernetes a este rol, lo que restringe el acceso de la cuenta de servicio dentro del 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 secretos de KV v2 bajo la ruta
kube01/secrets-store:path "secret/data/kube01/secrets-store/*" { capabilities = ["read"] } Asegura 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) Garantizar que la autenticación de Kubernetes se ejecute correctamente para la cuenta por defecto:
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 External Secrets Operator:
Implementa 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 Implementa 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 Despliegue 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 Atlas Kubernetes Operator pueda hallar el secreto que crea External Secrets operador.Antes de ejecutar el siguiente comando, asegúrese de que HashiCorp Vault tenga el secreto poblado 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 referencia el secreto que contiene las credenciales de usuario de base de datos. Debes configurarspec.target.template.metadata.labelsenatlas.mongodb.com/typecon el valorcredentialspara que el Atlas Kubernetes Operator pueda encontrar el secreto que crea el External Secrets Operator.Antes de ejecutar el siguiente comando, asegura que HashiCorp Vault tiene el secreto poblado en la ruta Kv V2
secret/data/kube01/external-secrets/db-usercon la propiedadpassword.$ 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úrate de que los secretos se devuelvan como se espera cuando ejecutes 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:
Despliegue el recurso personalizado
SecretProviderClassen el namespacemongodb-atlas-system. Debe configurarspec.secretObjects.labelsenatlas.mongodb.com/typecon el valorcredentialspara que Atlas Kubernetes Operator encuentre el secreto que Secrets Store CSI crea.Antes de ejecutar el siguiente comando, asegúrese de que HashiCorp Vault tenga el secreto poblado 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.Ejecuta 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 referencia el secreto que contiene las credenciales de usuario de base de datos. Debe establecerspec.target.template.metadata.labelsenatlas.mongodb.com/typecon el valorcredentialspara que el Atlas Kubernetes Operator encuentre el secreto que crea el Secrets Store CSI.Antes de ejecutar el siguiente comando, asegura que HashiCorp Vault tiene el secreto poblado en la ruta Kv V2
secret/data/kube01/external-secrets/db-usercon la propiedadpassword.$ 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, el cual asegura que el driver Secrets Store CSI obtenga las credenciales dedbusery 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úrate de que los secretos se devuelvan como se espera cuando ejecutes 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 del Atlas Kubernetes Operator.
Ahora puede implementar recursos personalizados de Atlas Kubernetes Operator. Atlas Kubernetes Operator se autentica con el secreto de Kubernetes que hacen referencia a su HashiCorp Vault. Ajusta los valores timeout según sea necesario para tus 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, consulta Recursos personalizados.
Prueba tu implementación del 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 tus implementaciones de la base de datos.