Proteja secretos para aplicaciones que se ejecutan en el clúster de Kubernetes
En esta guía de aprendizaje, aprenderá a utilizar IBM Cloud® Secrets Manager para gestionar secretos para aplicaciones que ejecutan el clúster IBM Cloud Kubernetes Service utilizando la herramienta de código abierto External Secrets Operator.
De forma alternativa, puede utilizar el plugin de CLI Kubernetes Service para gestionar secretos TLS y no TLS. Para obtener más información sobre este enfoque, consulte Configuración de Kubernetes Ingress.
Eres desarrollador en una organización y tu equipo utiliza Kubernetes Service para implementar aplicaciones y servicios en contenedores en IBM Cloud. En su flujo actual, utiliza Secretos de Kubernetes s para almacenar los datos confidenciales, como contraseñas y claves API, que utilizan las aplicaciones y los servicios que se ejecutan en su clúster. Para tener más control sobre los secretos de la aplicación, desea la posibilidad de almacenar sus secretos de clúster en un servicio de gestión de secretos externo, donde puede cifrarlos en reposo, supervisar su actividad y gestionarlos fácilmente.
Con Secrets Manager, puede centralizar y proteger los secretos que utilizan las aplicaciones que se ejecutan en los clústeres de Kubernetes. En lugar de inyectar sus secretos en el momento del despliegue, puede configurar sus aplicaciones para recuperar secretos de Secrets Manager en tiempo de ejecución. Cuando es hora de rotar el secreto, puedes hacerlo desde Secrets Manager. Por ejemplo, considere el siguiente escenario:
- Como desarrollador, utilice Secrets Manager para almacenar un secreto para una aplicación que desea desplegar en un clúster de Kubernetes.
- Secrets Manager proporciona un ID para el secreto. Debe incluir el ID en el archivo de configuración de
ExternalSecrets
para la aplicación y aplicar la configuración al clúster. - El controlador de secretos externos capta los objetos
ExternalSecrets
del archivo de configuración que ha definido utilizando la API de Kubernetes. - Durante el tiempo de ejecución de la aplicación, el controlador recupera los datos de los secretos de Secrets Manager y convierte los objetos
ExternalSecrets
en secretos de Kubernetes para el clúster.
Este caso de ejemplo presenta una herramienta de terceros que puede afectar a la capacidad de conformidad de las cargas de trabajo que se ejecutan en el clúster de Kubernetes. Si agrega una herramienta de terceros o de la comunidad, tenga en cuenta que es responsable de mantener el cumplimiento de sus aplicaciones y de trabajar con el proveedor adecuado para solucionar cualquier problema. Para obtener más información, consulte Sus responsabilidades con el uso de IBM Cloud Kubernetes Service.
Antes de empezar
Antes de empezar, asegúrese de que tiene Acceso a la plataforma Administrador para poder crear credenciales de cuenta y recursos de suministro. También necesita los siguientes requisitos previos:
-
jq
le ayuda a porcionar y filtrar datos JSON. Utilicejq
en esta guía de aprendizaje para capturar y utilizar variables de entorno almacenadas.
Configurar el entorno
Para trabajar con Secrets Manager y Kubernetes Service, debe crear un clúster y una instancia de Secrets Manager en la cuenta de IBM Cloud. También tiene que configurar los permisos para ejecutar operaciones en ambos servicios.
En este paso, configure un entorno de acceso creando un ID de servicio y una clave de API de IBM Cloud. Al final de la guía de aprendizaje, podrá eliminar fácilmente los recursos si ya no los necesita. De forma alternativa, puede utilizar un perfil de confianza para autorizar el operador Secretos externos.
Cree un ID de servicio y una clave de API
Empiece creando las credenciales de cuenta que necesita para poder ejecutar operaciones en Secrets Manager y Kubernetes Service.
-
Desde la línea de mandatos, inicie la sesión en IBM Cloud mediante la CLI de IBM Cloud.
ibmcloud login
Si el inicio de sesión falla, ejecute el mandato
ibmcloud login --sso
para volver a intentarlo. Se requiere el parámetro--sso
para iniciar sesión con un ID federado. Si se utiliza esta opción, vaya al enlace que se muestra en la salida de la CLI para generar una contraseña de uso único. -
Cree un ID de servicio y establézcalo como variable de entorno.
export SERVICE_ID=`ibmcloud iam service-id-create kubernetes-secrets-tutorial --description "A service ID for testing ESO integration" --output json | jq -r ".id"`; echo $SERVICE_ID
-
Asigne los permisos de ID de servicio para leer secretos de Secrets Manager.
ibmcloud iam service-policy-create $SERVICE_ID --roles "SecretsReader" --service-name secrets-manager
Al asignar el acceso de servicio de SecretsReader, el controlador de secretos externos tiene el nivel correcto de acceso para leer secretos de Secrets Manager y llenarlos en un clúster de Kubernetes.
-
Cree una clave de API de IBM Cloud para el ID de servicio.
export IBM_CLOUD_API_KEY=`ibmcloud iam service-api-key-create kubernetes-secrets-tutorial $SERVICE_ID --description "An API key for testing ESO integration." --output json | jq -r ".apikey"`
Utilice esta clave de API más adelante para configurar Secrets Manager para el despliegue del clúster.
Crear un clúster de Kubernetes y una instancia de Secrets Manager
Cree un clúster de Kubernetes y una instancia de Secrets Manager en su cuenta de IBM Cloud.
Puede crear una agrupación de Kubernetes gratuito y una instancia de servicio de Secrets Manager por cuenta de IBM Cloud. Si ya tiene ambos recursos en su cuenta, puede utilizar el clúster gratuito existente y la instancia de Secrets Manager para completar la guía de aprendizaje.
-
En la línea de mandatos, seleccione la cuenta, la región y el grupo de recursos donde desea crear una instancia de servicio de Secrets Manager.
En esta guía de aprendizaje, interactúa con la región de Dallas. Si ha iniciado sesión en otra región, establezca Dallas como región de destino ejecutando el mandato siguiente.
ibmcloud target -r us-south -g default
-
Cree un clúster de Kubernetes.
ibmcloud ks cluster create classic --zone dal10 --flavor free --name my-test-cluster
-
Cree una instancia de Secrets Manager.
ibmcloud resource service-instance-create my-secrets-manager secrets-manager trial us-south
El suministro para Secrets Manager y también el clúster de Kubernetes tarda 5-15 minutos en completarse.
-
Antes de continuar con el siguiente paso, verifique que su clúster y su instancia de Secrets Manager se hayan aprovisionado correctamente.
-
Verifique que el despliegue del nodo trabajador esté completo.
ibmcloud ks worker ls --cluster my-test-cluster
Cuando el nodo de trabajador finaliza el suministro, el estado cambia a Listo.
ID Public IP Private IP Flavor State Status Zone Version kube-c39pf4ld0m87o3fv1utg-mytestclust-default-000000dd 169.xx.xx.xxx 10.xxx.xx.xxx free normal Ready mex01 1.20.7_1543
-
A continuación, verifique que la instancia de Secrets Manager se ha suministrado correctamente.
ibmcloud resource service-instance my-secrets-manager
Cuando la instancia finaliza el suministro, el estado cambia a Activo.
Name: my-secrets-manager ID: crn:v1:bluemix:public:secrets-manager:us-south:a/f047b55a3362ac06afad8a3f2f5586ea:fe06948b-0c6b-4183-8d4b-e6c1d38ff65f:: GUID: fe06948b-0c6b-4183-8d4b-e6c1d38ff65f Location: us-south Service Name: secrets-manager Service Plan Name: trial Resource Group Name: default State: active Type: service_instance Sub Type: Created at: 2021-01-06T17:11:32Z Created by: zara@example.com Updated at: 2021-03-31T02:33:26Z
-
-
Establezca el contexto para el clúster de Kubernetes en la CLI.
ibmcloud ks cluster config --cluster my-test-cluster
-
Verifique que los mandatos
kubectl
se ejecutan correctamente y que el contexto de Kubernetes establecido es su clúster.kubectl config current-context
Salida de ejemplo:
my-test-cluster/<your_cluster_ID>
Crear un perfil de confianza
Un perfil de confianza permite al operador Secretos externos leer de Secrets Manager, sin tener que crear un ID de servicio ni gestionar una clave de API.
-
Obtenga los CRN para la instancia de Secrets Manager y el clúster de Kubernetes.
CLUSTER_CRN=$(ibmcloud ks cluster get --cluster my-test-cluster --output json | jq -r '.crn') SECRETS_MANAGER_CRN=$(ibmcloud resource service-instance my-secrets-manager --output JSON | jq -r '.[0].crn')
-
Cree el perfil.
ibmcloud iam trusted-profile-create 'External Secrets'
-
Autorice al clúster de Kubernetes a utilizar el perfil de confianza.
Kubernetes
ibmcloud iam trusted-profile-rule-create 'External Secrets' --name kubernetes --type Profile-CR --conditions claim:namespace,operator:EQUALS,value:external-secrets --conditions claim:name,operator:EQUALS,value:external-secrets --conditions claim:crn,operator:EQUALS,value:$CLUSTER_CRN --cr-type IKS_SA
OpenShift
ibmcloud iam trusted-profile-rule-create 'External Secrets' --name kubernetes --type Profile-CR --conditions claim:namespace,operator:EQUALS,value:external-secrets-operator --conditions claim:name,operator:EQUALS,value:cluster-external-secrets --conditions claim:crn,operator:EQUALS,value:$CLUSTER_CRN --cr-type IKS_SA
-
Cree una política de acceso que permita al perfil de confianza leer secretos de la instancia de Secrets Manager.
ibmcloud iam trusted-profile-policy-create 'External Secrets' --roles SecretsReader --service-instance $SECRETS_MANAGER_CRN --service-name secrets-manager
Preparar la instancia de Secrets Manager
Por último, configure la instancia de Secrets Manager para empezar a trabajar con secretos.
-
En la línea de mandatos, verifique que puede acceder al plug-in de CLI de Secrets Manager.
ibmcloud secrets-manager --help
¿Aún no tienes el plug-in? Para instalar el plug-in de CLI de Secrets Manager, ejecute
ibmcloud plugin install secrets-manager
. -
Exporte una variable de entorno con el URL de punto final de API de Secrets Manager exclusivo.
export SECRETS_MANAGER_URL=`ibmcloud resource service-instance my-secrets-manager --output json | jq -r '.[].dashboard_url | .[0:-3]'`; echo $SECRETS_MANAGER_URL
-
Cree un grupo de secretos para la instancia.
Grupos de secretos es una forma de organizar y controlar quién en su equipo tiene acceso a secretos específicos en su caso. Para crear un grupo de secretos desde la CLI de IBM Cloud, utilice el mandato
ibmcloud secrets-manager secret-group-create
. Ejecute el mandato siguiente para crear un grupo de secretos y almacenar su ID como una variable de entorno.export SECRET_GROUP_ID=`ibmcloud secrets-manager secret-group-create --name my-test-secret-group --description "Read and write to my test app" --output json --service-url $SECRETS_MANAGER_URL | jq -r '.id'`; echo $SECRET_GROUP_ID
¿Utiliza un indicador de mandatos de Windows™ (
cmd.exe
) o PowerShell? Si detecta errores con el contenido de JSON que pasa en la línea de mandatos, es posible que tenga que ajustar las series a los requisitos de uso de comillas específicos del sistema operativo. Para obtener más información, consulte Utilización de comillas con series en la CLI de IBM Cloud.Correcto Ahora puede almacenar el secreto en Secrets Manager que desea llenar en el clúster de Kubernetes. Continúe con el paso siguiente.
Crear un secreto en Secrets Manager
Los secretos son específicos de la aplicación y pueden variar en función de la aplicación o servicio individual que los requiera. Un secreto puede constar de un nombre de usuario, una contraseña, una clave de API o cualquier otro tipo de credencial.
Secrets Manager da soporte a varios tipos de secretos que puede crear y gestionar en el servicio. Por ejemplo, si necesita gestionar una clave de API para una aplicación protegida por la autenticación de IAM de IBM Cloud, puede crear unA Credencial de IAM. O bien, si necesita gestionar un secreto que puede contener cualquier tipo de datos estructurados o no estructurados, puede crear un secreto arbitrario.
En esta guía de aprendizaje, puede crear un nombre de usuario y una contraseña como ejemplo. Para crear un secreto desde la CLI de IBM Cloud, utilice el mandato ibmcloud secrets-manager secret-create
.
Ejecute el mandato siguiente para crear el secreto y almacenar su ID como una variable de entorno.
export SECRET_ID=`ibmcloud secrets-manager secret-create --secret-type=username_password --secret-name example_username_password --username-password-username user123 --username-password-password cloudy-rainy-coffee-book --secret-labels "my-test-cluster, tutorial" --secret-group-id $SECRET_GROUP_ID --output json $SECRETS_MANAGER_URL | jq -r '.id'`; echo $SECRET_ID
Asegúrese de actualizar instance_id
y region
a los suyos.
La salida muestra el ID del secreto recién creado. Por ejemplo:
e0246cea-d668-aba7-eef2-58ca11ad3707
Configurar Operador de secretos externos
Ahora que tiene un secreto para su aplicación, puede configurar la herramienta External Secrets Operator para su clúster. Este paquete configura la conexión entre
Secrets Manager y el clúster creando objetos ExternalSecrets
que se convierten en secretos de Kubernetes para la aplicación.
El Operador de secretos externos es una herramienta de código abierto que no mantiene IBM. Para obtener más información sobre esta herramienta o para solucionar cualquier problema, consulte la documentación del proyecto.
Configurar el Operador de secretos externos del clúster
Kubernetes
En primer lugar, añada los recursos de external-secrets
al clúster instalando el gráfico Helm oficial. Para obtener más opciones de instalación, consulte la guía de inicio.
-
Ejecute el mandato siguiente para instalar el repositorio helm de External Secrets Operator:
helm repo add external-secrets https://charts.external-secrets.io
-
Configure la autenticación entre External Secrets Operator y Secrets Manager.
Si está utilizando un ID de servicio para autenticarse:
kubectl -n default create secret generic secret-api-key --from-literal=apikey=$IBM_CLOUD_API_KEY helm install external-secrets external-secrets/external-secrets -n external-secrets --create-namespace --set installCRDs=true
Si está utilizando un perfil de confianza para autenticarse:
echo ' installCRDs: true extraVolumes: - name: sa-token projected: defaultMode: 420 sources: - serviceAccountToken: path: sa-token expirationSeconds: 3600 audience: iam extraVolumeMounts: - mountPath: /var/run/secrets/tokens name: sa-token webhook: extraVolumes: - name: sa-token projected: defaultMode: 420 sources: - serviceAccountToken: path: sa-token expirationSeconds: 3600 audience: iam extraVolumeMounts: - mountPath: /var/run/secrets/tokens name: sa-token' >values.yml helm install external-secrets external-secrets/external-secrets -n external-secrets --create-namespace -f values.yml
OpenShift
-
Instale el operador de secretos externos creando los recursos siguientes:
echo ' apiVersion: v1 kind: Namespace metadata: name: external-secrets-operator --- apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: external-secrets-operator namespace: external-secrets-operator spec: targetNamespaces: - external-secrets-operator --- apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: external-secrets-operator namespace: external-secrets-operator spec: channel: stable installPlanApproval: Automatic name: external-secrets-operator source: community-operators sourceNamespace: openshift-marketplace ' | oc create -f-
-
Configure la autenticación entre External Secrets Operator y Secrets Manager.
Si está utilizando un ID de servicio para autenticarse:
echo " apiVersion: operator.external-secrets.io/v1alpha1 kind: OperatorConfig metadata: name: cluster namespace: external-secrets-operator spec: {} --- apiVersion: v1 kind: Secret metadata: name: secret-api-key namespace: default type: Opaque stringData: apikey: $IBM_CLOUD_API_KEY " | oc create -f-
Si está utilizando un perfil de confianza para autenticarse:
echo ' apiVersion: operator.external-secrets.io/v1alpha1 kind: OperatorConfig metadata: name: cluster namespace: external-secrets-operator spec: extraVolumeMounts: - mountPath: /var/run/secrets/tokens name: sa-token extraVolumes: - name: sa-token projected: defaultMode: 420 sources: - serviceAccountToken: audience: iam expirationSeconds: 3600 path: sa-token webhook: extraVolumeMounts: - mountPath: /var/run/secrets/tokens name: sa-token extraVolumes: - name: sa-token projected: defaultMode: 420 sources: - serviceAccountToken: audience: iam expirationSeconds: 3600 path: sa-token ' | oc create -f-
Actualice la configuración de la aplicación
Después de instalar el Operador de secretos externos en el clúster, puede definir Secrets Manager como programa de fondo de secretos de la aplicación. Empiece creando un archivo de configuración que se dirige al secreto en Secrets Manager que desea utilizar.
-
En el directorio raíz de la aplicación, cree un archivo
external-secrets-example.yml
.touch external-secrets-example.yml
-
Modifique el archivo para incluir información sobre el secreto que desea extraer de la instancia de Secrets Manager.
apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: ibmcloud-secrets-manager-example spec: provider: ibm: serviceUrl: <endpoint_url> auth: secretRef: secretApiKeySecretRef: name: secret-api-key key: apikey --- apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: ibmcloud-secrets-manager-example spec: secretStoreRef: name: ibmcloud-secrets-manager-example kind: SecretStore target: name: ibmcloud-secrets-manager-example data: - secretKey: username remoteRef: property: username key: username_password/<SECRET_ID> - secretKey: password remoteRef: property: password key: username_password/<SECRET_ID>
Hay dos modalidades que elige para trabajar por-ID de secreto o nombre de secreto. Si elige el nombre de secreto, el formato cambia de
secret_type/secret_id
asecret_group/secret_type/secret_name
.Sustituya
<endpoint_url>
por el URL de punto final de Secrets Manager que ha recuperado anteriormente. Sustituya<SECRET_ID>
por el ID exclusivo del secreto que ha creado en el paso anterior.Si está utilizando un perfil de confianza para autenticarse, sustituya el bloque
auth
con el siguiente fragmento de código.auth: containerAuth: profile: "External Secrets" iamEndpoint: https://iam.cloud.ibm.com tokenLocation: /var/run/secrets/tokens/sa-token
-
Aplique la configuración al clúster.
kubectl apply -f external-secrets-example.yml
-
Verifique que el Operador de secretos externos puede captar el secreto almacenado en la instancia de Secrets Manager.
kubectl get secret ibmcloud-secrets-manager-example -o json | jq '.data | map_values(@base64d)'
Salida de ejemplo:
{ "password": "cloudy-rainy-coffee-book", "username": "user123" }
Correcto Ahora puede captar los datos secretos que se almacenan en la instancia de Secrets Manager. Continúe con el paso siguiente.
Despliegue una aplicación en el clúster
Por último, puede desplegar una aplicación en el clúster que utiliza el secreto de Secrets Manager que ha definido en el archivo external-secret-example.yml
. En el tiempo de ejecución de la aplicación, los datos secretos que se
captan de Secrets Manager se convierten en un secreto de Kubernetes que el clúster puede utilizar.
¿Busca ejemplos sobre cómo desplegar una aplicación? Consulte Despliegue de apps nativas de Kubernetesen clústeres para obtener más información sobre el despliegue de una única instancia de una app.
(Opcional) Limpiar los recursos
Si ya no necesita los recursos que ha creado en esta guía de aprendizaje, puede completar los pasos siguientes para eliminarlos de su cuenta.
-
Suprima el clúster de Kubernetes de prueba.
ibmcloud ks cluster rm --cluster my-test-cluster
-
Suprima la instancia de prueba de Secrets Manager.
ibmcloud resource service-instance-delete my-secrets-manager
-
Suprima su autorización.
Si está utilizando un ID de servicio.
ibmcloud iam service-id-delete $SERVICE_ID
Si está trabajando con un perfil de confianza.
ibmcloud iam trusted-profile-delete 'External Secrets'
Notas de interés
A medida que construye su documento YAML, tenga en cuenta que cada clave de la sección de datos se sondea periódicamente mediante REST desde la instancia Secrets Manager. Tenga en cuenta que:
- Por defecto, el intervalo de sondeo se establece en 1 hora y es el valor preferido para establecer. Puede cambiar este valor utilizando
spec.refreshInterval
en la plantilla External Secrets. El intervalo se puede expresar en unidades des
,m
oh
. - Si establece el YAML para captar un secreto Secrets Manager por nombre en lugar de por ID (
keyByName: true
), ESO realiza una llamada adicional para captar el ID de secreto relevante. Para obtener más información, consulte el apartado Documentación de Secretos externos.
Próximos pasos
¡Buen trabajo! En esta guía de aprendizaje, ha aprendido a configurar Secrets Manager para llenar de forma segura los secretos de la aplicación en el clúster. Consulte más recursos para ayudarle a empezar a utilizar Secrets Manager.
- Revise los tipos de secreto de en Secrets Manager soportados por External Secrets Operator.
- Obtenga más información sobre la API de Secrets Manager.