Cambiar la cuenta de servicio asociada


En este documento se explica cómo configurar una máquina virtual (VM) para que use otra cuenta de servicio. Una cuenta de servicio es un tipo especial de cuenta que suelen usar las aplicaciones o las cargas de trabajo de computación para hacer llamadas a la API autorizadas.

Las cuentas de servicio son necesarias en situaciones en las que una carga de trabajo, como una aplicación personalizada, necesita acceder a recursos de Google Cloud o realizar acciones sin la intervención de un usuario final. Para obtener más información sobre cuándo usar cuentas de servicio, consulta las prácticas recomendadas para usar cuentas de servicio.

Si tienes aplicaciones que necesitan hacer llamadas a las APIs de Google Cloud , Google recomienda que asocies una cuenta de servicio gestionada por el usuario a la VM en la que se ejecuta la aplicación o la carga de trabajo. A continuación, asigna roles de gestión de identidades y accesos a la cuenta de servicio, lo que le da acceso a losGoogle Cloud recursos, así como a las aplicaciones que se ejecutan en la VM.

Antes de empezar

  • Si aún no lo has hecho, configura la autenticación. La autenticación verifica tu identidad para acceder a Google Cloud servicios y APIs. Para ejecutar código o ejemplos desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    2. Set a default region and zone.

    REST

    Para usar las muestras de la API REST de esta página en un entorno de desarrollo local, debes usar las credenciales que proporciones a la CLI de gcloud.

      Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    Para obtener más información, consulta el artículo Autenticarse para usar REST de la documentación sobre autenticación de Google Cloud .

Roles obligatorios

Para obtener los permisos que necesitas para configurar cuentas de servicio en tu VM, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Administrador de instancias de Compute (v. 1) (roles/compute.instanceAdmin.v1) en la VM o en tu proyecto. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para configurar cuentas de servicio en tu VM. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para configurar cuentas de servicio en tu VM, necesitas los siguientes permisos:

  • compute.instances.setServiceAccount
  • compute.instances.stop
  • compute.instances.start

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Información general

