Emitir certificados que certifiquen la identidad de terceros

En este instructivo, se muestra cómo puedes emitir certificados que certifiquen un identidad de terceros con reflexión sobre la identidad y grupos de identidades para cargas de trabajo.

Puedes usar la reflexión de identidad para crear certificados que coincidan con la verificación la identidad de un solicitante de certificado. Con la reflexión de identidad, puedes limitar solicitante de certificados sin privilegios a solicitar solo certificados con un nombre alternativo del sujeto (SAN) que corresponda a la identidad en su de Google Cloud.

Objetivos

En este instructivo, se proporciona información sobre cómo puedes usar CA Service con grupos de Workload Identity para federar una identidad de terceros y obtener un que acredite esa identidad.

Antes de comenzar

Antes de comenzar, asegúrate de comprender los siguientes conceptos:

  • Grupos de identidades para cargas de trabajo: Los grupos de identidades para cargas de trabajo te permiten administrar contenido proveedores de identidad. Para obtener más información, consulta Administra grupos y proveedores de Workload Identity.
  • Federación de identidades para cargas de trabajo: La federación de identidades para cargas de trabajo aprovecha la grupos de identidades para cargas de trabajo para otorgar a las identidades de terceros acceso a Google Cloud de Google Cloud. Para obtener más información, consulta Workload Identity federación pública.
  • Servicio de tokens de seguridad (STS): El servicio de tokens de seguridad te permite intercambiar credenciales de terceros para tokens propios (Google Cloud). Para ver más consulta Servicio de tokens de seguridad.
  • Reflexión de identidad: La función de reflexión de identidad permite de un solicitante de un certificado ir al certificado solicitado. Para más información, consulta Identidad reflexión.

Asegúrate de tener los siguientes elementos de IAM roles:

  • Administrar autoridades certificadoras (AC) y grupos de AC, y solicitar certificados, debes tener el administrador (privateca.caManager). Obtén más información sobre IAM para CA Service, consulta Control de acceso con la IAM.
  • Para administrar grupos y proveedores de Workload Identity, debes tener el Rol Administrador de grupos de Workload Identity (iam.workloadIdentityPoolAdmin).
  • Para crear una cuenta de servicio, debes contar con el administrador (iam.serviceAccountAdmin).

Para obtener información sobre cómo otorgar roles de IAM, consulta Administra el acceso a los proyectos, las carpetas organizaciones. Puedes otorgarle al 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 y un proveedor de Workload Identity

En este instructivo, se explica cómo usar Google OpenID Connect (OIDC) de servicios combinados con una cuenta de servicio para que actúe como identidad de terceros. El El proveedor de OIDC de Cuentas de Google actúa como un proveedor de identidad (IdP) de terceros y la cuenta de servicio de Google Cloud es una identidad de terceros de muestra que confirma este IdP.

Los grupos de identidades para cargas de trabajo admiten una variedad de proveedores de identidad, como Active Directory local/Microsoft Azure, AWS y basado en SAML proveedores de identidad.

Para configurar un grupo y un proveedor de Workload Identity, haz lo siguiente: 1) Para representar un conjunto de identidades federadas de confianza, crea una carga de trabajo. grupo de identidades:

```
gcloud iam workload-identity-pools create IDENTITY_POOL_ID --location global --display-name "tutorial-wip"
```

Replace the following:

- <var>IDENTITY_POOL_ID</var>: The unique identifier of the new workload
  identity pool.
  1. Crea un proveedor de grupos de identidades para cargas de trabajo para tu identidad de terceros proveedor de servicios de nube:

    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 quieres crear en el grupo de Workload Identity.

    Puedes personalizar las siguientes marcas según tu caso de uso:

    • attribute-mapping: Esta marca establece la asignación entre el tercero reclamaciones a la reclamación principal de Google, google.subject. google.subject es una asignación obligatoria que puedes configurar para cualquier reclamo o combinación de declaraciones con un protocolo CEL expresión. Para obtener más información, consulta Define una asignación de atributo y condition [estado].
    • issuer-uri: Para los proveedores de OIDC, esta marca es de acceso público extremo con el que Google se comunica para verificar información tokens. Para obtener más información, consulta Prepara una identidad externa. proveedor.

    Obtén más información para configurar Workload Identity consulta Configura Workload Identity federación pública.

Crea un grupo de AC y una AC emisora

En esta sección, se explica cómo crear un grupo de AC y agregar una raíz AC. Puedes usar este grupo de AC para emitir verificaciones de identidad reflejadas certificados. Si quieres usar un grupo de AC y una AC existentes, puedes omitir este paso. sección.

