Crie uma VM que use uma conta de serviço gerenciada pelo usuário


Este documento explica como criar uma instância de máquina virtual (VM) configurada para usar uma conta de serviço gerenciada pelo usuário. Uma conta de serviço é um tipo especial de conta normalmente usado por um aplicativo ou carga de trabalho de computação para fazer chamadas de API autorizadas.

As contas de serviço são necessárias para cenários em que uma carga de trabalho, como um aplicativo personalizado, precisa acessar Google Cloud recursos ou executar ações sem o envolvimento do usuário final. Para obter mais informações sobre quando usar contas de serviço, consulte Práticas recomendadas para usar contas de serviço .

Se você tiver aplicativos que precisam fazer chamadas para Google Cloud APIs, o Google recomenda que você anexe uma conta de serviço gerenciada pelo usuário à VM na qual o aplicativo ou a carga de trabalho está em execução. Em seguida, você concede funções do IAM à conta de serviço, o que dá à conta de serviço (e, por extensão, aos aplicativos em execução na VM) acesso aGoogle Cloud recursos.

Antes de começar

  • Se ainda não o fez, configure a autenticação. Autenticação é o processo pelo qual sua identidade é verificada para acesso a Google Cloud serviços e APIs. Para executar códigos ou amostras em um ambiente de desenvolvimento local, você pode se autenticar no Compute Engine selecionando uma das seguintes opções:

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

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

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

      Para usar os exemplos do Terraform nesta página em um ambiente de desenvolvimento local, instale e inicialize a gcloud CLI e, em seguida, configure o Application Default Credentials com suas credenciais de usuário.

      1. Install the Google Cloud CLI.
      2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      3. To initialize the gcloud CLI, run the following command:

        gcloud init
      4. 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.

        If an authentication error is returned, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.

      Confira mais informações em Set up authentication for a local development environment.

      REST

      Para usar as amostras da API REST nesta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para gcloud CLI.

        After installing the Google Cloud CLI, initialize it by running the following command:

        gcloud init

        If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      Para mais informações, consulte Autenticar para usar REST na documentação de autenticação do Google Cloud.

Funções obrigatórias

Para obter as permissões necessárias para criar VMs que usam contas de serviço, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:

Para obter mais informações sobre a concessão de funções, consulte Gerenciar acesso a projetos, pastas e organizações .

Essas funções predefinidas contêm as permissões necessárias para criar VMs que usam contas de serviço. Para ver as permissões exatas necessárias, expanda a seção Permissões necessárias :

Permissões necessárias

As seguintes permissões são necessárias para criar VMs que usam contas de serviço:

  • Para criar contas de serviço: todas as permissões na função iam.serviceAccountCreator
  • Para conceder permissões à conta de serviço: todas as permissões na função resourcemanager.projectIamAdmin
  • Para criar VMs:
    • compute.instances.create no projeto
    • Para usar uma imagem personalizada para criar a VM: compute.images.useReadOnly na imagem
    • Para usar um instantâneo para criar a VM: compute.snapshots.useReadOnly no instantâneo
    • Para usar um modelo de instância para criar a VM: compute.instanceTemplates.useReadOnly no modelo de instância
    • Para atribuir uma rede legada à VM: compute.networks.use no projeto
    • Para especificar um endereço IP estático para a VM: compute.addresses.use no projeto
    • Para atribuir um endereço IP externo à VM ao usar uma rede legada: compute.networks.useExternalIp no projeto
    • Para especificar uma sub-rede para a VM: compute.subnetworks.use no projeto ou na sub-rede escolhida
    • Para atribuir um endereço IP externo à VM ao usar uma rede VPC: compute.subnetworks.useExternalIp no projeto ou na sub-rede escolhida
    • Para definir metadados de instância de VM para a VM: compute.instances.setMetadata no projeto
    • Para definir tags para a VM: compute.instances.setTags na VM
    • Para definir rótulos para a VM: compute.instances.setLabels na VM
    • Para definir uma conta de serviço para a VM usar: compute.instances.setServiceAccount na VM
    • Para criar um novo disco para a VM: compute.disks.create no projeto
    • Para anexar um disco existente no modo somente leitura ou leitura-gravação: compute.disks.use no disco
    • Para anexar um disco existente no modo somente leitura: compute.disks.useReadOnly no disco