Te recomendamos que configures las cuentas de servicio de tus máquinas virtuales de la siguiente manera:

  1. Crea una cuenta de servicio gestionada por el usuario en lugar de usar la cuenta de servicio predeterminada de Compute Engine y asigna roles de IAM a esa cuenta de servicio solo para los recursos y las operaciones que necesite.
  2. Asocia la cuenta de servicio a tu VM.
  3. Define el alcance de la plataforma en la nube (https://www.googleapis.com/auth/cloud-platform) en tu VM. De esta forma, la cuenta de servicio de la VM puede llamar a las APIs para las que tiene permiso. Google Cloud
    • Si especificas la cuenta de servicio mediante la Google Cloud consola, define el permiso de acceso de la cuenta de servicio como Permitir el acceso completo a todas las APIs de Cloud.
    • Si especificas la cuenta de servicio mediante la CLI de Google Cloud o la API de Compute Engine, puedes usar el parámetro scopes para definir el ámbito de acceso.

Configurar la cuenta de servicio

Puedes crear una cuenta de servicio gestionada por el usuario o usar la cuenta de servicio predeterminada de Compute Engine. Te recomendamos que uses una cuenta de servicio gestionada por el usuario.

En la cuenta de servicio seleccionada, asegúrate de que se hayan asignado los roles de Gestión de Identidades y Accesos (IAM) necesarios.

Gestionada por el usuario

Si aún no tienes una cuenta de servicio gestionada por el usuario, crea una. Para obtener instrucciones detalladas, consulta el artículo Configurar una cuenta de servicio.

Predeterminado

Si conoces la cuenta de servicio predeterminada de Compute Engine y quieres usar las credenciales que proporciona en lugar de crear cuentas de servicio, puedes conceder roles de gestión de identidades y accesos a la cuenta de servicio predeterminada.

Antes de asignar roles de gestión de identidades y accesos a la cuenta de servicio predeterminada, ten en cuenta lo siguiente:

  • Si se concede un rol de gestión de identidades y accesos a la cuenta de servicio predeterminada, se verán afectadas todas las VMs que se ejecuten como la cuenta de servicio predeterminada. Por ejemplo, si asignas el rol roles/storage.objectAdmin a la cuenta de servicio predeterminada, todas las VMs que se ejecuten como la cuenta de servicio predeterminada con los ámbitos de acceso necesarios tendrán los permisos que otorga el rol roles/storage.objectAdmin. Del mismo modo, si limitas el acceso omitiendo determinados roles, esto afectará a todas las VMs que se ejecuten como la cuenta de servicio predeterminada.

  • En función de la configuración de la política de tu organización, es posible que se conceda automáticamente el rol Editor a la cuenta de servicio predeterminada de tu proyecto. Te recomendamos que inhabilites la asignación automática de roles aplicando la restricción de la política de organización iam.automaticIamGrantsForDefaultServiceAccounts. Si has creado tu organización después del 3 de mayo del 2024, esta restricción se aplica de forma predeterminada.

    Si inhabilitas la concesión automática de roles, debes decidir qué roles quieres conceder a las cuentas de servicio predeterminadas y, a continuación, concederlos tú mismo.

    Si la cuenta de servicio predeterminada ya tiene el rol Editor, te recomendamos que lo sustituyas por roles con menos permisos.Para modificar los roles de la cuenta de servicio de forma segura, usa Simulador de políticas para ver el impacto del cambio y, a continuación, asigna y revoca los roles adecuados.

Si no tienes claro si debes conceder roles de gestión de identidades y accesos a la cuenta de servicio predeterminada, crea una cuenta de servicio gestionada por el usuario.

Asociar la cuenta de servicio y actualizar el permiso de acceso

Para cambiar la cuenta de servicio y los ámbitos de acceso de una VM, esta debe detenerse temporalmente.

Si la cuenta de servicio está en un proyecto distinto al de la máquina virtual, debes configurar la cuenta de servicio para un recurso de otro proyecto.

Usa uno de los siguientes métodos para cambiar la cuenta de servicio y los ámbitos de acceso de tu máquina virtual.

Consola

  1. Ve a la página Instancias de VM.

    Ir a instancias de VM

  2. Haz clic en el nombre de la instancia de VM cuya cuenta de servicio quieras cambiar.

  3. Haz clic en Detener. Si no aparece la opción Detener, haz clic en Más acciones > Detener. Espera a que se detenga la VM.

  4. Haz clic en Editar.

  5. Desplázate hacia abajo hasta la sección Cuenta de servicio.

  6. En la lista desplegable, selecciona la cuenta de servicio que quieras asignar a la VM.

    • Si eliges una cuenta de servicio gestionada por el usuario, el ámbito de acceso de la VM se definirá de forma predeterminada como el ámbito cloud-platform recomendado. Si necesitas un ámbito diferente para tu cuenta de servicio gestionada por el usuario, usa la CLI de gcloud o la API de Compute Engine para adjuntar la cuenta de servicio.
    • Si eliges la cuenta de servicio predeterminada de Compute Engine, puedes modificar sus ámbitos de acceso en la Google Cloud consola.
      • Para cambiar los permisos, en la sección Permisos de acceso, selecciona Definir acceso para cada API y establece los permisos adecuados según tus necesidades.
      • Recomendación: Si no sabes qué permisos de acceso debes definir, elige Permitir el acceso completo a todas las APIs de Cloud y, a continuación, restringe el acceso asignando roles de gestión de identidades y accesos a la cuenta de servicio.
  7. Haz clic en Guardar para guardar los cambios.

  8. Haz clic en Iniciar/Reanudar para reiniciar la VM.

gcloud

  1. Detén la VM con el comando instances stop. Sustituye VM_NAME por el nombre de tu instancia de VM.

    gcloud compute instances stop VM_NAME
    
  2. Adjunta la cuenta de servicio. Para adjuntar la cuenta de servicio, usa el comando instances set-service-account y proporciona el nombre de la VM, el correo de la cuenta de servicio y los ámbitos que quieras. Para obtener más información sobre cómo definir permisos de acceso, consulta las prácticas recomendadas.

    gcloud compute instances set-service-account VM_NAME \
      --service-account=SERVICE_ACCOUNT_EMAIL \
      --scopes=SCOPES
    

    Haz los cambios siguientes:

    • SERVICE_ACCOUNT_EMAIL: la dirección de correo de la cuenta de servicio que has creado. Por ejemplo: my-sa-123@my-project-123.iam.gserviceaccount.com. Para ver la dirección de correo, consulta Listar cuentas de servicio.

      Si quieres quitar la cuenta de servicio de la VM, usa la marca --no-service-account.

    • VM_NAME: el nombre de la instancia de VM.

    • SCOPES: lista separada por comas de URIs o alias de ámbito proporcionados en la descripción de la marca --scopes.

      Si quieres quitar todos los ámbitos de la VM, usa la marca --no-scopes.

    Por ejemplo, el siguiente comando asigna la cuenta de servicio my-sa-123@my-project-123.iam.gserviceaccount.com a una VM llamada example-instance y define los permisos de acceso de esa VM para permitir el acceso de lectura y escritura a Compute Engine y el acceso de solo lectura a Cloud Storage:

    gcloud compute instances set-service-account example-instance \
      --service-account=my-sa-123@my-project-123.iam.gserviceaccount.com \
      --scopes=compute-rw,storage-ro
    
  3. Inicia la VM con el comando instances start. Sustituye VM_NAME por el nombre de tu instancia de VM.

    gcloud compute instances start VM_NAME
    

REST

  1. Detén la VM haciendo una solicitud POST con el método instances.stop:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop
    

    Haz los cambios siguientes:

    • PROJECT_ID: el proyecto en el que se encuentra tu VM
    • ZONE: la zona en la que se encuentra tu VM
    • VM_NAME: el nombre de la VM que quieres detener
  2. Adjunta la cuenta de servicio haciendo una solicitud POST al método setServiceAccount:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setServiceAccount
    
    {
      "email": "SERVICE_ACCOUNT_EMAIL",
      "scopes": [
        "SCOPE_URI",
        "SCOPE_URI",
        ...
      ]
    }
    

    Haz los cambios siguientes:

    • PROJECT_ID: el ID de proyecto de esta solicitud.
    • ZONE: la zona a la que pertenece esta VM.
    • VM_NAME: el nombre de la VM.
    • SERVICE_ACCOUNT_EMAIL: la dirección de correo de la cuenta de servicio que has creado. Por ejemplo: my-sa-123@my-project-123.iam.gserviceaccount.com. Para ver la dirección de correo, consulta Listar cuentas de servicio.
    • SCOPE_URI: el URI de ámbito obligatorio.

    Por ejemplo, la siguiente solicitud usa la dirección de correo de la cuenta de servicio my-sa-123@my-project-123.iam.gserviceaccount.com y define un ámbito de Cloud Storage y BigQuery:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setServiceAccount
    
    {
      "email": "my-sa-123@my-project-123.iam.gserviceaccount.com",
      "scopes": [
        "https://www.googleapis.com/auth/bigquery",
        "https://www.googleapis.com/auth/devstorage.read_only"
      ]
    }
    
  3. Inicia la VM creando una solicitud POST con el método instances.start:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/start
    

    Haz los cambios siguientes:

    • PROJECT_ID: el proyecto en el que se encuentra tu VM
    • ZONE: la zona en la que se encuentra tu VM
    • VM_NAME: el nombre de la VM que quieres iniciar

Ver la cuenta de servicio que usa una VM

Para ver todas las cuentas de servicio de un proyecto, consulta el artículo sobre cómo listar cuentas de servicio.

Si necesitas identificar la cuenta de servicio que usa una máquina virtual, sigue uno de estos procedimientos:

consola

  1. Ve a la página Instancias de VM.

    Ir a instancias de VM

  2. Haz clic en el nombre de la instancia de VM cuya cuenta de servicio quieras cambiar.

  3. Ve a la sección Gestión de APIs e identidades. En esta sección se muestran la cuenta de servicio y el ámbito de acceso que usa la VM.

gcloud

Ejecuta el comando gcloud compute instances describe:

gcloud compute instances describe VM_NAME \
    --format json

El resultado debería ser similar al siguiente:

{
  ...
  "serviceAccounts":[
      {
        "email":"123845678986-compute@developer.gserviceaccount.com",
        "scopes":[
            "https://www.googleapis.com/auth/devstorage.full_control"
        ]
      }
  ]
  ...
   }

Si la máquina virtual no usa una cuenta de servicio, recibirás una respuesta sin la propiedad serviceAccounts.

Servidor de metadatos

Consulta el servidor de metadatos desde la propia máquina virtual. Haz una solicitud a http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/:

user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/" \
-H "Metadata-Flavor: Google"

Si has habilitado una o varias cuentas de servicio al crear la instancia, este comando curl devuelve un resultado similar al siguiente:

123845678986-compute@developer.gserviceaccount.com/
default/

Si la instancia no usa una cuenta de servicio, recibirás una respuesta vacía.

Prácticas recomendadas

Siguientes pasos