En lugar de una AC raíz, también puedes optar por crear una AC subordinada. Creando una AC raíz ayuda a acortar el procedimiento.

  1. Crea un grupo de AC en el nivel de DevOps:

    gcloud privateca pools create CA_POOL_ID --location LOCATION --tier devops
    

    Reemplaza lo siguiente:

    • CA_POOL_ID: Es el ID del grupo de AC del Servicio de AC 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.

  2. 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 AC que emite certificados.
    • LOCATION: Es la ubicación del grupo de AC.

    Para obtener más información sobre cómo crear una AC raíz, consulta Crea una AC raíz.

  3. Habilitar las identidades federadas del grupo de identidades para cargas de trabajo para emitir certificados del grupo de AC. La reflexión de la identidad requiere la Solicitante de certificados de cargas de trabajo del servicio de CA (roles/privateca.workloadCertificateRequester) rol de IAM para los solicitantes de CreateCertificate.

    Puedes representar los principales de un grupo de identidades para cargas de trabajo con varios niveles de detalle. que van desde un único sujeto hasta todas las identidades del grupo de proveedores. Para obtener más información, consulta las principales o conjuntos de principales disponibles (usa la pestaña de Google Cloud CLI) según 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:

    • PROJECT_NUMBER: Es el número del proyecto en el que creó el grupo de identidades para cargas de trabajo.

Crea una cuenta de servicio que represente una identidad de terceros

En el siguiente procedimiento, se da por sentado que una cuenta de servicio representa un de terceros. En esta sección, se muestra cómo puedes usar la GenerateIdToken extremo de IAM para recuperar una identidad de terceros en forma de un token de OIDC. Según el caso de uso, podrías necesitar diferentes pasos para obtener el token de identidad de terceros que elijas.

gcloud iam service-accounts create SERVICE_ACCOUNT

Reemplaza lo siguiente:

  • SERVICE_ACCOUNT: El ID de la cuenta de servicio que representa la con la identidad de terceros.

Emitir un certificado que certifique la identidad de un tercero

Antes de comenzar, asegúrate de tener el Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) de IAM. Lo necesitas Rol de IAM para llamar a la API de GenerateIdToken.

