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 del dispositivo air-gapped de Google Distributed Cloud (GDC), como la siguiente:

  • Servicios y cargas de trabajo de dispositivos con air gap de GDC internos para acceder de forma segura a la interfaz de programación de aplicaciones (API) del plano de control de dispositivos con air gap de GDC.
  • Cargas de trabajo del cliente en el dispositivo GDC con air gap para acceder a los servicios del dispositivo GDC con air gap y hacer llamadas autorizadas a la interfaz de programación de aplicaciones (API).
  • Cargas de trabajo externas para federar con el dispositivo GDC con air gap.
  • Servicios de dispositivos aislados de GDC o controladores de sistemas para acceder de forma segura a los recursos de los clientes. 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 el clúster de Kubernetes de hardware desnudo deben ejecutar cargas de trabajo gestionadas por 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 ProjectServiceAccount.

Antes de empezar

Solo puedes crear cuentas de servicio en un proyecto. Para obtener más información, 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 identidades 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: Test service identity.
  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.

API

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

    apiVersion: resourcemanager.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 de gestión:

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

    Sustituye la variable MANAGEMENT_API_SERVER_KUBECONFIG por la ruta al archivo kubeconfig del servidor de la API de gestión.

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 del rol de proyecto para vincular el rol especificado con ProjectServiceAccount:

gdcloud iam service-accounts add-iam-policy-binding \
    --project=PROJECT \
    --role=ROLE \
    --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 en el formato Role/name, donde Rol es el tipo de Kubernetes, como Role o ProjectRole, y nombre es el nombre del rol predefinido. Por ejemplo, para asignar el rol Lector de proyecto, define el rol como Role/project-viewer.
  • 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.

El dispositivo aislado de GDC 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.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 de gestión:

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

    Sustituye la variable MANAGEMENT_API_SERVER_KUBECONFIG por la ruta al archivo kubeconfig del servidor de la API de gestión.

  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.