En esta página, se muestra cómo configurar el plano de control de tu clúster de Google Kubernetes Engine (GKE) con autoridades de certificación (CA) y claves que tú administras. Esta guía está dirigida a los administradores de seguridad que tienen requisitos específicos de cumplimiento o políticas organizacionales para controlar la emisión y firma de credenciales.
En esta página, se describe una parte de un conjunto de funciones opcionales del plano de control en GKE que te permiten realizar tareas como verificar la postura de seguridad del plano de control o configurar la encriptación y la firma de credenciales en el plano de control con claves que administras. Para obtener más detalles, consulta Acerca de la autoridad del plano de control de GKE.
De forma predeterminada, Google Cloud aplica varias medidas de seguridad al plano de control administrado. En esta página, se describen las capacidades opcionales que te brindan más visibilidad o control sobre el plano de control de GKE.
Ya debes conocer los siguientes conceptos:
- Solicitudes de firma de certificado (CSR)
- Autoridades certificadoras (CA)
- etcd
- Arquitectura del clúster de GKE
Componentes de credenciales del plano de control
Los clústeres de GKE usan CAs y claves específicas para emitir credenciales en el clúster, como certificados X.509 o tokens de ServiceAccount. Puedes crear claves en Cloud Key Management Service (Cloud KMS) y AC en Certificate Authority Service (servicio de AC), y configurar tus clústeres para que usen estos recursos en lugar de las AC y las claves administradas por Google Cloud.
Para obtener más información sobre los componentes específicos que creas, consulta CA y claves autoadministradas.
Uso con otras funciones de la autoridad del plano de control de GKE
La autoridad del plano de control de GKE proporciona las siguientes funciones relacionadas con las claves autoadministradas:
- Ejecuta tus propias autoridades certificadoras (CA) y claves (esta página)
- Encripta los componentes del plano de control
Prepare el entorno
En esta sección, identificarás los Google Cloud proyectos que usarás en este instructivo y crearás un llavero de claves en Cloud KMS para guardar tus claves.
Identifica proyectos
Te recomendamos que uses proyectos Google Cloud separados de la siguiente manera:
- Proyecto de claves: Contiene todas las claves y las CA.
- Proyecto del clúster: Contiene tus clústeres de GKE.
De manera opcional, puedes usar el mismo proyecto para tus claves, AC y clústeres de GKE, pero te recomendamos que uses proyectos separados para que los equipos que administran las operaciones criptográficas en tu organización estén separados de los equipos que administran las operaciones de clústeres.
Crea un llavero de claves
Crea un llavero de claves en el proyecto de clave para contener todas las claves de un clúster específico. Debes crear el llavero de claves en la misma ubicación que tu clúster de GKE.
Ejecuta el siguiente comando:
gcloud kms keyrings create KEY_RING_NAME \
--location=LOCATION \
--project=KEY_PROJECT_ID
Reemplaza lo siguiente:
KEY_RING_NAME
: Es el nombre del llavero de claves.KEY_PROJECT_ID
: Es el ID del proyecto de claves.LOCATION
: Es la región de Google Cloud en la que deseas crear el llavero de claves. Debe ser la misma región en la que se encuentra tu clúster de GKE.
Crea claves
Para cada una de las autoridades de credenciales, como las claves de cuentas de servicio y las AC, creas una clave con Cloud KMS. En esta sección, se muestra cómo crear las claves que GKE usa para firmar y verificar las credenciales en el clúster.
Puedes especificar tus propias propiedades para estas claves según las necesidades de tu organización. Para obtener más detalles, consulta la página Crea una clave y la referencia de la API de projects.locations.keyRings.cryptoKeys
.
Ten en cuenta lo siguiente cuando crees estos recursos en Cloud KMS:
- Si tienes un llavero de claves existente en tu proyecto de clave, puedes usarlo para almacenar todas las claves que crees para usar con tu clúster.
- El llavero de claves debe estar en la misma Google Cloud ubicación que el clúster para minimizar la latencia.
- Las claves deben especificar
asymmetric-signing
como el propósito de la clave. - Usa los siguientes algoritmos según el tipo de clave:
- Claves de firma de ServiceAccount: Un algoritmo PKCS1 de firma RSA sólido, como
rsa-sign-pkcs1-4096-sha256
orsa-sign-pkcs1-3072-sha256
. - Claves de la autoridad certificadora: Un algoritmo sólido, como
ec-sign-p256-sha256
- Claves de firma de ServiceAccount: Un algoritmo PKCS1 de firma RSA sólido, como
- Se admiten las claves de hardware de Cloud HSM, pero el nivel de protección
software
es suficiente para la mayoría de los casos de uso. Para obtener detalles sobre las claves de hardware, consulta Cloud HSM. - No modifiques la duración predeterminada para la destrucción de claves.
- GKE no te impide borrar las claves de Cloud KMS, incluidas las claves de CA Service, que usa el clúster. Antes de borrar claves o entidades certificadoras, asegúrate de que los recursos no se usen.
Para crear tus claves, ejecuta los siguientes comandos:
Crea la clave de firma de ServiceAccount de Kubernetes, que también especificas como la clave de verificación de la cuenta de servicio durante la creación del clúster:
gcloud kms keys create sa-signing-key \ --keyring=KEY_RING_NAME \ --location=LOCATION \ --purpose="asymmetric-signing" \ --protection-level=hsm \ --default-algorithm=rsa-sign-pkcs1-4096-sha256 \ --project=KEY_PROJECT_ID
Reemplaza
KEY_PROJECT_ID
por el ID del proyecto de tu proyecto de claves dedicadas.Crea la clave de la CA raíz del clúster:
gcloud kms keys create cluster-ca-key \ --keyring=KEY_RING_NAME \ --location=LOCATION \ --purpose="asymmetric-signing" \ --protection-level=hsm \ --default-algorithm=ec-sign-p256-sha256 \ --project=KEY_PROJECT_ID
Crea la clave de la CA raíz del par de etcd:
gcloud kms keys create etcd-peer-ca-key \ --keyring=KEY_RING_NAME \ --location=LOCATION \ --purpose="asymmetric-signing" \ --protection-level=hsm \ --default-algorithm=ec-sign-p256-sha256 \ --project=KEY_PROJECT_ID
Crea la clave de CA raíz de la API de etcd:
gcloud kms keys create etcd-api-ca-key \ --keyring=KEY_RING_NAME \ --location=LOCATION \ --purpose="asymmetric-signing" \ --protection-level=hsm \ --default-algorithm=ec-sign-p256-sha256 \ --project=KEY_PROJECT_ID
Crea la clave de la CA raíz de agregación:
gcloud kms keys create aggregation-ca-key \ --keyring=KEY_RING_NAME \ --location=LOCATION \ --purpose="asymmetric-signing" \ --protection-level=hsm \ --default-algorithm=ec-sign-p256-sha256 \ --project=KEY_PROJECT_ID
Crea las AC
Después de crear las claves para cada una de las funciones del plano de control, usa cada clave para crear los grupos de CA y las CA raíz correspondientes con CA Service:
Crea el grupo de CA del clúster:
gcloud privateca pools create cluster-ca-pool \ --location=LOCATION \ --tier=enterprise \ --project=KEY_PROJECT_ID \ --no-publish-crl --no-publish-ca-cert
Las marcas
--no-publish-crl
y--no-publish-ca-cert
son opcionales. Si se omiten estos parámetros, se publicarán los certificados en un bucket de Cloud Storage. Para obtener más información, consulta Habilita la publicación de certificados de CA y CRL para las CA en un grupo de CA.Crea la CA raíz del clúster:
gcloud privateca roots create cluster-root-ca \ --pool=cluster-ca-pool \ --location=LOCATION \ --kms-key-version=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/cluster-ca-key/cryptoKeyVersions/1 \ --subject="CN=cluster-ca, O=ORGANIZATION" \ --project=KEY_PROJECT_ID \ --auto-enable
Reemplaza
ORGANIZATION
por el nombre de tu organización.Crea el grupo de CA de intercambio de tráfico de etcd:
gcloud privateca pools create etcd-peer-ca-pool \ --location=LOCATION \ --tier=enterprise \ --project=KEY_PROJECT_ID \ --no-publish-crl --no-publish-ca-cert
Crea la CA raíz del par de etcd:
gcloud privateca roots create etcd-peer-root-ca \ --pool=etcd-peer-ca-pool \ --location=LOCATION \ --kms-key-version=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/etcd-peer-ca-key/cryptoKeyVersions/1 \ --subject="CN=etcd-peer-ca, O=ORGANIZATION" \ --project=KEY_PROJECT_ID \ --auto-enable
Crea el grupo de AC de la API de etcd:
gcloud privateca pools create etcd-api-ca-pool \ --location=LOCATION \ --tier=enterprise \ --project=KEY_PROJECT_ID \ --no-publish-crl --no-publish-ca-cert
Crea la CA raíz de la API de etcd:
gcloud privateca roots create etcd-api-root-ca \ --pool=etcd-api-ca-pool \ --location=LOCATION \ --kms-key-version=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/etcd-api-ca-key/cryptoKeyVersions/1 \ --subject="CN=etcd-api-ca, O=ORGANIZATION" \ --project=KEY_PROJECT_ID \ --auto-enable
Crea el grupo de AC de agregación:
gcloud privateca pools create aggregation-ca-pool \ --location=LOCATION \ --tier=enterprise \ --project=KEY_PROJECT_ID \ --no-publish-crl --no-publish-ca-cert
Crea la CA raíz de agregación:
gcloud privateca roots create aggregation-root-ca \ --pool=aggregation-ca-pool \ --location=LOCATION \ --kms-key-version=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/aggregation-ca-key/cryptoKeyVersions/1 \ --subject="CN=aggregation-ca, O=ORGANIZATION" \ --project=KEY_PROJECT_ID \ --auto-enable
Otorga roles de IAM al agente de servicio de GKE
El agente de servicio de GKE requiere acceso a los recursos que creaste en Cloud KMS y en la CA de servicio. El agente de servicio usa estos recursos para firmar, verificar y emitir credenciales en el clúster. Puedes usar los siguientes roles predefinidos de IAM:
- Usuario de claves criptográficas de KMS de Kubernetes Engine
(
roles/container.cloudKmsKeyUser
) - Administrador de certificados del Servicio de CA
(
roles/privateca.certificateManager
)
Para otorgar estos roles al agente de servicio de GKE, haz lo siguiente:
Busca el número de proyecto de tu proyecto de clúster:
gcloud projects describe CLUSTER_PROJECT_ID \ --format='value(projectNumber)'
Reemplaza
CLUSTER_PROJECT_ID
por el ID del proyecto de tu proyecto de clúster.Otorga el rol de usuario de claves criptográficas de KMS de Kubernetes Engine en la clave de firma de la cuenta de servicio que creaste en Crea claves:
gcloud kms keys add-iam-policy-binding sa-signing-key \ --location=LOCATION \ --keyring=KEY_RING_NAME \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \ --role=roles/container.cloudKmsKeyUser \ --project=KEY_PROJECT_ID
Reemplaza
CLUSTER_PROJECT_NUMBER
por el número del proyecto del clúster.Otorga el rol de administrador de certificados del servicio de CA en los grupos de CA que creaste en Crea las CA:
gcloud privateca pools add-iam-policy-binding cluster-ca-pool \ --location=LOCATION \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \ --role=roles/privateca.certificateManager \ --project=KEY_PROJECT_ID gcloud privateca pools add-iam-policy-binding etcd-peer-ca-pool \ --location=LOCATION \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \ --role=roles/privateca.certificateManager \ --project=KEY_PROJECT_ID gcloud privateca pools add-iam-policy-binding etcd-api-ca-pool \ --location=LOCATION \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \ --role=roles/privateca.certificateManager \ --project=KEY_PROJECT_ID gcloud privateca pools add-iam-policy-binding aggregation-ca-pool \ --location=LOCATION \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \ --role=roles/privateca.certificateManager \ --project=KEY_PROJECT_ID
Otorga roles adicionales cuando no uses gcloud CLI
En esta sección, se describen los pasos de configuración adicionales que debes realizar si planeas configurar tus entidades de certificación y claves con un cliente como Terraform o la consola de Google Cloud en lugar de usar gcloud CLI. Si usas gcloud CLI, omite esta sección y ve a la sección Configura las AC y las claves en un clúster nuevo.
Cuando usas gcloud CLI para configurar tus AC y claves, como se describe en esta página, gcloud CLI crea y configura automáticamente un agente de servicio para el servicio de AC y le otorga roles de IAM. Sin embargo, si usas un cliente como Terraform o la consola de Google Cloud para configurar tu entorno de Google Cloud, debes realizar estos pasos de configuración de forma manual de la siguiente manera para tu proyecto clave:
Activa la creación del agente de servicio de CA Service.
gcloud beta services identity create --service=privateca.googleapis.com \ --project=KEY_PROJECT_ID
Busca el número de proyecto de tu proyecto clave:
gcloud projects describe KEY_PROJECT_ID \ --format='value(projectNumber)'
Otorga el rol de Visualizador (
roles/viewer
) y el rol de firmante/verificador de CryptoKey de Cloud KMS (roles/cloudkms.signerVerifier
) en todas las claves de la CA raíz que creaste en la sección Crea claves:for key in cluster-ca-key etcd-peer-ca-key etcd-api-ca-key aggregation-ca-key do gcloud kms keys add-iam-policy-binding $key \ --keyring=KEY_RING_NAME \ --location=LOCATION \ --role=roles/viewer \ --member="serviceAccount:service-KEY_PROJECT_NUMBER@gcp-sa-privateca.iam.gserviceaccount.com" \ --project=KEY_PROJECT_ID gcloud kms keys add-iam-policy-binding $key \ --keyring=KEY_RING_NAME \ --location=LOCATION \ --role=roles/cloudkms.signerVerifier \ --member="serviceAccount:service-KEY_PROJECT_NUMBER@gcp-sa-privateca.iam.gserviceaccount.com" \ --project=KEY_PROJECT_ID done
Reemplaza
KEY_PROJECT_NUMBER
por el número del proyecto clave del resultado del paso anterior.Este comando es un bucle
for
que itera a través de las claves de la CA raíz y otorga cada rol en esa clave al agente de servicio de CA Service. Si usaste nombres diferentes para las claves de la CA raíz, ejecuta estos comandos de forma manual para cada clave.
Configura las CAs y las claves en un clúster nuevo
Después de crear claves, grupos de CA y CAs raíz, y otorgar roles de IAM al agente de servicio de GKE, crea un clúster nuevo que use estos recursos.
Los parámetros que especificas en el comando de creación del clúster requieren las siguientes rutas de acceso de recursos como valores:
- Es la ruta de acceso a una versión de clave en Cloud KMS para la clave de firma de la cuenta de servicio que creaste en Crea claves. Especifica esta ruta de acceso para la marca
service-account-signing-keys
y para la marcaservice-account-verification-keys
. - Es la ruta de acceso a cada uno de los grupos de CA que creaste en Crea las CA.
Para configurar un clúster nuevo para que use tus claves y entidades certificadoras, sigue estos pasos:
Sigue estos pasos para encontrar la ruta de acceso a la versión más reciente de la clave de firma de la cuenta de servicio habilitada:
gcloud kms keys versions list \ --key=sa-signing-key \ --keyring=KEY_RING_NAME \ --location=LOCATION \ --project=KEY_PROJECT_ID \ --filter="STATE=ENABLED" --sort-by=~ --format="value(name)" | sed 1q
Reemplaza
KEY_PROJECT_ID
por el ID del proyecto de la clave.El resultado es similar a este:
projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1
Busca las rutas de acceso a cada uno de los grupos de CA que creaste:
gcloud privateca pools list --format="get(name)" \ --project=KEY_PROJECT_ID
El resultado es similar a este:
projects/KEY_PROJECT_ID/locations/LOCATION/caPools/cluster-ca-pool projects/KEY_PROJECT_ID/locations/LOCATION/caPools/etcd-peer-ca-pool projects/KEY_PROJECT_ID/locations/LOCATION/caPools/etcd-api-ca-pool projects/KEY_PROJECT_ID/locations/LOCATION/caPools/aggregation-ca-pool
Asegúrate de que el resultado contenga todos los grupos de CA que creaste para GKE.
Crea un clúster
En esta sección, crearás un clúster con diferentes opciones especificadas según las funciones de la autoridad del plano de control de GKE que desees configurar. Solo puedes configurar estas funciones en un clúster durante la creación del clúster. Los siguientes comandos crean clústeres en modo estándar. Para crear clústeres en modo Autopilot, usa las mismas marcas con el comando gcloud container clusters create-auto
.
Para configurar solo las AA y las claves que creaste en este instructivo, ejecuta el siguiente comando:
gcloud container clusters create example-cluster \ --location=LOCATION \ --project=CLUSTER_PROJECT_ID \ --cluster-version=VERSION \ --service-account-signing-keys=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1 \ --service-account-verification-keys=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1 \ --cluster-ca=projects/KEY_PROJECT_ID/locations/LOCATION/caPools/cluster-ca-pool \ --etcd-peer-ca=projects/KEY_PROJECT_ID/locations/LOCATION/caPools/etcd-peer-ca-pool \ --etcd-api-ca=projects/KEY_PROJECT_ID/locations/LOCATION/caPools/etcd-api-ca-pool \ --aggregation-ca=projects/KEY_PROJECT_ID/locations/LOCATION/caPools/aggregation-ca-pool
Reemplaza lo siguiente:
CLUSTER_PROJECT_ID
: Es el ID del proyecto del clúster.VERSION
: Es la versión de GKE del clúster. Debe ser 1.31.1-gke.1846000 o una versión posterior.
Para configurar las AA y las claves, así como la encriptación del disco de arranque del plano de control y la encriptación de etcd, haz lo siguiente:
- Realiza todos los pasos de configuración de claves en Encripta los discos de arranque de etcd y del plano de control.
- Para encontrar las rutas de acceso a cada una de las claves, sigue las instrucciones que se indican en Usa claves de encriptación en un clúster.
Crea un clúster:
gcloud container clusters create example-cluster \ --location=LOCATION \ --project=CLUSTER_PROJECT_ID \ --cluster-version=VERSION \ --service-account-signing-keys=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1 \ --service-account-verification-keys=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1 \ --cluster-ca=projects/KEY_PROJECT_ID/locations/LOCATION/caPools/cluster-ca-pool \ --etcd-peer-ca=projects/KEY_PROJECT_ID/locations/LOCATION/caPools/etcd-peer-ca-pool \ --etcd-api-ca=projects/KEY_PROJECT_ID/locations/LOCATION/caPools/etcd-api-ca-pool \ --aggregation-ca=projects/KEY_PROJECT_ID/locations/LOCATION/caPools/aggregation-ca-pool \ --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \ --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY
Reemplaza lo siguiente:
CLUSTER_PROJECT_ID
: Es el ID del proyecto del clúster.VERSION
: Es la versión de GKE del clúster. Debe ser 1.31.1-gke.1846000 o una versión posterior.PATH_TO_DISK_KEY
: Es la ruta de acceso a la clave de encriptación del disco.PATH_TO_ETCD_BACKUP_KEY
: Es la ruta de acceso a la clave de encriptación de la copia de seguridad interna de etcd.
También puedes usar estas marcas cuando creas un clúster nuevo en modo estándar.
Verifica que el clúster use las claves y las CA que especificaste
En esta sección, se muestra cómo verificar las claves y las entidades certificadoras que se usaron durante la creación del clúster. Puedes realizar esta verificación con Cloud Logging o con Google Cloud CLI.
Usa el registro para verificar las claves y las entidades certificadoras
Para verificar las claves y las entidades certificadoras con Logging, haz lo siguiente:
En la consola de Google Cloud , ve a la página Explorador de registros.
Especifica la siguiente consulta:
resource.type="gke_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.location="CLUSTER_LOCATION" protoPayload.serviceName="container.googleapis.com" protoPayload.methodName=~"google.container.v(1|1alpha1|1beta1).ClusterManager.CreateCluster" protoPayload.request.cluster.userManagedKeysConfig:*
protoPayload.request.cluster.userManagedKeysConfig:*
filtra los resultados de los registros de creación de clústeres que incluyen claves y entidades certificadoras que administras.Haz clic en Ejecutar consulta.
En los resultados, expande el registro de creación del clúster. Verifica que las rutas de acceso a las claves y las entidades de certificación sean las mismas que las que creaste para ese clúster, como en el siguiente ejemplo:
# lines omitted for clarity
userManagedKeysConfig: {
aggregationCa: "projects/KEY_PROJECT_ID/locations/LOCATION/caPools/aggregation-ca-pool"
clusterCa: "projects/KEY_PROJECT_ID/locations/LOCATION/caPools/cluster-ca-pool"
etcdApiCa: "projects/KEY_PROJECT_ID/locations/LOCATION/caPools/etcd-api-ca-pool"
etcdPeerCa: "projects/KEY_PROJECT_ID/locations/LOCATION/caPools/etcd-peer-ca-pool"
serviceAccountSigningKeys: [
0: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1"
]
serviceAccountVerificationKeys: [
0: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1"
]
}
Usa gcloud CLI para verificar las claves y las entidades de certificación
Para verificar que el clúster use las AA y las claves que creaste, ejecuta el siguiente comando:
gcloud container clusters describe example-cluster \
--location=LOCATION \
--project=CLUSTER_PROJECT_ID
El resultado debe incluir el campo userManagedKeysConfig
, como en el siguiente ejemplo:
# lines omitted for clarity
userManagedKeysConfig:
sa-signing-key: projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1
sa-verification-key: projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1
cluster-ca: projects/KEY_PROJECT_ID/locations/LOCATION/caPools/cluster-ca-pool
etcd-peer-ca: projects/KEY_PROJECT_ID/locations/LOCATION/caPools/etcd-peer-ca-pool
etcd-api-ca: projects/KEY_PROJECT_ID/locations/LOCATION/caPools/etcd-api-ca-pool
aggregation-ca: projects/KEY_PROJECT_ID/locations/LOCATION/caPools/aggregation-ca-pool