Você também poderá obter essas permissões com funções personalizadas ou outras funções predefinidas .

Visão geral

É recomendável configurar contas de serviço para suas VMs da seguinte forma:

  1. Crie uma nova conta de serviço gerenciada pelo usuário em vez de usar a conta de serviço padrão do Compute Engine e conceda papéis do IAM a essa conta de serviço apenas para os recursos e operações necessários.
  2. Anexe a conta de serviço à sua VM.
  3. Defina o escopo da plataforma de nuvem ( https://www.googleapis.com/auth/cloud-platform ) na sua VM. Isso permite que a conta de serviço da VM chame o Google Cloud APIs que tem permissão para usar.
    • Se você especificar a conta de serviço usando o console do Google Cloud, o escopo de acesso da VM será automaticamente padronizado para o escopo cloud-platform .
    • Se você especificar a conta de serviço usando a Google Cloud CLI ou a API Compute Engine, poderá usar o parâmetro scopes para definir o escopo de acesso.

Configurar uma conta de serviço

Crie uma conta de serviço e atribua as funções necessárias do IAM. Atribua quantas funções do IAM forem necessárias. Você pode modificar as funções do IAM na sua conta de serviço conforme necessário.

O Google recomenda que você limite os privilégios das contas de serviço e verifique regularmente as permissões da sua conta de serviço para garantir que estejam atualizadas.

Use um dos métodos a seguir para configurar a conta de serviço.

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

Terraforma

Para criar uma conta de serviço, você pode usar o recurso google_service_account .

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

Lembre-se de substituir os valores de espaço reservado para os atributos account_id e display_name .

Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform .

Crie uma VM e anexe a conta de serviço

Depois de criar a conta de serviço, crie uma VM e anexe a conta de serviço criada na seção anterior. Defina também o escopo de acesso da VM para cloud-platform .

Se você já tiver uma VM e quiser configurá-la para usar uma conta de serviço diferente, consulte Alterar a conta de serviço anexada .

Use um dos métodos a seguir para criar uma VM e anexar a conta de serviço.

Console

  1. No console do Google Cloud, acesse a página Criar uma instância .

    Vá para Criar uma instância

  2. Para anexar uma conta de serviço, faça o seguinte:

    1. No menu de navegação, clique em Segurança .
    2. Na lista Conta de serviço , selecione a conta de serviço que você criou.
    3. Em Escopos de acesso , selecione Permitir acesso total a todas as APIs do Cloud .
  3. Opcional: Especifique outras opções de configuração. Para obter mais informações, consulte Opções de configuração durante a criação da instância .

  4. Para criar e iniciar a instância, clique em Criar .

gcloud

Para criar uma nova instância de VM e configurá-la para usar uma conta de serviço personalizada usando a CLI do Google Cloud, use o comando gcloud compute instances create e forneça o e-mail da conta de serviço e o escopo de acesso cloud-platform para a instância de VM.

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

Substitua o seguinte:

  • SERVICE_ACCOUNT_EMAIL : o endereço de e-mail da conta de serviço que você criou. Por exemplo: my-sa-123@my-project-123.iam.gserviceaccount.com . Para visualizar o endereço de e-mail, consulte Listando contas de serviço .
  • VM_NAME : o nome da instância da VM.

Por exemplo:

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

Você também pode especificar o escopo usando o alias: --scopes=cloud-platform . Esses aliases são reconhecidos apenas pela CLI gcloud. A API e outras bibliotecas não reconhecem esses aliases, portanto você deve especificar o URI de escopo completo.

Terraforma

Para configurar uma nova VM para usar uma conta de serviço, você pode usar o 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"]
  }
}

