Autenticarse con cuentas de servicio

Las cuentas de servicio son las cuentas que usan las cargas de trabajo o los servicios para consumir recursos y acceder a microservicios de forma segura mediante programación. Son un tipo especial de identidad que usan las aplicaciones o las cargas de trabajo en lugar de las personas. Al igual que las cuentas de usuario, las cuentas de servicio pueden tener permisos y roles, pero no pueden iniciar sesión como un usuario humano.

Las cuentas de servicio son útiles para gestionar la infraestructura aislada de Google Distributed Cloud (GDC), como la siguiente:

  • Servicios y cargas de trabajo internos de Distributed Cloud para acceder de forma segura a la interfaz de programación de aplicaciones (API) del plano de control de Distributed Cloud. Por ejemplo, los servicios de bases de datos interactúan con las APIs de Kubernetes para crear y eliminar bases de datos.
  • Cargas de trabajo de los clientes en Distributed Cloud para acceder a los servicios de Distributed Cloud y hacer llamadas autorizadas a la interfaz de programación de aplicaciones (API). Por ejemplo, las cuentas de servicio pueden gestionar a un cliente mediante un cuaderno de Vertex AI Workbench para transcribir archivos de audio con la API Speech-to-Text.
  • Cargas de trabajo externas para federar con Distributed Cloud. Por ejemplo, las cuentas de servicio pueden gestionar una aplicación externa a Distributed Cloud que digitalice documentos, pero que quiera usar la API de reconocimiento óptico de caracteres (OCR) para sustituir su motor de OCR actual.
  • Servicios de Distributed Cloud o controladores del sistema para acceder de forma segura a los recursos de los clientes o a los clústeres de usuarios. Por ejemplo, las cuentas de servicio pueden gestionar flujos de trabajo de autenticación y autorización en los que los controladores de servicio que se ejecutan en clústeres de administrador necesitan ejecutar cargas de trabajo en los clústeres de usuario que gestionan los clientes.

Puedes gestionar las cuentas mediante la consola de GDC, la CLI de gdcloud o la API. Con la CLI de gdcloud, la función de identidad de servicio se basa en la API global ProjectServiceAccount. Como las cuentas de servicio se configuran de forma global, funcionan en todas las zonas de tu universo de gdcloud.

Antes de empezar

Solo puedes crear cuentas de servicio en un proyecto. Para obtener más información sobre cómo crear un proyecto, consulta el artículo Crear un proyecto.

Crear una identidad de servicio

Para obtener los permisos necesarios para crear cuentas de servicio, pide al administrador de gestión de identidades y accesos del proyecto que te conceda el rol Administrador de gestión de identidades y accesos del proyecto (project-iam-admin).

Los usuarios con acceso a cuentas de servicio pueden acceder a todas las cuentas de servicio de un proyecto.

Para crear cuentas de servicio en un proyecto, usa la consola de GDC, la CLI de gdcloud o la API.

Consola

  1. Inicia sesión en la consola de GDC.
  2. En el menú de navegación, selecciona Identidad y acceso > Identidades de servicio.
  3. Haz clic en Crear identidad de servicio. Se abrirá la página Detalles de la identidad de servicio.
  4. En el campo Nombre de identidad de servicio, escribe un nombre para tu identidad de servicio. Por ejemplo: testserviceidentity.
  5. Haz clic en Crear.

gdcloud

Crea una identidad de servicio:

gdcloud iam service-accounts create NAME \
    --project=PROJECT

Sustituye los siguientes valores:

  • NAME: el nombre de la ProjectServiceAccount. El nombre debe ser único en el espacio de nombres del proyecto.
  • PROJECT: el proyecto en el que se va a crear la identidad de servicio. Si gdcloud init ya está definido, omite la marca --project.

Este comando crea un ProjectServiceAccount en el espacio de nombres del proyecto en el servidor de la API Management.

