En este instructivo, se muestra cómo almacenar los datos sensibles que usan tus clústeres de Google Kubernetes Engine (GKE) en Secret Manager. Aprenderás a acceder a los datos desde tus Pods de forma más segura con la federación de identidades para cargas de trabajo para GKE y lasGoogle Cloud bibliotecas cliente.
Almacenar los datos sensibles fuera del almacenamiento de tu clúster reduce el riesgo de acceso no autorizado a los datos si se produce un ataque. Usar la federación de identidades para cargas de trabajo para GKE para acceder a los datos te permite evitar los riesgos asociados con la administración de claves de cuentas de servicio de larga duración y te permite controlar el acceso a tus Secrets mediante Identity and Access Management (IAM) en lugar de reglas de RBAC en el clúster. Puedes usar cualquier proveedor de almacén de Secrets externo, como Secret Manager o HashiCorp Vault.
Esta página está dirigida a los especialistas en seguridad que desean mover datos sensibles fuera del almacenamiento dentro del clúster. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que hacemos referencia en el contenido de Google Cloud , consulta Roles y tareas comunes del usuario de GKE.
En este instructivo, se usa un clúster de GKE Autopilot. Para realizar los pasos con GKE Standard, debes habilitar la federación de identidades para cargas de trabajo para GKE de forma manual.
Puedes usar la federación de identidades para cargas de trabajo para GKE para acceder a cualquier Google Cloud API desde cargas de trabajo de GKE sin tener que usar enfoques menos seguros, como los archivos de claves de cuentas de servicio estáticos. En este instructivo, se usa Secret Manager como ejemplo, pero puedes seguir los mismos pasos para acceder a otras APIs de Google Cloud. Si deseas obtener más información, consulta Federación de identidades para cargas de trabajo para GKE.
Objetivos
- Crea un secreto en Google Cloud Secret Manager.
- Crear un clúster de Autopilot de GKE, espacios de nombres de Kubernetes y cuentas de servicio de Kubernetes.
- Crea políticas de permisos de IAM para otorgar acceso a tus cuentas de servicio de Kubernetes en el secreto.
- Usar aplicaciones de prueba para verificar el acceso de la cuenta de servicio.
- Ejecutar una app de muestra que acceda al Secret con la API de Secret Manager.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto,
usa la calculadora de precios.
Cuando completes las tareas que se describen en este documento, podrás borrar los recursos que creaste para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.
Antes de comenzar
- Accede a tu cuenta de Google Cloud . Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
-
Instala Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Crea o selecciona un Google Cloud proyecto.
Roles necesarios para seleccionar o crear un proyecto
- Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
-
Crear un proyecto: Para crear un proyecto, necesitas el rol de Creador de proyectos (
roles/resourcemanager.projectCreator), que contiene el permisoresourcemanager.projects.create. Obtén más información para otorgar roles.
-
Crea un proyecto de Google Cloud :
gcloud projects create PROJECT_ID
Reemplaza
PROJECT_IDpor un nombre para el proyecto Google Cloud que estás creando. -
Selecciona el proyecto Google Cloud que creaste:
gcloud config set project PROJECT_ID
Reemplaza
PROJECT_IDpor el nombre de tu Google Cloud proyecto.
-
Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .
Habilita las APIs de Kubernetes Engine y Secret Manager:
Roles necesarios para habilitar las APIs
Para habilitar las APIs, necesitas el rol de IAM de administrador de Service Usage (
roles/serviceusage.serviceUsageAdmin), que contiene el permisoserviceusage.services.enable. Obtén más información para otorgar roles.gcloud services enable container.googleapis.com
secretmanager.googleapis.com -
Instala Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Crea o selecciona un Google Cloud proyecto.
Roles necesarios para seleccionar o crear un proyecto
- Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
-
Crear un proyecto: Para crear un proyecto, necesitas el rol de Creador de proyectos (
roles/resourcemanager.projectCreator), que contiene el permisoresourcemanager.projects.create. Obtén más información para otorgar roles.
-
Crea un proyecto de Google Cloud :
gcloud projects create PROJECT_ID
Reemplaza
PROJECT_IDpor un nombre para el proyecto Google Cloud que estás creando. -
Selecciona el proyecto Google Cloud que creaste:
gcloud config set project PROJECT_ID
Reemplaza
PROJECT_IDpor el nombre de tu Google Cloud proyecto.
-
Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .
Habilita las APIs de Kubernetes Engine y Secret Manager:
Roles necesarios para habilitar las APIs
Para habilitar las APIs, necesitas el rol de IAM de administrador de Service Usage (
roles/serviceusage.serviceUsageAdmin), que contiene el permisoserviceusage.services.enable. Obtén más información para otorgar roles.gcloud services enable container.googleapis.com
secretmanager.googleapis.com -
Otorga roles a tu cuenta de usuario. Ejecuta el siguiente comando una vez para cada uno de los siguientes roles de IAM:
roles/secretmanager.admin, roles/container.clusterAdmingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Reemplaza lo siguiente:
PROJECT_ID: ID del proyectoUSER_IDENTIFIER: Es el identificador de tu cuenta de usuario de . Por ejemplo,myemail@example.com.ROLE: Es el rol de IAM que otorgas a tu cuenta de usuario.
Prepare el entorno
Clona el repositorio de GitHub que contiene los archivos de muestra para este instructivo:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd ~/kubernetes-engine-samples/security/wi-secrets
Crea un Secret en Secret Manager
En el siguiente ejemplo, se muestran los datos que usarás para crear un Secret:
Crea un Secret para almacenar los datos de muestra:
gcloud secrets create bq-readonly-key \ --data-file=manifests/bq-readonly-key \ --ttl=3600sEste comando realiza las siguientes acciones:
- Crea un nuevo Secret de Secret Manager con la clave de muestra en la región
us-central1Google Cloud . - Configura el Secret para que venza una hora después de ejecutar el comando.
- Crea un nuevo Secret de Secret Manager con la clave de muestra en la región
Crea el clúster y los recursos de Kubernetes
Crea un clúster de GKE, espacios de nombres de Kubernetes y cuentas de servicio de Kubernetes. Deberás crear dos espacios de nombres, uno para el acceso de solo lectura y otro para el acceso de lectura y escritura al Secret. También deberás crear una cuenta de servicio de Kubernetes en cada espacio de nombres a fin de usarla con la federación de identidades para cargas de trabajo para GKE.
Crea un clúster de GKE Autopilot:
gcloud container clusters create-auto secret-cluster \ --location=us-central1La implementación del clúster puede tomar unos cinco minutos. Los clústeres de Autopilot siempre tienen habilitada la federación de identidades para cargas de trabajo para GKE. Si, en cambio, deseas usar un clúster de GKE Standard, debes habilitar de forma manual la federación de identidades para cargas de trabajo para GKE antes de continuar.
Crea un espacio de nombres
readonly-nsy un espacio de nombresadmin-ns:kubectl create namespace readonly-ns kubectl create namespace admin-nsCrea una cuenta de servicio de Kubernetes
readonly-say una cuenta de servicio de Kubernetesadmin-sa:kubectl create serviceaccount readonly-sa --namespace=readonly-ns kubectl create serviceaccount admin-sa --namespace=admin-ns
Crea políticas de permisos de IAM
Otorga a la cuenta de servicio
readonly-saacceso de solo lectura al Secret:gcloud secrets add-iam-policy-binding bq-readonly-key \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/readonly-ns/sa/readonly-sa \ --role='roles/secretmanager.secretAccessor' \ --condition=NoneReemplaza lo siguiente:
PROJECT_NUMBER: Es el número de proyecto numérico de Google Cloud.PROJECT_ID: Es el ID del proyecto de Google Cloud .
Otorga a la cuenta de servicio
admin-saacceso de lectura y escritura al Secret:gcloud secrets add-iam-policy-binding bq-readonly-key \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/admin-ns/sa/admin-sa \ --role='roles/secretmanager.secretAccessor' \ --condition=None gcloud secrets add-iam-policy-binding bq-readonly-key \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/admin-ns/sa/admin-sa \ --role='roles/secretmanager.secretVersionAdder' \ --condition=None
Verifica el acceso al Secret
Implementa Pods de prueba en cada espacio de nombres para verificar el acceso de solo lectura y el de lectura y escritura.
Revisa el manifiesto del Pod de solo lectura:
Este pod usa la cuenta de servicio
readonly-saen el espacio de nombresreadonly-ns.Revisa el manifiesto del Pod de lectura y escritura:
Este pod usa la cuenta de servicio
admin-saen el espacio de nombresadmin-ns.Implementa los Pods de prueba:
kubectl apply -f manifests/admin-pod.yaml kubectl apply -f manifests/readonly-pod.yamlLos Pods pueden tardar unos minutos en comenzar a ejecutarse. Para supervisar el progreso, ejecuta el siguiente comando:
watch kubectl get pods -n readonly-nsCuando el estado del Pod cambie a
RUNNING, presionaCtrl+Cpara volver a la línea de comandos.
Prueba el acceso de solo lectura
Abre una shell en el Pod
readonly-test:kubectl exec -it readonly-test --namespace=readonly-ns -- /bin/bashIntenta leer el Secret:
gcloud secrets versions access 1 --secret=bq-readonly-keyEl resultado es
key=my-api-key.Intenta escribir datos nuevos en el Secret:
printf "my-second-api-key" | gcloud secrets versions add bq-readonly-key --data-file=-El resultado es similar a este:
ERROR: (gcloud.secrets.versions.add) PERMISSION_DENIED: Permission 'secretmanager.versions.add' denied for resource 'projects/PROJECT_ID/secrets/bq-readonly-key' (or it may not exist).El pod que usa la cuenta de servicio de solo lectura solo puede leer el Secret y no puede escribir datos nuevos.
Sal del pod:
exit
Prueba el acceso de lectura y escritura
Abre una shell en el Pod
admin-test:kubectl exec -it admin-test --namespace=admin-ns -- /bin/bashIntenta leer el Secret:
gcloud secrets versions access 1 --secret=bq-readonly-keyEl resultado es
key=my-api-key.Intenta escribir datos nuevos en el Secret:
printf "my-second-api-key" | gcloud secrets versions add bq-readonly-key --data-file=-El resultado es similar a este:
Created version [2] of the secret [bq-readonly-key].Lee la versión nueva del Secret:
gcloud secrets versions access 2 --secret=bq-readonly-keyEl resultado es
my-second-api-key.Sal del pod:
exit
Los pods solo obtienen el nivel de acceso que otorgaste a la cuenta de servicio de Kubernetes
que se usó en el manifiesto del pod. Cualquier pod que use la cuenta de Kubernetes admin-sa
en el espacio de nombres admin-ns puede escribir versiones nuevas del
Secret, pero cualquier pod en el espacio de nombres readonly-ns que use la cuenta de servicio de Kubernetes readonly-sa
solo puede leer el Secret.
Accede a los Secrets desde tu código
En esta sección, harás lo siguiente:
Implementa una aplicación de muestra que lea tu Secret en Secret Manager mediante bibliotecas cliente.
Verifica que la aplicación pueda acceder a tu Secret.
Debes acceder a los Secrets de Secret Manager desde el código de tu aplicación siempre que sea posible mediante la API de Secret Manager.
Revisa el código fuente de la aplicación de muestra:
Esta aplicación llama a la API de Secret Manager para intentar leer el Secret.
Revisa el manifiesto del Pod de la aplicación de muestra:
Este manifiesto hace lo siguiente:
- Crea un Pod en el espacio de nombres
readonly-nsque usa la cuenta de servicioreadonly-sa. - Extrae una aplicación de muestra de un registro de imágenes de Google. Esta aplicación llama a la API de Secret Manager con lasGoogle Cloud bibliotecas cliente. Puedes ver el código de la aplicación en
/main.goen el repositorio. - Configura las variables de entorno para que use la aplicación de muestra.
- Crea un Pod en el espacio de nombres
Reemplaza las variables de entorno en la aplicación de muestra:
sed -i "s/YOUR_PROJECT_ID/PROJECT_ID/g" "manifests/secret-app.yaml"Implementa la app de muestra:
kubectl apply -f manifests/secret-app.yamlEs posible que el Pod tarde unos minutos en comenzar a trabajar. Si el Pod necesita un nodo nuevo en tu clúster, es posible que notes eventos de tipo
CrashLoopBackOffmientras a través de GKE se proporciona el nodo. Las fallas se detienen cuando el nodo aprovisiona correctamente.Verifica el acceso al Secret:
kubectl logs readonly-secret-test -n readonly-nsEl resultado es
my-second-api-key. Si el resultado está en blanco, es posible que el Pod aún no se esté ejecutando. Espere unos minutos y vuelva a intentarlo.
Enfoques alternativos
Si necesitas activar tus datos sensibles en tus Pods, usa el complemento de Secret Manager para GKE. Este complemento implementa y administra el proveedor de Google Cloud Secret Manager para el controlador de CSI de Kubernetes Secret Store en tus clústeres de GKE. Para obtener instrucciones, consulta Usa el complemento de Secret Manager con GKE.
Proporcionar Secrets como volúmenes activados tiene los siguientes riesgos:
- Los volúmenes activados son susceptibles a los ataques de recorrido del directorio.
- Las variables de entorno pueden verse comprometidas debido a configuraciones incorrectas, como cuando se abre un extremo de depuración.
Siempre que sea posible, te recomendamos que accedas a los Secrets de manera programática a través de la API de Secret Manager. Para obtener instrucciones, usa la aplicación de muestra de este instructivo o consulta Bibliotecas cliente de Secret Manager.
Realiza una limpieza
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra los recursos individuales
Borra el clúster:
gcloud container clusters delete secret-cluster \ --location=us-central1Opcional: borra el Secret en Secret Manager.
gcloud secrets delete bq-readonly-keySi no realizas este paso, el Secret vencerá automáticamente porque configuraste la marca
--ttldurante su creación.
Borra el proyecto
Borra un Google Cloud proyecto:
gcloud projects delete PROJECT_ID
¿Qué sigue?
- Obtén información para autenticarte en las Google Cloud APIs desde cargas de trabajo de GKE.
- Obtén más información para encriptar Secrets en la capa de la aplicación.
- Obtén más información sobre la federación de identidades para cargas de trabajo para GKE.
- Obtén más información para instalar kubectl y configurar el acceso al clúster.
- Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.