Emitir certificados que certifiquen la identidad de terceros
En este instructivo, se muestra cómo puedes emitir certificados que certifiquen la identidad de terceros con la reflexión de identidad y los grupos de Workload Identity.
Puedes usar la reflexión de identidad para crear certificados que coincidan con la identidad verificada de un solicitante de certificados. Con la reflexión de identidad, puedes limitar a un solicitante de certificados sin privilegios para que solo solicite certificados con un nombre alternativo del asunto (SAN) que corresponda a la identidad en su credencial.
Objetivos
En este instructivo, se proporciona información sobre cómo puedes usar el servicio de CA con grupos de Workload Identity para federar una identidad de terceros y obtener un certificado que certifique esta identidad.
Antes de comenzar
Antes de comenzar, asegúrate de comprender los siguientes conceptos:
- Grupos de Workload Identity: Los grupos de Workload Identity te permiten administrar proveedores de identidad externos. Para obtener más información, consulta Administra proveedores y grupos de Workload Identity.
- Federación de identidades para cargas de trabajo: La federación de identidades para cargas de trabajo aprovecha los grupos de Workload Identity para otorgar acceso a los Google Cloud servicios a identidades externas. Para obtener más información, consulta Federación de identidades para cargas de trabajo.
- Servicio de tokens de seguridad (STS): El servicio de tokens de seguridad te permite intercambiar credenciales externas por tokens de origen (Google Cloud). Para obtener más información, consulta Servicio de tokens de seguridad.
- Reflexión de identidad: La función de reflexión de identidad permite que la identidad verificada de un solicitante de certificados pase al certificado solicitado. Para obtener más información, consulta Reflexión de identidad.
Asegúrate de tener los siguientes roles de IAM:
- Para administrar autoridades certificadoras (AC) y grupos de AC, y solicitar certificados, debes tener el rol de administrador de operaciones del servicio de CA (
privateca.caManager). Para obtener más información sobre los roles de IAM para el servicio de CA, consulta Control de acceso con IAM. - Para administrar grupos de identidades para cargas de trabajo y proveedores, debes tener el rol de administrador de grupos de identidades para cargas de trabajo (
iam.workloadIdentityPoolAdmin). - Para crear una cuenta de servicio, debes tener el rol de administrador de cuentas de servicio (
iam.serviceAccountAdmin).
Para obtener información sobre cómo otorgar roles de IAM, consulta Administración del acceso a proyectos, carpetas y organizaciones. Puedes otorgar los roles de IAM necesarios a una Cuenta de Google, una cuenta de servicio, un grupo de Google, una cuenta de Google Workspace o un dominio de Cloud Identity.
Configura un grupo de identidades para cargas de trabajo y un proveedor
En este instructivo, se explica cómo puedes usar un proveedor de OpenID Connect (OIDC) de Google combinado con una cuenta de servicio para que actúe como una identidad externa. El proveedor de OIDC de Cuentas de Google actúa como un proveedor de identidad (IdP) externo y la Google Cloud cuenta de servicio es una identidad externa de muestra que este IdP afirma.
Los grupos de Workload Identity admiten una variedad de proveedores de identidad, incluidos Microsoft Azure/Active Directory local, AWS y proveedores de identidad basados en SAML.
Para configurar un grupo de identidades para cargas de trabajo y un proveedor, haz lo siguiente:
Para representar un conjunto de identidades federadas de confianza, crea un grupo de Workload Identity:
gcloud iam workload-identity-pools create IDENTITY_POOL_ID --location global --display-name "tutorial-wip"Reemplaza lo siguiente:
- IDENTITY_POOL_ID: Es el identificador único del nuevo grupo de Workload Identity.
Crea un proveedor de grupos de identidades para cargas de trabajo para tu proveedor de identidad externo:
gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID --location global --workload-identity-pool IDENTITY_POOL_ID --display-name "tutorial-oidc" --attribute-mapping "google.subject=assertion.sub" --issuer-uri="https://accounts.google.com"Reemplaza lo siguiente:
- PROVIDER_ID: Es el identificador único del proveedor de identidad que deseas crear en el grupo de identidades para cargas de trabajo.
Puedes personalizar las siguientes marcas para tu caso de uso:
attribute-mapping: Esta marca establece la asignación entre las declaraciones externas a la declaración principal de Google,google.subject.google.subjectes una asignación obligatoria que puedes establecer en cualquier declaración o combinación de declaraciones con una CEL CEL. Para obtener más información, consulta Define una asignación y una condición de atributos.issuer-uri: Para los proveedores de OIDC, esta marca es un extremo de acceso público al que Google se comunica para verificar los tokens externos. Para obtener más información, consulta Prepara un proveedor de identidad externo.
Para obtener más información sobre la configuración de un proveedor de Workload Identity, consulta Configura la federación de Workload Identity.
Crea un grupo de AC y una AC emisora
En esta sección, se explica cómo puedes crear un grupo de AC y agregarle una AC raíz. Puedes usar este grupo de AC para emitir certificados reflejados en la identidad. Si deseas usar un grupo de AC y una AC existentes, puedes omitir esta sección.
En lugar de una AC raíz, también puedes crear una AC subordinada. La creación de una AC raíz ayuda a acortar el procedimiento.
Crea un grupo de AC en el nivel DevOps:
gcloud privateca pools create CA_POOL_ID --location LOCATION --tier devopsReemplaza lo siguiente:
- CA_POOL_ID - Es el ID del grupo de AC del servicio de CA que emite certificados.
- LOCATION - Es la ubicación del grupo de AC.
Para obtener más información sobre la creación de grupos de AC, consulta Crea un grupo de AC.
Crea una CA raíz:
gcloud privateca roots create CA_ID --pool CA_POOL_ID --location LOCATION --subject "CN=test,O=test-org"Reemplaza lo siguiente:
- CA_ID - Es el ID de la autoridad certificadora que emite certificados.
- CA_POOL_ID - Es el ID del grupo de AC del servicio de CA que emite certificados.
- LOCATION - Es la ubicación del grupo de AC.
Para obtener más información sobre la creación de una AC raíz, consulta Crea una AC raíz.
Habilita las identidades federadas del grupo de identidades para cargas de trabajo para emitir certificados del grupo de AC. La reflexión de identidad requiere el rol de IAM Solicitante de certificados de cargas de trabajo del servicio de CA (
roles/privateca.workloadCertificateRequester) para los solicitantes deCreateCertificate.Puedes representar entidades de grupos de identidades para cargas de trabajo en varios niveles de detalle, desde un solo sujeto hasta todas las identidades del grupo en todos los proveedores. Para obtener más información, consulta los principales o los conjuntos de principales que están disponibles (usa la pestaña de Google Cloud CLI) para que se adapten mejor a tu caso de uso.
gcloud privateca pools add-iam-policy-binding CA_POOL_ID --location LOCATION --role roles/privateca.workloadCertificateRequester --member "principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/*"Reemplaza lo siguiente:
- CA_POOL_ID: Es el ID del grupo de AC del servicio de CA que emite certificados.
- LOCATION: Es la ubicación del grupo de AC.
- PROJECT_NUMBER: Es el número del proyecto en el que creaste el grupo de identidades para cargas de trabajo.
- IDENTITY_POOL_ID: Es el identificador único del nuevo grupo de identidades para cargas de trabajo.
Crea una cuenta de servicio que represente una identidad externa
En el siguiente procedimiento, se supone que una cuenta de servicio representa a un tercero. En esta sección, se muestra cómo puedes usar el
GenerateIdToken
extremo de IAM para recuperar una identidad externa en forma de
token de OIDC. Según tu caso de uso, es posible que necesites diferentes pasos para obtener el token de identidad externa que elijas.
gcloud iam service-accounts create SERVICE_ACCOUNT
Reemplaza lo siguiente:
- SERVICE_ACCOUNT - Es el ID de la cuenta de servicio que representa la identidad externa.
Emite un certificado que certifique una identidad externa
Antes de comenzar, asegúrate de tener el rol de IAM de creador de tokens de cuentas de servicio (roles/iam.serviceAccountTokenCreator). Necesitas este rol de IAM para llamar a la API de GenerateIdToken.
Para obtener un certificado que certifique una identidad externa, haz lo siguiente:
Obtén un token de identidad externa de tu proveedor de identidad externo.
curl
export ID_TOKEN=`curl -d '{"audience":"//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID"}' -H 'Content-Type: application/json' -H "Authorization: Bearer $(gcloud auth print-access-token)" https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com:generateIdToken | python3 -c "import sys;import json;print(json.load(sys.stdin)['token'])"`Reemplaza lo siguiente:
- PROJECT_ID - Es el ID del proyecto en el que deseas crear recursos. Google Cloud
Bibliotecas cliente
.Para acceder al token externo de forma programática, puedes obtener un token de una credencial basada en archivos o una credencial basada en URL. Para obtener más información, consulta Autentica mediante bibliotecas cliente, gcloud CLI, o Terraform. En este instructivo, seguimos un flujo de trabajo de credenciales basadas en archivos.
Carga tu credencial en una ruta de acceso que pueda leer el solicitante de certificados:
curl -d '{"audience":"//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID"}' -H 'Content-Type: application/json' -H "Authorization: Bearer $(gcloud auth print-access-token)" https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com:generateIdToken | python3 -c "import sys;import json; print(json.load(sys.stdin)['token']) > /tmp/oidc_token.txtReemplaza lo siguiente:
- PROJECT_ID: Es el ID del proyecto en el que deseas crear recursos.
Intercambia tu token externo por un token de OAuth federado con el extremo
tokende STS:curl
export STS_TOKEN=`curl -L -X POST 'https://sts.googleapis.com/v1/token' -H 'Content-Type: application/json' \ -d '{ "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange", "audience": "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID", "requested_token_type": "urn:ietf:params:oauth:token-type:access_token", "scope": "https://www.googleapis.com/auth/cloud-platform", "subject_token": "'$ID_TOKEN'", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt" }' | python3 -c "import sys;import json; print(json.load(sys.stdin)['access_token'])"`Bibliotecas cliente
- Crea un archivo de configuración de credenciales llamado
oidc_token.txtque el código de solicitud de certificado pueda leer para realizar un intercambio de tokens.
gcloud iam workload-identity-pools create-cred-config projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID --output-file=/tmp/cred_config.json --credential-source-file=/tmp/oidc_token.txt- Lee el archivo
oidc_token.txtpara configurar el mecanismo de autorización en la biblioteca cliente:
python
import json from google.auth import identity_pool with open('/tmp/cred_config.json', 'r') as f: json_config_info = json.loads(f.read()) credentials = identity_pool.Credentials.from_info(json_config_info) scoped_credentials = credentials.with_scopes( ['https://www.googleapis.com/auth/cloud-platform'])- Crea un archivo de configuración de credenciales llamado
Realiza una solicitud al servicio de CA con el
REFLECTED_SPIFFEmodo de solicitud de asunto:curl
Opcional: Si no tienes una CSR, crea una ejecutando el siguiente comando.
export TUTORIAL_CSR=$(openssl req -newkey rsa:2048 -nodes -subj / -keyout tutorial_do_not_use.key)Solicita un certificado con la CSR, un tiempo de actividad y un modo de solicitud de asunto reflejado:
curl -H "Authorization: Bearer $(echo $STS_TOKEN)" https://privateca.googleapis.com/v1/projects/PROJECT_NUMBER/locations/LOCATION/caPools/CA_POOL_ID/certificates\?alt\=json -X POST -H "Content-Type: application/json" -H 'Accept: application/json' --data '{"lifetime": "100s", "pemCsr": "'$TUTORIAL_CSR'", "subjectMode": "REFLECTED_SPIFFE"}'
Bibliotecas cliente
Para reenviar el token de origen al servicio de CA, debes crear un cliente con credenciales. Luego, puedes usar este cliente con credenciales para realizar solicitudes de certificados:
Inicia un cliente con credenciales del servicio de CA:
python
caServiceClient = privateca_v1.CertificateAuthorityServiceClient(credentials=scoped_credentials)Solicita un certificado.
Python
Para autenticarte en el servicio de AC, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Verifica el certificado. Tu certificado debe tener un asunto que contenga un solo SAN de URI. El SAN que certifica una identidad tiene el siguiente formato:
spiffe://IDENTITY_POOL_ID.PROJECT_NUMBER.global.workload.id.goog/subject/<oidc_subject_number>Reemplaza lo siguiente:
- IDENTITY_POOL_ID: Es el identificador único del grupo de identidades para cargas de trabajo.
- PROJECT_NUMBER - Es el número del proyecto en el que creaste el grupo de identidades para cargas de trabajo.
Limpia
Para evitar que se generen cargos en tu Google Cloud cuenta por los recursos del servicio de CA que creaste siguiendo este documento, realiza las siguientes operaciones con Google Cloud CLI:
Borra la CA que creaste.
Inhabilita la CA:
gcloud privateca roots disable CA_ID --pool CA_POOL_ID --location LOCATIONReemplaza lo siguiente:
- CA_ID: Es el identificador único de la CA.
- CA_POOL_ID: Es el identificador único del grupo de AC.
- LOCATION: Es la ubicación del grupo de AC.
Borra la CA:
gcloud privateca roots delete CA_ID --pool CA_POOL_ID --location LOCATION --ignore-active-certificatesReemplaza lo siguiente:
- CA_ID: Es el identificador único de la CA.
- CA_POOL_ID: Es el identificador único del grupo de AC.
- LOCATION: Es la ubicación del grupo de AC.
Borra el grupo de AC que creaste.
gcloud privateca pools delete CA_POOL_ID --location LOCATIONReemplaza lo siguiente:
- CA_POOL_ID: Es el identificador único del grupo de AC.
- LOCATION: Es la ubicación del grupo de AC.
Para obtener más información sobre el comando
gcloud privateca pools delete, consulta gcloud privateca pools delete.Borra el grupo de identidades para cargas de trabajo que creaste:
gcloud iam workload-identity-pools delete IDENTITY_POOL_ID --location globalReemplaza lo siguiente:
- IDENTITY_POOL_ID: Es el identificador único del grupo de Workload Identity.
Borra la cuenta de servicio que creaste:
gcloud iam service-accounts delete SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.comReemplaza lo siguiente:
- SERVICE_ACCOUNT: Es el identificador único del grupo de Workload Identity.
- PROJECT_ID: Es el proyecto propietario de la cuenta de servicio.
El rol de IAM Solicitante de certificados de cargas de trabajo del servicio de CA (privateca.workloadCertificateRequester) restringe el asunto del certificado emitido solo a la identidad del solicitante. Asegúrate de que los usuarios o las cargas de trabajo que usan la función de reflexión de identidad solo tengan otorgado el rol de IAM Solicitante de certificados de cargas de trabajo del servicio de CA (privateca.workloadCertificateRequester). Para cumplir con el principio de privilegio mínimo, puedes evitar otorgar el rol de IAM Solicitante de certificados del servicio de CA (privateca.certificateRequester).
¿Qué sigue?
- Obtén información sobre los diversos controles de políticas que te permiten controlar las propiedades del certificado solicitado más allá de una identidad reflejada.
- Consulta cómo puedes configurar y administrar varios controles de políticas.