API

  1. Crea un archivo YAML de recursos personalizados ProjectServiceAccount, como el siguiente: my-project-sa.yaml

    apiVersion: resourcemanager.global.gdc.goog/v1
    kind: ProjectServiceAccount
    metadata:
      name: NAME
      namespace: PROJECT
    spec:
      keys:
      - algorithm: ALGORITHM
      id: KEY_ID
      key: BASE64_ENCODED_KEY
      validAfter: "START_TIME"
      validBefore: "EXPIRATION_TIME"
    

    Sustituye las siguientes variables:

    • NAME: el nombre del ProjectServiceAccount recurso. El nombre debe ser único en el espacio de nombres del proyecto.
    • PROJECT: el proyecto en el que se va a crear la identidad de servicio.
    • ALGORITHM: el algoritmo de la clave. Solo se admiten claves ES256.
    • KEY_ID: identificador único de la clave. El ID se usa para determinar con qué clave se debe verificar.
    • BASE64_ENCODED_KEY: la clave pública codificada en base64 en formato PEM con la que se verificará. La clave privada utilizada para generar esta clave pública debe tener el formato PEM de ECDSA P256.
    • START_TIME: la hora de inicio en la que la clave pasa a ser válida, como 2025-02-07T00:59:34Z.
    • EXPIRATION_TIME: la hora de vencimiento de la clave, como 2026-02-07T00:59:34Z.
  2. Aplica el recurso personalizado ProjectServiceAccount al servidor de la API global:

    kubectl --kubeconfig GLOBAL_API_SERVER_KUBECONFIG apply -f my-project-sa.yaml
    

    Sustituye la variable GLOBAL_API_SERVER_KUBECONFIG por la ruta al archivo kubeconfig del servidor de la API global.

Ver identidades de servicio

Para ver una lista de las cuentas de servicio de un proyecto, usa la consola de GDC o la CLI de gdcloud.

Consola

  1. Inicia sesión en la consola de GDC.
  2. Selecciona un proyecto.
  3. En el menú de navegación, haz clic en Identidad y acceso > Identidades de servicio para ver la lista de cuentas de servicio del proyecto.

gdcloud

Lista de cuentas de servicio de un proyecto:

gdcloud iam service-accounts list \
    --project=PROJECT

Asignar una vinculación de rol a la identidad del servicio

Para asignar una vinculación de rol, debes tener los permisos adecuados. Para obtener los permisos necesarios para asignar roles, pide al administrador de gestión de identidades y accesos de tu proyecto que te conceda el rol Administrador de gestión de identidades y accesos de proyectos (project-iam-admin).

Usa la consola de GDC o la CLI de gdcloud para asignar un enlace de rol.

Consola

  1. Inicia sesión en la consola de GDC.
  2. Selecciona un proyecto.
  3. En el menú de navegación, selecciona Identidad y acceso > Acceso.
  4. En la lista Miembro, haz clic en Añadir miembro. Verás la página Usuarios y roles.
  5. Selecciona Identidad de servicio en la lista Tipo de miembro.
  6. En la lista Identidad de servicio, selecciona la identidad de servicio a la que quieras asignar una vinculación de rol.
  7. En la lista Rol, selecciona el rol que quieras asignar a la identidad de servicio, como Creador de copias de seguridad.
  8. Opcional: Para añadir otro rol, haz clic en Añadir otro rol. Selecciona el rol adicional.
  9. Haz clic en Añadir.

gdcloud

Este comando crea y asigna un nombre al enlace de rol de proyecto para vincular el rol especificado con ProjectServiceAccount en el servidor de la API Management:

gdcloud iam service-accounts add-iam-policy-binding \
    --project=PROJECT \
    --role=ROLE \
    --role-namespace=ROLE_NAMESPACE \
    --iam-account=NAME

Sustituye los siguientes valores:

  • PROJECT: el proyecto en el que se va a crear el enlace de rol. Si gdcloud init ya está configurado, puedes omitir la marca --project.
  • ROLE: el rol predefinido que se asignará al ProjectServiceAccount. Especifica los roles con el formato Role/name, donde Role es el tipo de Kubernetes IAMRole y name es el nombre del rol predefinido. Por ejemplo, para asignar el rol Lector de proyecto, define el rol como IAMRole/project-viewer.
  • ROLE_NAMESPACE: el espacio de nombres del rol que se va a vincular con la cuenta de servicio. Esto solo se aplica si tu universo tiene varias zonas.
  • NAME: el nombre de la identidad de servicio que se va a usar.

Eliminar una identidad de servicio

Para eliminar cuentas de servicio de un proyecto, usa la consola de GDC o la CLI de gdcloud.