DESCANSAR

Use o método instances.insert para criar a VM e especificar o e-mail da conta de serviço e o escopo de acesso para a instância da 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"
   }
}

Substitua o seguinte:

  • PROJECT_ID : ID do projeto no qual criar a VM
  • ZONE : zona para criar a VM
  • MACHINE_TYPE_ZONE : zona que contém o tipo de máquina a ser usada para a nova VM
  • MACHINE_TYPE : tipo de máquina, predefinida ou customizada , para a nova VM
  • VM_NAME : nome da nova VM
  • IMAGE_PROJECT : projeto contendo a imagem
    Por exemplo, se você especificar debian-10 como a família de imagens, especifique debian-cloud como o projeto de imagem.
  • IMAGE : especifique um dos seguintes:
    • IMAGE : uma versão específica de uma imagem pública

      Por exemplo, "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20200309"

    • IMAGE_FAMILY : uma família de imagens

      Isso cria a VM a partir da imagem do sistema operacional mais recente e não obsoleta. Por exemplo, se você especificar "sourceImage": "projects/debian-cloud/global/images/family/debian-10" , o Compute Engine criará uma VM a partir da versão mais recente da imagem do sistema operacional na família de imagens Debian 10 .

  • NETWORK_NAME : a rede VPC que você deseja usar para a VM. Você pode especificar default para usar sua rede padrão.
  • SERVICE_ACCOUNT_EMAIL : o endereço de e-mail da conta de serviço que você criou. Por exemplo: my-sa-123@my-project-123.iam.gserviceaccount.com . Para visualizar o endereço de e-mail, consulte obter um e-mail de conta de serviço .
  • ENABLE_SECURE_BOOT : opcional: se você escolher uma imagem compatível com recursos de VM protegida , o Compute Engine, por padrão, ativará o módulo de plataforma confiável virtual (vTPM) e o monitoramento de integridade . O Compute Engine não ativa a inicialização segura por padrão.

    Se você especificar true para enableSecureBoot , o Compute Engine criará uma VM com todos os três recursos de VM protegida ativados. Depois que o Compute Engine iniciar sua VM, para modificar as opções da VM protegida , você deverá interrompê-la.

Acesse e use outros Google Cloud serviços

Depois que sua VM estiver configurada para usar a conta de serviço, os aplicativos poderão usar a conta de serviço para autenticação. O método mais comum é autenticar usando credenciais padrão do aplicativo e uma biblioteca cliente. Alguns Google Cloud ferramentas como a CLI gcloud podem usar automaticamente a conta de serviço para acessar Google Cloud APIs de uma VM. Para obter mais informações, consulte Autenticar cargas de trabalho usando contas de serviço .

Se uma conta de serviço for excluída, os aplicativos não terão mais acesso aGoogle Cloud recursos por meio dessa conta de serviço. Se você excluir as contas de serviço padrão do App Engine e do Compute Engine, suas VMs não terão mais acesso aos recursos do projeto. Se você não tiver certeza se uma conta de serviço está sendo usada, o Google recomenda desabilitar a conta de serviço antes de excluí-la. As contas de serviço desativadas poderão ser reativadas se ainda forem necessárias.

Exemplo: acessar recursos do Cloud Storage na sua VM

Depois de configurar sua VM para usar uma conta de serviço que tenha o papel storage.admin , você poderá usar ferramentas como a CLI gcloud para gerenciar arquivos armazenados no Cloud Storage. Para acessar seus recursos do Cloud Storage, faça o seguinte:

  1. Certifique-se de que a conta de serviço anexada à sua VM tenha a roles/storage.admin .

  2. Se sua VM usar uma imagem de sistema operacional personalizada, instale a CLI gcloud . Por padrão, a CLI gcloud é instalada na maioria das imagens de sistema operacional públicas fornecidas por Google Cloud.

  3. Conecte-se à VM.

  4. Na VM, use a Google Cloud CLI para gerenciar os recursos do Cloud Storage.

O que vem a seguir?