Crear una VM que use una cuenta de servicio administrada por el usuario


En este documento, se explica cómo crear una instancia de máquina virtual (VM) que esté configurada para usar una cuenta de servicio administrada por el usuario. Una cuenta de servicio es un tipo especial de cuenta que, por lo general, es usada por una carga de trabajo de aplicación o procesamiento para realizar llamadas autorizadas a la API.

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

Si tienes aplicaciones que necesitan realizar llamadas a las APIs de Google Cloud, Google recomienda que conectes una cuenta de servicio administrada por el usuario a la VM en la que se ejecuta la aplicación o la carga de trabajo. Luego, otorgas los roles de IAM de la cuenta de servicio, que otorga a la cuenta de servicio (y, por extensión, a las aplicaciones que se ejecutan en la VM) acceso a los recursos de Google Cloud.

Antes de comenzar

  • Configura la autenticación si aún no lo hiciste. La autenticación es el proceso mediante el cual se verifica tu identidad para acceder a los servicios y las API de Google Cloud. Para ejecutar un código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine de la siguiente manera.

    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. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. Terraform

      Para usar las muestras de Terraform de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

      Para obtener más información, consulta Set up authentication for a local development environment.

      REST

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

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      Si deseas obtener más información, consulta Autentica para usar REST en la documentación de autenticación de Google Cloud.

Roles obligatorios

Para obtener los permisos que necesitas para crear VMs que usen cuentas de servicio, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Estos roles predefinidos contienen los permisos necesarios para crear VMs que usen cuentas de servicio. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Los siguientes permisos son necesarios para crear VMs que usen cuentas de servicio:

  • Para crear cuentas de servicio, haz lo siguiente: Todos los permisos del rol serviceAccountCreator
  • Para crear VMs, sigue estos pasos:
    • compute.instances.create en el proyecto
    • Para usar una imagen personalizada con el fin de crear la VM, sigue estos pasos: compute.images.useReadOnly en la imagen
    • Si deseas usar una instantánea para crear la VM, sigue estos pasos: compute.snapshots.useReadOnly en la instantánea
    • Para usar una plantilla de instancias a fin de crear la VM, haz lo siguiente: compute.instanceTemplates.useReadOnly en la plantilla de instancias
    • Para asignar una red heredada a la VM: compute.networks.use en el proyecto
    • Si deseas especificar una dirección IP estática para la VM; compute.addresses.use en el proyecto
    • Para asignar una dirección IP externa a la VM cuando se usa una red y punto heredado; compute.networks.useExternalIp en el proyecto
    • A fin de especificar una subred para la VM: compute.subnetworks.use en el proyecto o en la subred elegida
    • Para asignar una dirección IP externa a la VM cuando se usa una red de VPC, compute.subnetworks.useExternalIp en el proyecto o en la subred elegida
    • A fin de configurar los metadatos de la instancia de VM para la VM y los puntos, sigue estos pasos: compute.instances.setMetadata en el proyecto
    • A fin de configurar etiquetas para la VM y los puntos; compute.instances.setTags en la VM
    • Si deseas configurar etiquetas para la VM, haz lo siguiente: compute.instances.setLabels en la VM
    • A fin de configurar una cuenta de servicio para que la VM la usecompute.instances.setServiceAccount en la VM
    • Si deseas crear un disco nuevo para la VM: compute.disks.create en el proyecto
    • Para conectar un disco existente en modo de solo lectura o de lectura y escritura, haz lo siguiente: compute.disks.use en el disco
    • Para conectar un disco existente en modo de solo lectura y dos puntos, sigue estos pasos: compute.disks.useReadOnly en el disco

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

Descripción general