Después de eliminar una identidad de servicio, las aplicaciones no tienen acceso a los recursos del proyecto a través de esa identidad de servicio.

Consola

  1. Inicia sesión en la consola de GDC.
  2. En el menú de navegación, selecciona Identidad y acceso > Identidades de servicio.
  3. Marca la casilla de la identidad de servicio que quieras eliminar.
  4. Haz clic en Eliminar.
  5. Aparecerá el cuadro de diálogo de confirmación. En el campo Para confirmar la operación, escribe lo que se indica a continuación, introduce remove.
  6. Haz clic en Eliminar.

gdcloud

Ejecuta el siguiente comando para eliminar una identidad de servicio:

gdcloud iam service-accounts delete NAME \
    --project=PROJECT

Crear y añadir pares de claves

Para crear y añadir pares de claves en un proyecto, usa la consola de GDC, la CLI de gdcloud o la API.

Consola

  1. Inicia sesión en la consola de GDC.
  2. En el menú de navegación, selecciona Identidad y acceso > Identidades de servicio.
  3. Haga clic en el nombre de la identidad de servicio que quiera añadir a la clave.
  4. Haz clic en Crear clave.
  5. La nueva clave aparece en la lista Claves y un cuadro de diálogo confirma que la has creado correctamente.

gdcloud

El comando gdcloud crea el archivo JSON de las credenciales predeterminadas de la aplicación y los pares de claves pública y privada:

gdcloud iam service-accounts keys create APPLICATION_DEFAULT_CREDENTIALS_FILENAME \
    --project=PROJECT \
    --iam-account=NAME \
    --ca-cert-path=CA_CERTIFICATE_PATH

Sustituye los siguientes valores:

  • APPLICATION_DEFAULT_CREDENTIALS_FILENAME: el nombre del archivo JSON.
  • PROJECT : selecciona el proyecto para el que se va a crear la clave. Si gdcloud init ya está configurado, puedes omitir la marca --project.
  • NAME: el nombre de la identidad de servicio a la que se va a añadir la clave.
  • CA_CERTIFICATE_PATH: opcional: la ruta del certificado de la autoridad de certificación (CA) para verificar el endpoint de autenticación. Si no especifica esta ruta, se usarán los certificados de CA del sistema. Debes instalar la CA en los certificados de CA del sistema.

Distributed Cloud añade la clave pública a las ProjectServiceAccount claves que usas para verificar los tokens web JSON (JWT) que firma la clave privada. La clave privada se escribe en el archivo JSON de las credenciales predeterminadas de la aplicación.

En el siguiente ejemplo se muestra el archivo JSON de las credenciales predeterminadas de la aplicación:

{
"type": "gdch_service_account",
"format_version": "1",
"project": "project_name",
"private_key_id": "abcdef1234567890",
"private_key": "-----BEGIN PRIVATE KEY-----\nETC\n-----END PRIVATE KEY-----\n",
"name": "service_identity_name",
"ca_cert_path": "service_identity_name",
"token_uri": "https://service-identity.<Domain>/authenticate"
}

En este ejemplo se usan los siguientes valores:

  • project: el espacio de nombres del proyecto en la organización.
  • private_key_id: el ID asignado a la clave.
  • private_key: la clave privada ECDSA P256 en formato PEM que genera la CLI.
  • name: el nombre de la identidad de servicio.
  • token_uri: la dirección del endpoint de autenticación.