Para obtener un certificado que acredite la identidad de un tercero, haz lo siguiente: lo siguiente:

  1. Obtén un token de identidad de terceros de tu proveedor de identidad de terceros.

    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 de Google Cloud para el proyecto que en las que quieres crear recursos.

    Bibliotecas cliente

    Para acceder al token de terceros de manera programática, puedes obtener un token de un una credencial basada en archivos o una credencial basada en la URL. Para obtener más información, consulta Autenticación con bibliotecas cliente, gcloud CLI, o Terraform. En este instructivo, seguimos un flujo de trabajo de credenciales de fuente de archivos.

    Carga tu credencial en una ruta legible para tu certificado solicitante:

    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.txt
    

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto en las que quieres crear recursos.
  2. Intercambia tu token de terceros por un token de OAuth federado mediante STS Extremo token:

    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

    1. Crea una credencial de configuración llamado oidc_token.txt que el certificado que solicita código puede leer para realizar un intercambio de token.
    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
    
    1. Lee el archivo oidc_token.txt para configurar el mecanismo de autorización en el cliente biblioteca:

    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'])
    
  3. Realiza una solicitud al servicio de CA con el Modo de solicitud del sujeto de REFLECTED_SPIFFE:

    curl

    1. Opcional: Si no tienes un CSR, crea uno con la siguiente comando.

      export TUTORIAL_CSR=$(openssl req -newkey rsa:2048 -nodes -subj / -keyout tutorial_do_not_use.key)
      
    2. Solicita un certificado con la CSR, un ciclo de vida y un certificado modo de solicitud de asunto:

      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 propio al Servicio de CA, debes hacer lo siguiente: crear un cliente con credenciales. Luego, puedes usar este cliente con credenciales para realizar solicitudes de certificados:

    1. Inicia un cliente del Servicio de CA con credenciales:

      python

      caServiceClient = privateca_v1.CertificateAuthorityServiceClient(credentials=scoped_credentials)
      
    2. Solicita un certificado.

      Python

      Para autenticarte en CA Service, 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.

      import google.cloud.security.privateca_v1 as privateca_v1
      from google.protobuf import duration_pb2
      
      
      def create_certificate(
          project_id: str,
          location: str,
          ca_pool_name: str,
          ca_name: str,
          certificate_name: str,
          common_name: str,
          domain_name: str,
          certificate_lifetime: int,
          public_key_bytes: bytes,
      ) -> None:
          """
          Create a Certificate which is issued by the Certificate Authority present in the CA Pool.
          The key used to sign the certificate is created by the Cloud KMS.
      
          Args:
              project_id: project ID or project number of the Cloud project you want to use.
              location: location you want to use. For a list of locations, see: https://cloud.google.com/certificate-authority-service/docs/locations.
              ca_pool_name: set a unique name for the CA pool.
              ca_name: the name of the certificate authority which issues the certificate.
              certificate_name: set a unique name for the certificate.
              common_name: a title for your certificate.
              domain_name: fully qualified domain name for your certificate.
              certificate_lifetime: the validity of the certificate in seconds.
              public_key_bytes: public key used in signing the certificates.
          """
      
          caServiceClient = privateca_v1.CertificateAuthorityServiceClient()
      
          # The public key used to sign the certificate can be generated using any crypto library/framework.
          # Also you can use Cloud KMS to retrieve an already created public key.
          # For more info, see: https://cloud.google.com/kms/docs/retrieve-public-key.
      
          # Set the Public Key and its format.
          public_key = privateca_v1.PublicKey(
              key=public_key_bytes,
              format_=privateca_v1.PublicKey.KeyFormat.PEM,
          )
      
          subject_config = privateca_v1.CertificateConfig.SubjectConfig(
              subject=privateca_v1.Subject(common_name=common_name),
              subject_alt_name=privateca_v1.SubjectAltNames(dns_names=[domain_name]),
          )
      
          # Set the X.509 fields required for the certificate.
          x509_parameters = privateca_v1.X509Parameters(
              key_usage=privateca_v1.KeyUsage(
                  base_key_usage=privateca_v1.KeyUsage.KeyUsageOptions(
                      digital_signature=True,
                      key_encipherment=True,
                  ),
                  extended_key_usage=privateca_v1.KeyUsage.ExtendedKeyUsageOptions(
                      server_auth=True,
                      client_auth=True,
                  ),
              ),
          )
      
          # Create certificate.
          certificate = privateca_v1.Certificate(
              config=privateca_v1.CertificateConfig(
                  public_key=public_key,
                  subject_config=subject_config,
                  x509_config=x509_parameters,
              ),
              lifetime=duration_pb2.Duration(seconds=certificate_lifetime),
          )
      
          # Create the Certificate Request.
          request = privateca_v1.CreateCertificateRequest(
              parent=caServiceClient.ca_pool_path(project_id, location, ca_pool_name),
              certificate_id=certificate_name,
              certificate=certificate,
              issuing_certificate_authority_id=ca_name,
          )
          result = caServiceClient.create_certificate(request=request)
      
          print("Certificate creation result:", result)
      

    3. Verifica el certificado. El certificado debe tener un asunto con un solo URI SAN. La SAN que certifica una identidad es en 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 Workload Identity.
      • PROJECT_NUMBER: el número de proyecto del proyecto en en el que creaste el grupo de Workload Identity.

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por el Los recursos de CA Service que creaste luego de este documento las siguientes operaciones con Google Cloud CLI:

  1. Borra la AC que creaste.

    1. Inhabilita la AC:

      gcloud privateca roots disable CA_ID --pool CA_POOL_ID  --location LOCATION
      

      Reemplaza lo siguiente:

      • CA_ID: Es el identificador único de la AC.
      • CA_POOL_ID: Es el identificador único del grupo de AC.
      • LOCATION: Es la ubicación del grupo de AC.
    2. Borra la AC:

      gcloud privateca roots delete CA_ID --pool CA_POOL_ID  --location LOCATION --ignore-active-certificates
      

      Reemplaza lo siguiente:

      • CA_ID: Es el identificador único de la AC.
      • CA_POOL_ID: Es el identificador único del grupo de AC.
      • LOCATION: Es la ubicación del grupo de AC.
  2. Borra el grupo de AC que creaste.

    gcloud privateca pools delete CA_POOL_ID --location LOCATION
    

    Reemplaza 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 groups delete.

  3. Borra el grupo de identidades para cargas de trabajo que creaste:

    gcloud iam workload-identity-pools delete IDENTITY_POOL_ID --location global
    

    Reemplaza lo siguiente:

    • IDENTITY_POOL_ID: Es el identificador único de la carga de trabajo. de identidades para usuarios.
  4. Borra la cuenta de servicio que creaste:

    gcloud iam service-accounts delete SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com
    

    Reemplaza lo siguiente:

    • SERVICE_ACCOUNT: Es el identificador único de la carga de trabajo. de identidades para usuarios.
    • PROJECT_ID: Es el proyecto que posee la cuenta de servicio.

La carga de trabajo del servicio de CA Solicitante de certificado (privateca.workloadCertificateRequester) El rol de IAM restringe el asunto del certificado emitido a solo la identidad del solicitante. Asegúrate de que los usuarios o las cargas de trabajo que usan la identidad de reflexión solo tienen acceso al rol de Solicitante de certificados de cargas de trabajo (privateca.workloadCertificateRequester) de IAM. Para cumplir con el principio de privilegio mínimo, puedes evita otorgar al solicitante de certificados del Servicio de CA (privateca.certificateRequester) de IAM.

¿Qué sigue?