En esta página, se muestra a los administradores de clústeres y a los ingenieros de seguridad cómo rotar las autoridades certificadoras (AC) y las claves de firma de la cuenta de servicio que configuraste para GKE control plane authority.
Debes conocer los siguientes conceptos:
- Administración de claves y credenciales.
- Rotación de credenciales administradas por el cliente.
- Consideraciones para las claves asimétricas.
Planifica rotaciones de credenciales
En este documento, se muestra cómo rotar los siguientes componentes de credenciales en tu plano de control:
- La CA raíz del clúster, la CA raíz de agregación, la CA raíz de la API de etcd y la CA raíz de pares de etcd.
- Las claves de firma y verificación de la ServiceAccount de Kubernetes.
También puedes rotar las claves de encriptación administradas por el cliente que usaste para encriptar los discos de arranque del plano de control, los discos de etcd y la copia de seguridad interna de etcd que Google Cloud usa para la recuperación ante desastres. Para obtener más información, consulta Rota las claves de encriptación del disco de arranque del plano de control y etcd.
Rota tus credenciales para evitar el vencimiento de la AC, mitigar las vulneraciones de las versiones de claves y como parte de las prácticas de seguridad de tu organización. Para planificar la frecuencia con la que rotas recursos específicos de GKE control plane authority, ten en cuenta lo siguiente:
- De forma predeterminada, los certificados de GKE firmados por las AC raíz en Certificate Authority Service (servicio de CA) vencen un año después de la fecha de creación.
- Las claves de Cloud Key Management Service (Cloud KMS) no vencen. Realiza una rotación de claves manual solo si tu organización tiene requisitos para la rotación de claves. Para minimizar las interrupciones en las cargas de trabajo en ejecución, no configures la rotación automática de claves para estas claves.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Para usar Google Cloud CLI en esta tarea,
instala y, luego,
inicializa la
gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando
gcloud components updatepara obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos de este documento.
Tener un clúster existente que use claves de cuentas de servicio y AC autoadministradas y ejecute la versión 1.35.2-gke.1842000 o posterior de GKE.
Identifica los IDs de los siguientes proyectos de Google Cloud :
- Proyecto de claves: Es el proyecto que contiene tus recursos de Cloud KMS y CA Service.
- Proyecto del clúster: Es el proyecto que contiene tu clúster de GKE.
Para realizar las tareas de validación de este documento, verifica que estén habilitados los siguientes registros de auditoría de acceso a los datos:
- API de Cloud Key Management Service (KMS):
DATA_READ - Certificate Authority Service:
ADMIN_READ
Para habilitar estos tipos de registros, consulta Habilita los registros de auditoría de acceso a los datos.
- API de Cloud Key Management Service (KMS):
Roles y permisos requeridos
Para obtener los permisos que necesitas para rotar tus AC y claves administradas por el cliente, pídele a tu administrador que te otorgue los siguientes roles de IAM:
-
Administra claves o versiones de claves:
Administrador de Cloud KMS (
roles/cloudkms.admin) en tu proyecto de claves -
Administra las AC raíz:
Administrador del Servicio de AC (
roles/privateca.admin) en tu proyecto clave -
Configura clústeres para usar credenciales nuevas:
Administrador de clústeres de Kubernetes Engine (
roles/container.clusterAdmin) en tu proyecto de clúster
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.
Limitaciones
Las claves asimétricas de Cloud KMS que usas para la firma y verificación de cuentas de servicio no admiten la rotación automática de claves.
Rota las claves de firma y verificación de la cuenta de servicio
Cuando configuras GKE control plane authority, agregas una clave de firma de cuenta de servicio y claves de verificación de cuenta de servicio a tu clúster. GKE usa estas claves para firmar y validar tokens del portador de las ServiceAccounts de Kubernetes. Durante una rotación, agregas tu clave nueva a la lista de claves de verificación de la cuenta de servicio, esperas a que se propaguen los cambios y, luego, reemplazas la clave de firma de la cuenta de servicio por la clave nueva.
Para rotar las claves de la cuenta de servicio, sigue estos pasos:
Obtén el nombre completo del recurso de la versión de clave original de la clave de firma de la cuenta de servicio:
gcloud container clusters describe CLUSTER_NAME \ --project=CLUSTER_PROJECT_ID \ --location=CONTROL_PLANE_LOCATION \ --format="value(userManagedKeysConfig.serviceAccountSigningKeys)"Reemplaza lo siguiente:
CLUSTER_NAME: El nombre de tu clúster.CONTROL_PLANE_LOCATION: Es la ubicación del clúster.CLUSTER_PROJECT_ID: Es el ID del proyecto del clúster.
El resultado es similar a lo siguiente:
projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/SIGNING_KEY_NAME/cryptoKeyVersions/ORIGINAL_SIGNING_KEY_VERSIONEn este resultado,
SIGNING_KEY_NAMEes el nombre de la clave yORIGINAL_SIGNING_KEY_VERSIONes el número de la versión original de la clave de firma.Crea una versión de clave nueva para la clave de firma de la cuenta de servicio:
gcloud kms keys versions create \ --key=SIGNING_KEY_NAME \ --keyring=KEYRING_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_IDReemplaza lo siguiente:
SIGNING_KEY_NAME: Es el nombre de la clave de firma de la cuenta de servicio.KEYRING_NAME: el nombre del llavero de claves que contiene la clave.CONTROL_PLANE_LOCATION: Es la ubicación de Google Cloud del llavero de claves.KEY_PROJECT_ID: Es el ID del proyecto de tu proyecto de claves.
Obtén el nombre de recurso completo de la versión de clave nueva:
gcloud kms keys versions list \ --key=SIGNING_KEY_NAME \ --keyring=KEYRING_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_ID \ --filter="STATE=ENABLED" --sort-by=~ \ --format="value(name)" | sed 1qEl resultado es similar a lo siguiente:
projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/SIGNING_KEY_NAME/cryptoKeyVersions/NEW_SIGNING_KEY_VERSIONEn este resultado,
SIGNING_KEY_NAMEes el nombre de la clave yNEW_SIGNING_KEY_VERSIONes el número de la nueva versión de la clave de firma.Agrega la versión de la clave nueva al conjunto de claves de verificación de la cuenta de servicio para el clúster:
gcloud container clusters update CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=CLUSTER_PROJECT_ID \ --service-account-verification-keys=ORIGINAL_KEY_VERSION_PATH,NEW_KEY_VERSION_PATHReemplaza lo siguiente:
ORIGINAL_KEY_VERSION_PATH: Es el nombre completo del recurso de la versión original de la clave de firma del resultado del primer paso de esta sección. Por ejemplo,projects/example-key-project/locations/us-central1/keyRings/example-keyring/cryptokeys/example-signing-key/cryptoKeyVersions/1.NEW_KEY_VERSION_PATH: Es el nombre completo del recurso de la nueva versión de la clave de firma del resultado del paso anterior. Por ejemplo,projects/example-key-project/locations/us-central1/keyRings/example-keyring/cryptokeys/example-signing-key/cryptoKeyVersions/2.
Después de que se complete la operación de actualización del clúster, la ruta de acceso de la versión de la clave nueva puede tardar hasta 10 minutos en propagarse al servidor de la API de Kubernetes y a cada extremo de API de GKE.
Para confirmar que la ruta de acceso de la nueva versión de la clave se propague por completo, haz lo siguiente:
Obtén el componente público de las claves de firma del clúster de la API de GKE como un conjunto de claves web JSON (JWKS):
curl https://container.googleapis.com/v1/projects/CLUSTER_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/clusters/CLUSTER_NAME/jwksEl resultado es similar a lo siguiente:
{ "keys": [ { "kty": "RSA", "alg": "RS256", "use": "sig", "kid": "KEY1_ID", "n": "KEY1_MODULUS", "e": "KEY1_EXPONENT" }, { "kty": "RSA", "alg": "RS256", "use": "sig", "kid": "KEY2_ID", "n": "KEY2_MODULUS", "e": "KEY2_EXPONENT" } ] }Este resultado debe tener dos entradas de clave, lo que indica que ambas versiones de clave están disponibles en la API de GKE. Si solo ves una entrada de clave, espera 10 minutos y vuelve a ejecutar el comando.
Conéctate al clúster para poder ejecutar comandos de
kubectl:gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATIONObtén el componente público de las claves de firma del clúster del servidor de la API de Kubernetes como un JWKS:
kubectl get --raw /openid/v1/jwks | jqEl resultado es similar a lo siguiente:
{ "keys": [ { "kty": "RSA", "alg": "RS256", "use": "sig", "kid": "KEY1_ID", "n": "KEY1_MODULUS", "e": "KEY1_EXPONENT" }, { "kty": "RSA", "alg": "RS256", "use": "sig", "kid": "KEY2_ID", "n": "KEY2_MODULUS", "e": "KEY2_EXPONENT" } ] }Este resultado debe tener dos entradas de claves, lo que indica que ambas versiones de claves están disponibles en el servidor de la API de Kubernetes. Si solo ves una entrada de clave, espera 10 minutos y vuelve a ejecutar el comando.
Actualiza el clúster para usar la versión nueva de la clave como la clave de firma de la cuenta de servicio:
gcloud container clusters update CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=CLUSTER_PROJECT_ID \ --service-account-signing-keys=NEW_KEY_VERSION_PATHVerifica que los tokens de la cuenta de servicio nueva usen la versión de clave nueva:
Crea una ServiceAccount:
kubectl create serviceaccount test-sa-1Crea un token para la ServiceAccount:
kubectl create token test-sa-1Extrae un resumen firmado recientemente de Logging:
export SIGNED_DIGEST=$(gcloud logging read \ 'resource.type="gke_cluster" AND resource.labels.cluster_name="CLUSTER_NAME" AND protoPayload.methodName="google.cloud.gkeauth.v1.Auth.SignServiceAccountJWT" AND protoPayload.metadata.subject="system:serviceaccount:default:test-sa-1"' \ --freshness=1h \ --bucket=_Required \ --location=global \ --view=_AllLogs \ --order=DESC \ --limit=1 \ --format="value(protoPayload.metadata.toBeSignedDigest)")Valida que se esté usando la nueva versión de la clave de firma:
gcloud logging read \ 'resource.type="cloudkms_cryptokeyversion" AND protoPayload.methodName="AsymmetricSign" AND protoPayload.request.digest.sha256="'${SIGNED_DIGEST}'"' \ --freshness=1h \ --bucket=_Default \ --location=global \ --view=_AllLogs \ --order=DESC \ --limit=1 \ --format="value(protoPayload.resourceName)"El resultado es la ruta de acceso al recurso de la nueva versión de la clave de firma.
Espera a que venza cada token del clúster que use la versión original de la clave de firma de la cuenta de servicio. De forma predeterminada, la vida útil del token es de una hora, con un máximo configurable de 24 horas. Para verificar la vida útil del token configurada en tu clúster, ejecuta el siguiente comando:
kubectl get pods -A -o json | jq -r '.items[]?.spec?.volumes[]?.projected?.sources[]?.serviceAccountToken?.expirationSeconds | select(. != null)' | sort -nr | head -n 1Espera a que transcurra el tiempo de vida del token configurado que se muestra en el resultado del paso anterior. Una vez que transcurra este período, todos los tokens vinculados en tu clúster usarán la nueva versión de la clave de firma de la cuenta de servicio.
Quita la versión de la clave original de la lista de claves de verificación del clúster:
gcloud container clusters update CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=CLUSTER_PROJECT_ID \ --service-account-verification-keys=NEW_KEY_VERSION_PATHInhabilita la versión de clave original (opcional). Después de verificar que no se use la versión de la clave original y que el clúster esté en buen estado, destruye la versión de la clave.
A menos que rotes las claves en respuesta a un evento crítico, te recomendamos que esperes unos días antes de destruir la versión original de la clave. Para obtener más información, consulta Destruye y restablece versiones de claves.
Después de completar estos pasos, cada token de cuenta de servicio nuevo y existente en tu clúster se firmará con la nueva versión de la clave. El servidor de la API rechaza cualquier solicitud que use un token del portador con la versión de clave original, ya que esta no existe en la configuración del clúster.
Rota las AC de GKE control plane authority
En las siguientes secciones, se muestra cómo rotar las AC raíz que usa el clúster para GKE control plane authority.
Crea versiones de claves nuevas para las AC
Crea una versión de clave nueva para la clave de la CA raíz del clúster:
gcloud kms keys versions create \ --key=CLUSTER_CA_KEY_NAME \ --keyring=KEYRING_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_IDReemplaza lo siguiente:
CLUSTER_CA_KEY_NAME: Es el nombre de la clave de la AC raíz del clúster.KEYRING_NAME: el nombre del llavero de claves que contiene la clave.CONTROL_PLANE_LOCATION: Es la ubicación de Google Cloud del llavero de claves. Es la misma que la ubicación de tu clúster.KEY_PROJECT_ID: Es el ID del proyecto de tu proyecto de claves.
Crea una versión de clave nueva para la clave de la AC raíz de agregación:
gcloud kms keys versions create \ --key=AGGREGATION_CA_KEY_NAME \ --keyring=KEYRING_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_IDReemplaza
AGGREGATION_CA_KEY_NAMEpor el nombre de la clave de la AC raíz de agregación del clúster.Crea una nueva versión de clave para la clave de la AC raíz de la API de etcd:
gcloud kms keys versions create \ --key=ETCD_API_CA_KEY_NAME \ --keyring=KEYRING_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_IDReemplaza
ETCD_API_CA_KEY_NAMEpor el nombre de la clave de la AC raíz de la API de etcd para el clúster.Crea una versión de clave nueva para la clave de la AC raíz de par de etcd:
gcloud kms keys versions create \ --key=ETCD_PEER_CA_KEY_NAME \ --keyring=KEYRING_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_IDReemplaza
ETCD_PEER_CA_KEY_NAMEpor el nombre de la clave de la AC raíz de intercambio de tráfico de etcd para el clúster.
Crea nuevas AC raíz
Obtén el nombre completo del recurso de la nueva versión de la clave de la AC raíz del clúster:
gcloud kms keys versions list \ --key=CLUSTER_CA_KEY_NAME \ --keyring=KEYRING_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_ID \ --filter="STATE=ENABLED" --sort-by=~ \ --format="value(name)" | sed 1qEl resultado es similar a lo siguiente:
projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/CLUSTER_CA_KEY_NAME/cryptoKeyVersions/VERSIONEn este resultado,
VERSIONes el número de la versión de la clave nueva.Crea una nueva AC raíz del clúster en el grupo de AC del clúster:
gcloud privateca roots create CLUSTER_ROOT_CA_NAME \ --pool=CLUSTER_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --kms-key-version=CLUSTER_CA_KEY_PATH \ --subject="CN=cluster-ca, O=ORGANIZATION" \ --project=KEY_PROJECT_IDReemplaza lo siguiente:
CLUSTER_ROOT_CA_NAME: Es un nombre para tu nueva AC raíz.CLUSTER_CA_POOL_NAME: Es el nombre del grupo de AC del clúster.CLUSTER_CA_KEY_PATH: Es el nombre completo del recurso de la versión de clave nueva del resultado del paso anterior.ORGANIZATION: Es el nombre de tu organización.
Obtén el nombre de recurso completo de la nueva versión de la clave de la AC raíz de agregación:
gcloud kms keys versions list \ --key=AGGREGATION_CA_KEY_NAME \ --keyring=KEYRING_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_ID \ --filter="STATE=ENABLED" --sort-by=~ \ --format="value(name)" | sed 1qEl resultado es similar a lo siguiente:
projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/AGGREGATION_CA_KEY_NAME/cryptoKeyVersions/VERSIONCrea una nueva CA raíz de agregación en el grupo de CA de agregación:
gcloud privateca roots create AGGREGATION_ROOT_CA_NAME \ --pool=AGGREGATION_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --kms-key-version=AGGREGATION_CA_KEY_PATH \ --subject="CN=aggregation-ca, O=ORGANIZATION" \ --project=KEY_PROJECT_IDReemplaza lo siguiente:
AGGREGATION_ROOT_CA_NAME: Es un nombre para tu nueva AC raíz de agregación.AGGREGATION_CA_POOL_NAME: Es el nombre del grupo de AC de agregación.AGGREGATION_CA_KEY_PATH: Es el nombre completo del recurso de la versión de clave nueva del resultado del paso anterior.
Obtén el nombre de recurso completo de la nueva versión de la clave de la AC raíz de la API de etcd:
gcloud kms keys versions list \ --key=ETCD_API_CA_KEY_NAME \ --keyring=KEYRING_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_ID \ --filter="STATE=ENABLED" --sort-by=~ \ --format="value(name)" | sed 1qEl resultado es similar a lo siguiente:
projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/ETCD_API_CA_KEY_NAME/cryptoKeyVersions/VERSIONCrea una nueva CA raíz de la API de etcd en el grupo de AC de la API de etcd:
gcloud privateca roots create ETCD_API_ROOT_CA_NAME \ --pool=ETCD_API_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --kms-key-version=ETCD_API_CA_KEY_PATH \ --subject="CN=etcd-api-ca, O=ORGANIZATION" \ --project=KEY_PROJECT_IDReemplaza lo siguiente:
ETCD_API_ROOT_CA_NAME: Es un nombre para la nueva AC raíz de la API de etcd.ETCD_API_CA_POOL_NAME: Es el nombre del grupo de AC de la API de etcd.ETCD_API_CA_KEY_PATH: Es el nombre completo del recurso de la versión de clave nueva del resultado del paso anterior.
Obtén el nombre de recurso completo de la nueva versión de la clave de la AC raíz de par de etcd:
gcloud kms keys versions list \ --key=ETCD_PEER_CA_KEY_NAME \ --keyring=KEYRING_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_ID \ --filter="STATE=ENABLED" --sort-by=~ \ --format="value(name)" | sed 1qEl resultado es similar a lo siguiente:
projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/ETCD_PEER_CA_KEY_NAME/cryptoKeyVersions/VERSIONCrea una nueva AC raíz de par de etcd en el grupo de AC de par de etcd:
gcloud privateca roots create ETCD_PEER_ROOT_CA_NAME \ --pool=ETCD_PEER_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --kms-key-version=ETCD_PEER_CA_KEY_PATH \ --subject="CN=etcd-peer-ca, O=ORGANIZATION" \ --project=KEY_PROJECT_IDReemplaza lo siguiente:
ETCD_PEER_ROOT_CA_NAME: Es un nombre para tu nueva AC raíz de par de etcd.ETCD_PEER_CA_POOL_NAME: el nombre del grupo de AC de par de etcd.ETCD_PEER_CA_KEY_PATH: Es el nombre completo del recurso de la versión de clave nueva del resultado del paso anterior.
Antes de continuar, propaga los cambios de la AC raíz al paquete de confianza del clúster siguiendo las instrucciones de la sección Reinicia el plano de control y los nodos.
Reemplaza las AC raíz originales por las nuevas
Después de reiniciar el plano de control y los nodos, sigue estos pasos:
Habilita la nueva CA raíz del clúster:
gcloud privateca roots enable CLUSTER_ROOT_CA_NAME \ --pool=CLUSTER_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_IDHabilita la nueva CA raíz de agregación:
gcloud privateca roots enable AGGREGATION_ROOT_CA_NAME \ --pool=AGGREGATION_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_IDHabilita la nueva CA raíz de la API de etcd:
gcloud privateca roots enable ETCD_API_ROOT_CA_NAME \ --pool=ETCD_API_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_IDHabilita la nueva CA raíz de par de etcd:
gcloud privateca roots enable ETCD_PEER_ROOT_CA_NAME \ --pool=ETCD_PEER_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_IDInhabilita la AC raíz del clúster original:
gcloud privateca roots disable ORIGINAL_CLUSTER_ROOT_CA \ --pool=CLUSTER_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_IDReemplaza
ORIGINAL_CLUSTER_ROOT_CApor el nombre de la CA raíz del clúster original que rotarás.Inhabilita la AC raíz de agregación original:
gcloud privateca roots disable ORIGINAL_AGGREGATION_ROOT_CA \ --pool=AGGREGATION_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_IDReemplaza
ORIGINAL_AGGREGATION_ROOT_CApor el nombre de la CA raíz de agregación original que rotarás.Inhabilita la CA raíz de la API de etcd original:
gcloud privateca roots disable ORIGINAL_ETCD_API_ROOT_CA \ --pool=ETCD_API_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_IDReemplaza
ORIGINAL_ETCD_API_ROOT_CApor el nombre de la CA raíz de la API de etcd original que rotarás.Inhabilita la CA raíz de par de etcd original:
gcloud privateca roots disable ORIGINAL_ETCD_PEER_ROOT_CA \ --pool=ETCD_PEER_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_IDReemplaza
ORIGINAL_ETCD_PEER_ROOT_CApor el nombre de la CA raíz de par de etcd original que rotarás.En este punto, las nuevas AC raíz emiten todos los certificados nuevos en el clúster. Para emitir certificados nuevos para el
kubeleten cada nodo, reinicia el plano de control y los nodos. Este paso es obligatorio porque los certificados dekubelettienen una vida útil larga.
Después de varios días en los que el clúster permanece en un estado correcto, puedes borrar las CAs raíz originales, como se describe en la siguiente sección.
Borra las AC raíz originales
En esta sección, se muestra cómo borrar las AC raíz originales. Antes de seguir estos pasos, verifica lo siguiente:
- El clúster permaneció en un estado correcto durante varios días después de que reemplazaste las AC raíz originales por las nuevas.
- Reemplazaste todos los certificados emitidos por las AC raíz originales por certificados nuevos.
Para borrar las AC raíz originales, usa el comando
gcloud privateca roots delete,
como se describe en los siguientes pasos. En estos comandos, la
marca --ignore-active-certificates borra la CA después de un período de gracia, incluso si
la CA tiene certificados no revocados o no vencidos.
Borra la CA raíz del clúster original:
gcloud privateca roots delete ORIGINAL_CLUSTER_ROOT_CA \ --pool=CLUSTER_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_ID \ --ignore-active-certificatesReemplaza
ORIGINAL_CLUSTER_ROOT_CApor el nombre de la CA raíz del clúster original que rotarás.Borra la CA raíz de agregación original:
gcloud privateca roots delete ORIGINAL_AGGREGATION_ROOT_CA \ --pool=AGGREGATION_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_ID \ --ignore-active-certificatesReemplaza
ORIGINAL_AGGREGATION_ROOT_CApor el nombre de la CA raíz de agregación original que rotarás.Borra la CA raíz de la API de etcd original:
gcloud privateca roots delete ORIGINAL_ETCD_API_ROOT_CA \ --pool=ETCD_API_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_ID \ --ignore-active-certificatesReemplaza
ORIGINAL_ETCD_API_ROOT_CApor el nombre de la CA raíz de la API de etcd original que rotarás.Borra la CA raíz de par de etcd original:
gcloud privateca roots delete ORIGINAL_ETCD_PEER_ROOT_CA \ --pool=ETCD_PEER_CA_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=KEY_PROJECT_ID \ --ignore-active-certificatesReemplaza
ORIGINAL_ETCD_PEER_ROOT_CApor el nombre de la CA raíz de par de etcd original que rotarás.Opcional: Propaga los cambios en las AC raíz al paquete de confianza del clúster. Para obtener instrucciones, consulta la sección Reinicia el plano de control y los nodos. Si omites este paso, las AC raíz originales se quitarán durante la próxima actualización de la versión del plano de control y del nodo.
Reinicia el plano de control y los nodos
Cuando realices cambios en la configuración de la AC raíz de tu clúster, como habilitar o inhabilitar AC raíz, o revocar certificados, debes propagar esos cambios al paquete de confianza del clúster. Para propagar los cambios en el paquete de confianza del clúster, debes reiniciar el plano de control y (en algunos casos) los nodos.
Actualiza el plano de control del clúster a la misma versión que ya usa.
Busca la versión de GKE que ya usa el plano de control:
gcloud container clusters describe CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=CLUSTER_PROJECT_ID \ --format="value(currentMasterVersion)"Reemplaza lo siguiente:
CLUSTER_NAME: Es el nombre del clúster de GKE.CLUSTER_VERSION: Es la versión de GKE que ya ejecuta el clúster.CLUSTER_PROJECT_ID: Es el ID del proyecto de tu proyecto de clúster.
Actualiza el plano de control:
gcloud container clusters upgrade CLUSTER_NAME \ --master \ --location=CONTROL_PLANE_LOCATION \ --cluster-version=CLUSTER_VERSION \ --project=CLUSTER_PROJECT_ID
Solo para la rotación de la AC raíz del clúster, activa la recreación de nodos actualizando cada uno de tus grupos de nodos a la misma versión que ya usan.
Busca la versión de GKE que usa el grupo de nodos:
gcloud container node-pools describe NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=CLUSTER_PROJECT_ID \ --format="value(version)"Reemplaza
NODE_POOL_NAMEpor el nombre del grupo de nodos que deseas actualizar.Actualiza el grupo de nodos:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=NODE_POOL_NAME \ --location=CONTROL_PLANE_LOCATION \ --cluster-version=CLUSTER_VERSION \ --project=CLUSTER_PROJECT_ID
Después de que el plano de control y los nodos terminen de actualizarse, actualiza los clientes de API de Kubernetes, como la CLI de kubectl, para usar el paquete de confianza actualizado. Si generas certificados de forma manual con CertificateSigningRequests de Kubernetes, vuelve a emitir todos esos certificados y proporciona los nuevos a los clientes de la API.
Si realizaste los pasos de esta sección durante una rotación de la AC, continúa con la siguiente fase de la rotación, que es una de las siguientes secciones de este documento:
¿Qué sigue?
- Rota las claves de encriptación del disco de arranque del plano de control y de etcd
- Verifica la emisión y el uso de la identidad