API

  1. Genera el par de claves pública y privada. En los siguientes comandos se usa openssl como ejemplo, que es una herramienta habitual para este fin.

    openssl ecparam -name prime256v1 -genkey -noout -out "key.pem"
    openssl ec -in "key.pem" -pubout > "pub.pem"
    
  2. Codifica en base64 la clave pública y obtén su ID de clave:

    KEY_ID=$(openssl pkey -in key.pem -pubout -outform der | openssl dgst -sha256 | sed 's/^.* //')
    BASE64_ENCODED_KEY=$(cat pub.pem | base64)
    
  3. Crea o actualiza el archivo YAML de ProjectServiceAccountrecurso personalizado, incluida la información de la clave generada en el paso anterior:

    apiVersion: resourcemanager.global.gdc.goog/v1
    kind: ProjectServiceAccount
    metadata:
      name: NAME
      namespace: PROJECT
    spec:
      keys:
      - algorithm: ALGORITHM
      id: KEY_ID
      key: BASE64_ENCODED_KEY
      validAfter: "START_TIME"
      validBefore: "EXPIRATION_TIME"
    

    Sustituye las siguientes variables:

    • NAME: el nombre del ProjectServiceAccount recurso. El nombre debe ser único en el espacio de nombres del proyecto.
    • PROJECT: el proyecto en el que vas a crear la clave.
    • ALGORITHM: el algoritmo de la clave. Solo se admiten claves ES256.
    • KEY_ID: identificador único de la clave. El ID se usa para determinar con qué clave se debe verificar.
    • BASE64_ENCODED_KEY: la clave pública codificada en base64 en formato PEM con la que se verificará. La clave privada utilizada para generar esta clave pública debe tener el formato PEM de ECDSA P256.
    • START_TIME: la hora de inicio en la que la clave pasa a ser válida, como 2025-02-07T00:59:34Z.
    • EXPIRATION_TIME: la hora de vencimiento de la clave, como 2026-02-07T00:59:34Z.
  4. Aplica el recurso personalizado ProjectServiceAccount al servidor de la API global:

    kubectl --kubeconfig GLOBAL_API_SERVER_KUBECONFIG apply -f my-project-sa.yaml
    

    Sustituye la variable GLOBAL_API_SERVER_KUBECONFIG por la ruta al archivo kubeconfig del servidor de la API global.

  5. Crea el archivo JSON de credenciales predeterminadas de la aplicación que contiene la clave privada. Asegúrate de que la variable KEY_ID del archivo JSON tenga el mismo valor que la variable KEY_ID que has usado en la especificación ProjectServiceAccount.

    cat <<EOF > "key_file.json"
    {
      "format_version": "1",
      "name": "NAME",
      "private_key": "$(tr '\n' '\t' < "key.pem" | sed 's/\t/\\n/g')",
      "private_key_id": "KEY_ID",
      "project": "PROJECT",
      "token_uri": "AUTH_URL",
      "type": "gdch_service_account"
    }
    EOF
    

    Sustituye las siguientes variables:

    • NAME: el nombre de la identidad de servicio.
    • KEY_ID: identificador único de la clave. El ID se usa para determinar con qué clave se debe verificar y debe coincidir con el valor KEY_ID usado en la especificación ProjectServiceAccount.
    • PROJECT: el espacio de nombres del proyecto en la organización.
    • AUTH_URL: la dirección del endpoint de autenticación.
  6. Añade el par de claves a tu proyecto activando la cuenta de servicio:

    gdcloud auth activate-service-account –-key-file=key_file.json
    

Mostrar las credenciales de las cuentas de servicio

Lista las claves públicas de un ProjectServiceAccount específico del proyecto:

gdcloud iam service-accounts keys list \
    --project=PROJECT \
    --iam-account=NAME

Eliminar credenciales

Para eliminar la clave pública, usa la consola de GDC o la CLI de gdcloud.

Consola

  1. Inicia sesión en la consola de GDC.
  2. En el menú de navegación, selecciona Identidad y acceso > Identidades de servicio.
  3. Haga clic en el nombre de la identidad de servicio que tenga la clave que quiera eliminar.
  4. Haz clic en Eliminar.
  5. En el cuadro de diálogo de confirmación, haz clic en Eliminar.

gdcloud

Elimina la clave pública con el ID de clave del ProjectServiceAccount específico del proyecto:

gdcloud iam service-accounts keys delete KEY_ID \
    --project=PROJECT \
    --iam-account=NAME

Autorizar una cuenta de servicio mediante una clave de cuenta de servicio

Puedes usar el comando gdcloud para activar una cuenta de servicio con una clave de cuenta de servicio:

  1. Crea un archivo de claves de cuenta de servicio si aún no tienes uno.

  2. Activa la cuenta de servicio ejecutando el siguiente comando:

    gdcloud auth activate-service-account --key-file=KEY_FILE
    

    Sustituye KEY_FILE por la ruta al archivo de clave de la cuenta de servicio.

    Después de activar la cuenta de servicio, gdcloud usa las credenciales de la cuenta de servicio para los comandos posteriores, en lugar de tus credenciales de usuario.