Se recomienda que configures las cuentas de servicio para las VMs de la siguiente manera:

  1. Crea una cuenta de servicio nueva administrada por el usuario en lugar de usar la cuenta de servicio predeterminada de Compute Engine y otórgale roles de IAM solo a los recursos y las operaciones que necesita.
  2. Conecta la cuenta de servicio a tu VM.
  3. Configura el permiso de la plataforma en la nube (https://www.googleapis.com/auth/cloud-platform) en tu VM. Esto permite que la cuenta de servicio de la VM llame a las APIs de Google Cloud que tiene permiso para usar.
    • Si especificas la cuenta de servicio con la consola de Google Cloud, el permiso de acceso de la VM se establece automáticamente en el permiso cloud-platform.
    • Si especificas la cuenta de servicio con Google Cloud CLI o la API de Compute Engine, puedes usar el parámetro scopes para configurar el permiso de acceso.

Configurar una cuenta de servicio

Crea una cuenta de servicio y asígnale los roles de IAM necesarios. Asigna tantos roles de IAM como sea necesario. Puedes modificar los roles de IAM en tu cuenta de servicio según sea necesario.

Google recomienda que limites los privilegios de las cuentas de servicio y verifiques con regularidad los permisos de tu cuenta de servicio para asegurarte de que estén actualizados.

Usa uno de los siguientes métodos para configurar la cuenta de servicio.

Console

    In the Google Cloud console, go to the Create service account page.

    Go to Create service account
  1. Select your project.
  2. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

    In the Service account description field, enter a description. For example, Service account for quickstart.

  3. Click Create and continue.
  4. Grant the required roles to the service account.

    To grant a role, find the Select a role list, then select the role.

    To grant additional roles, click Add another role and add each additional role.

  5. Click Continue.
  6. In the Service account users role field, enter the identifier for the principal that will attach the service account to other resources, such as Compute Engine instances.

    This is typically the email address for a Google Account.

  7. Click Done to finish creating the service account.

gcloud

    Set up authentication:

    1. Create the service account:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Replace SERVICE_ACCOUNT_NAME with a name for the service account.

    2. To provide access to your project and your resources, grant a role to the service account:

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      Replace the following:

      • SERVICE_ACCOUNT_NAME: the name of the service account
      • PROJECT_ID: the project ID where you created the service account
      • ROLE: the role to grant
    3. To grant another role to the service account, run the command as you did in the previous step.
    4. Grant the required role to the principal that will attach the service account to other resources.

      gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com --member="user:USER_EMAIL" --role=roles/iam.serviceAccountUser

      Replace the following:

      • SERVICE_ACCOUNT_NAME: the name of the service account
      • PROJECT_ID: the project ID where you created the service account
      • USER_EMAIL: the email address for a Google Account

Terraform

Para crear una cuenta de servicio, puedes usar el recurso google_service_account.

resource "google_service_account" "default" {
  account_id   = "service-account-id"
  display_name = "Service Account"
}

Recuerda reemplazar los valores de marcador de posición por los atributos account_id y display_name.

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

Crea una VM y adjunta la cuenta de servicio

Después de crear la cuenta de servicio, crea una VM y conecta la cuenta de servicio que creaste en la sección anterior. Además, configura el permiso de acceso de la VM en cloud-platform.

Si ya tienes una VM existente y deseas configurarla para que use una cuenta de servicio diferente, consulta Cambia la cuenta de servicio conectada.

Usa uno de los siguientes métodos para crear una VM y conectar la cuenta de servicio.

Console

  1. En la consola de Google Cloud, ve a la página Instancias de VM.

Ir a Instancias de VM

  1. Selecciona el proyecto y haz clic en Continuar.
  2. Haz clic en Crear instancia.
  3. Especifica un Nombre para la VM.
  4. Ve a la sección Identidad y acceso a la API.
  5. En el cuadro Cuenta de servicio, selecciona la cuenta de servicio que creaste. Cuando conectas una cuenta de servicio a una VM, el permiso de acceso de Google Cloud cloud-platform se establece automáticamente en la VM.
  6. Realiza personalizaciones de VM adicionales, según sea necesario.
  7. Para crear y, también, iniciar la VM, haz clic en Crear.

gcloud

Para crear una instancia de VM nueva y configurarla para que use una cuenta de servicio personalizada con Google Cloud CLI, usa el comando gcloud compute instances create y proporciona el correo electrónico de la cuenta de servicio y el permiso de acceso cloud-platform a la instancia de VM.

gcloud compute instances create VM_NAME \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --scopes=https://www.googleapis.com/auth/cloud-platform

Reemplaza lo siguiente:

  • SERVICE_ACCOUNT_EMAIL: la dirección de correo electrónico de la cuenta de servicio que creaste. Por ejemplo: my-sa-123@my-project-123.iam.gserviceaccount.com Para ver la dirección de correo electrónico, consulta Enumera cuentas de servicio.
  • VM_NAME: El nombre de la instancia de VM

Por ejemplo:

gcloud compute instances create example-vm \
    --service-account 123-my-sa@my-project-123.iam.gserviceaccount.com \
    --scopes=https://www.googleapis.com/auth/cloud-platform

También puedes especificar el alcance con el alias: --scopes=cloud-platform. Solo la CLI de gcloud reconoce estos alias. La API y otras bibliotecas no reconocen estos alias, por lo que debes especificar el URI de permiso completo.

Terraform

Para configurar una VM nueva para usar una cuenta de servicio, puedes usar el recurso google_compute_instance.

resource "google_compute_instance" "default" {
  name         = "my-test-vm"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  // Local SSD disk
  scratch_disk {
    interface = "SCSI"
  }

  network_interface {
    network = "default"

    access_config {
      // Ephemeral public IP
    }
  }

  service_account {
    # Google recommends custom service accounts with `cloud-platform` scope with
    # specific permissions granted via IAM Roles.
    # This approach lets you avoid embedding secret keys or user credentials
    # in your instance, image, or app code
    email  = google_service_account.default.email
    scopes = ["cloud-platform"]
  }
}

REST

Usa el método instances.insert para crear la VM y especifica el correo electrónico de la cuenta de servicio y el permiso de acceso para la instancia de VM.

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

{
   "machineType":"zones/MACHINE_TYPE_ZONE/machineTypes/MACHINE_TYPE",
   "name":"VM_NAME",
   
   "disks":[
      {
         "initializeParams":{
            "sourceImage":"projects/IMAGE_PROJECT/global/images/IMAGE"
         },
         "boot":true
      }
   ],
   
   
   "networkInterfaces":[
      {
         "network":"global/networks/NETWORK_NAME"
      }
   ],
   
  "serviceAccounts": [
      {
      "email": "SERVICE_ACCOUNT_EMAIL",
      "scopes": ["https://www.googleapis.com/auth/cloud-platform"]
      }
   ],
   "shieldedInstanceConfig":{
      "enableSecureBoot":"ENABLE_SECURE_BOOT"
   }
}

Reemplaza lo siguiente:

  • PROJECT_ID: ID del proyecto en el que se creará la VM
  • ZONE: Zona en la que se creará la VM
  • MACHINE_TYPE_ZONE: Zona que contiene el tipo de máquina que se usará para la VM nueva
  • MACHINE_TYPE: El tipo de máquina, predefinido o personalizado de la VM nueva
  • VM_NAME: Nombre de la VM nueva
  • IMAGE_PROJECT: El proyecto que contiene la imagen
    Por ejemplo, si especificas debian-10 como familia de imágenes, especifica debian-cloud como proyecto de imagen.
  • IMAGE or IMAGE_FAMILY: Especifica una de las siguientes opciones:
    • IMAGE: Una versión específica de una imagen pública
      Por ejemplo, "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20200309"
    • IMAGE_FAMILY: Una familia de imágenes
      Esto crea la VM a partir de la imagen de SO no obsoleta más reciente. Por ejemplo, si especificas "sourceImage": "projects/debian-cloud/global/images/family/debian-10", Compute Engine crea una VM a partir de la última versión de la imagen de SO en la familia de imágenes Debian 10.
  • NETWORK_NAME: La red de VPC que deseas usar para la VM. Puedes especificar default para usar tu red predeterminada
  • SERVICE_ACCOUNT_EMAIL: la dirección de correo electrónico de la cuenta de servicio que creaste. Por ejemplo: my-sa-123@my-project-123.iam.gserviceaccount.com. Para ver la dirección de correo electrónico, consulta obtén un correo electrónico de cuenta de servicio.
  • ENABLE_SECURE_BOOT: Opcional: Si eliges una imagen que admite funciones de VM protegida, Compute Engine habilita de forma predeterminada el módulo virtual de plataforma de confianza (vTPM) y la supervisión de la integridad. Compute Engine no habilita el Inicio seguro de forma predeterminada.

    Si especificas true para enableSecureBoot, Compute Engine crea una VM con las tres funciones de VM protegida habilitadas. Después de que Compute Engine inicie la VM, debes detenerla para modificar las opciones de VM protegida.

Accede a otros servicios de Google Cloud y úsalos

Después de que tu VM esté configurada para usar la cuenta de servicio, las aplicaciones pueden usar la cuenta de servicio para autenticarse. El método más común es autenticarse con las credenciales predeterminadas de la aplicación y una biblioteca cliente. Algunas herramientas de Google Cloud, como gcloud CLI, pueden usar automáticamente la cuenta de servicio para acceder a las APIs de Google Cloud desde una VM. Para obtener más información, consulta Autentica cargas de trabajo con cuentas de servicio.

Si se borra una cuenta de servicio, las aplicaciones ya no tendrán acceso a los recursos de Google Cloud a través de esa cuenta. Si borras las cuentas de servicio predeterminadas de App Engine y Compute Engine, las instancias ya no tendrán acceso a los recursos del proyecto. Si no tienes en claro si se está usando una cuenta de servicio, te recomendamos que inhabilites la cuenta de servicio antes de borrarla. Las cuentas de servicio inhabilitadas se pueden volver a habilitar si aún son necesarias.

Ejemplo: Accede a los recursos de Cloud Storage desde tu VM

Después de configurar tu VM para usar una cuenta de servicio que tenga el rol storage.admin, puedes usar herramientas como gcloud CLI para administrar los archivos que almacenaste en Cloud Storage Para acceder a tus recursos de Cloud Storage, completa lo siguiente:

  1. Asegúrate de que la cuenta de servicio conectada a tu VM tenga el rol roles/storage.admin.

  2. Si tu VM usa una imagen de SO personalizada, instala gcloud CLI. De forma predeterminada, gcloud CLI se instala en la mayoría de las imágenes públicas del SO que proporciona Google Cloud.

  3. Conéctate a la VM.

  4. Desde la VM, usa Google Cloud CLI para administrar tus recursos de Cloud Storage.

Próximos pasos