Como atribuir papéis a contas de serviço

Durante a concessão dos papéis do IAM, trate a conta de serviço como recurso ou como identidade.

Uma conta de serviço é usada pelo seu aplicativo como uma identidade para ser autenticada nos serviços do Google Cloud Platform. Por exemplo, se uma máquina virtual (VM, na sigla em inglês) do Google Compute Engine está sendo executada como uma conta de serviço, atribua o papel de editor à conta de serviço (a identidade) para um projeto (o recurso).

Ao mesmo tempo, controle também quem pode iniciar a VM. Para isso, conceda a um usuário (a identidade) o papel serviceAccountUser para a conta de serviço (o recurso).

Para informações sobre contas de serviço e outros exemplos sobre o uso delas como um recurso, consulte Contas de serviço.

Pré-requisitos para este guia

Como atribuir papéis a uma conta de serviço para recursos específicos

Atribua papéis a uma conta de serviço para que ela tenha permissão para concluir ações específicas nos recursos no projeto do Cloud Platform. Por exemplo, é possível conceder o papel storage.admin a uma conta de serviço para que ela tenha controle sobre objetos e buckets no Google Cloud Storage.

Para conceder papéis a uma conta de serviço, use um dos métodos abaixo:

Console

Gerencie papéis em contas de serviço da mesma maneira que você gerencia papéis de usuários no projeto.

  1. Abra a página IAM e administrador no Console do Cloud.

    Abrir a página IAM e administrador

  2. Clique em Selecionar um projeto e em Abrir.

  3. Identifique a conta de serviço em que você quer incluir um papel.

    • Se a conta de serviço ainda não estiver na lista de membros, ela não terá papéis atribuídos. Clique em Adicionar e digite o endereço de e-mail da conta do serviço.
    • Se ela já estiver na lista de membros, a conta de serviço terá papéis. Para editar os papéis da conta de serviço, clique no botão Editar .
  4. Selecione um ou mais papéis a serem aplicados à conta de serviço.

  5. Clique em Salvar para aplicar os papéis à conta de serviço.

gcloud

Adicione um papel a uma única conta de serviço.

gcloud projects add-iam-policy-binding my-project-123 \
  --member serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com \
  --role roles/editor

A política atualizada é exibida:

bindings:
- members:
  - user:email1@example.com
  role: roles/owner
- members:
  - serviceAccount:our-project-123@appspot.gserviceaccount.com
  - serviceAccount:123456789012-compute@developer.gserviceaccount.com
  - serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com
  - user:email3@example.com
  role: roles/editor
- members:
  - user:email2@example.com
  role: roles/viewer
etag: BwUm38GGAQk=
version: 1

Para instruções sobre como conceder acesso a contas de serviço como identidades nos projetos, consulte Conceder, alterar e revogar acesso a membros do projeto.

API

A solicitação POST a seguir usa o método projects.setIamPolicy() para conceder acesso de editor a uma conta de serviço my-sa-123 ao projeto my-project-123. O corpo da solicitação precisa conter a nova política que concede permissões à conta. Cada papel pode ter vários membros.

POST https://cloudresourcemanager.googleapis.com/v1/projects/my-project-123:setIamPolicy

{
    "policy":
    {
        "version": 1,
        "etag": "BwUqMvZQGfo=",
        "bindings": [
        {
            "role": "roles/editor",
            "members": [
                "serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com",
                "user:robin@example.com"
            ]
        },
        {
            "role":"roles/owner",
            "members":
            [
                "user:hollis@example.com",
            ]
        },
        {
            "role":"roles/viewer",
            "members":
            [
                "user:john@example.com",
            ]
        },
        {
            "role":"roles/iam.serviceAccountUser",
            "members":
            [
                "user:robin@example.com"
            ]
        },
        ]
    },
}

A resposta contém a nova política:

{
    "version": 1,
    "etag": "BwUqMvZQGfo=",
    "bindings": [
    {
        "role": "roles/editor",
        "members": [
            "serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com",
            "user:robin@example.com"
        ]
    },
    {
        "role":"roles/owner",
        "members":
        [
            "user:hollis@example.com",
        ]
    },
    {
        "role":"roles/viewer",
        "members":
        [
            "user:john@example.com",
        ]
    },
    {
        "role":"roles/iam.serviceAccountUser",
        "members":
        [
            "user:robin@example.com"
        ]
    },
    ]
}

Como visualizar papéis concedidos a uma conta de serviço

É possível visualizar papéis em contas de serviço da mesma maneira que você visualiza os papéis de usuários em seu projeto:

  • Abra a página do IAM no Console do Cloud.

    Abrir a página "IAM"

  • Clique em Selecionar um projeto.
  • Selecione o projeto e clique em Abrir.
  • Encontre sua conta de serviço na lista de membros associados a seu projeto. Os papéis das contas de serviço serão listados na coluna Papel.

Como configurar propriedade e acesso a uma conta de serviço

Trate usuários específicos como recursos em vez de identidades para conceder a eles propriedade e acesso às contas de serviço. Nas etapas desta seção, as contas de serviço são tratadas como recursos. Para mais informações sobre as diferenças entre cada tipo de uso, consulte o tópico Contas de serviço.

Já é possível que usuários com papéis primários de proprietário e editor de projeto modifiquem contas de serviço, mas é recomendável permitir que alguns usuários realizem apenas ações específicas em relação aos recursos da conta de serviço.

Para conceder a um usuário permissões para uma conta de serviço, use um dos métodos abaixo:

Console

  1. Abra a página IAM e administrador no Console do Cloud.

    Abrir a página IAM e administrador

  2. Clique em Selecionar um projeto e em Abrir.

  3. Na navegação à esquerda, clique em Contas de serviço.

  4. Selecione uma conta de serviço e clique em Mostrar painel de informações. Serão exibidos todos os usuários que podem acessar essa conta de serviço.

  5. Clique em Adicionar membro.

  6. Adicione o endereço de e-mail de um membro do projeto.

  7. Selecione um papel para o membro para definir quais ações ele pode executar na conta de serviço.

  8. Clique em Adicionar para aplicar o papel ao membro do projeto.

gcloud

Atualizar toda a política:

Primeiro, acesse a política que você quer modificar e grave-a em um arquivo JSON. É possível usar a sinalização --format para escolher os formatos de saída (JSON, YAML e texto). Em outros exemplos desta página, são usados formatos de saída de texto padrão. No entanto, a saída apresentada neste exemplo é gravada em um arquivo JSON (policy.json) para que a política atual seja modificada antes de ser configurada.

gcloud iam service-accounts get-iam-policy \
  my-sa-123@my-project-123.iam.gserviceaccount.com \
  --format json > policy.json

Observe que esse comando apenas retorna uma política que foi configurada na conta de serviço em si. Se não houver uma política configurada na conta de serviço, o arquivo JSON conterá um valor de ETag padrão e nada mais.

Quando não houver política, use as etapas abaixo para criar uma política com uma vinculação ou crie a política manualmente usando o JSON das etapas a seguir como modelo.

Se já houver uma política em vigor, o conteúdo do arquivo policy.json de saída será semelhante ao seguinte:

{
  "bindings": [
    {
      "members": [
        "user:hollis@example.com"
      ],
      "role": "roles/owner"
    }
  ],
  "etag": "BwUqLaVeua8="
}

Em segundo lugar, em um editor de texto, modifique o arquivo policy.json com a adição de um novo objeto à matriz bindings que define os membros do grupo e os respectivos papéis. Crie a matriz bindings, se ela ainda não existir. Para conceder p papel serviceAccountUser a robin@example.com, seria preciso alterar o exemplo mostrado acima da seguinte maneira:

{
    "bindings": [
    {
        "role": "roles/iam.serviceAccountUser",
        "members": [
            "user:robin@example.com"
        ]
    },
    {
        "role": "roles/owner",
        "members": [
            "user:hollis@example.com"
        ]
    }
    ],
    "etag": "BwUqLaVeua8="
}

Em terceiro lugar, atualize a política executando o seguinte comando:

gcloud iam service-accounts set-iam-policy \
  my-sa-123@my-project-123.iam.gserviceaccount.com policy.json

A política atualizada é exibida:

bindings:
- members:
  - user:robin@example.com
  role: roles/iam.serviceAccountUser
- members:
  - hollis@example.com
  role: roles/owner
etag: BwUjMhXbSPU=
version: 1

Adicionar uma única vinculação:

Execute o seguinte comando para adicionar uma vinculação a uma política nova ou existente:

gcloud iam service-accounts add-iam-policy-binding \
  my-sa-123@my-project-123.iam.gserviceaccount.com \
  --member='user:jane@example.com' --role='roles/editor'

A política atualizada é exibida:

bindings:
- members:
  - user:robin@example.com
  role: roles/iam.serviceAccountUser
- members:
  - user:hollis@example.com
  role: roles/owner
- members:
  - user:jane@example.com
  role: roles/editor
etag: BwUqKjVeua8=
version: 1

Remover uma única vinculação:

Remova uma única vinculação de uma política existente. Basta executar o seguinte comando:

gcloud iam service-accounts remove-iam-policy-binding \
    my-sa-123@my-project-123.iam.gserviceaccount.com \
    --member='user:jane@example.com' --role='roles/editor'

A política atualizada é exibida:

bindings:
- members:
  - user:robin@example.com
  role: roles/iam.serviceAccountUser
- members:
  - user:hollis@example.com
  role: roles/owner
etag: BwUqNkVeua8=
version: 1

API

Solicitação:

POST https://iam.googleapis.com/v1/projects/my-project-123/serviceAccounts/my-sa-123@my-project-123.iam.gserviceaccount.com:setIamPolicy

O corpo da solicitação precisa conter a política a ser concedida:

{
    "policy":
    {
        "etag": "BwUqLaVeua8=",
        "bindings": [
        {
            "role": "roles/iam.serviceAccountUser",
            "members": [
                "user:robin@example.com"
            ]
        },
        {
            "role": "roles/owner",
            "members": [
                "user:hollis@example.com"
            ]
        }
        ]
    },
}

A resposta contém a política atualizada:

{
    "etag": "BwUqMqbViM8=",
    "bindings": [
    {
        "role": "roles/iam.serviceAccountUser",
        "members": [
            "user:robin@example.com"
        ]
    },
    {
        "role": "roles/owner",
        "members": [
        "user:hollis@example.com"
        ]
    }
    ]
}

Como visualizar papéis em uma conta de serviço

É possível tratar uma conta de serviço como um recurso, portanto, ela tem políticas do Cloud IAM, da mesma forma que outros recursos do Google Cloud. Logo, para visualizar os membros que receberam um papel em uma determinada conta de serviço, aplique a política do Cloud IAM para uma conta de serviço usando o método serviceAccounts.getIamPolicy(), o Console do Cloud ou a ferramenta gcloud.

Console

  1. Abra a página IAM e administrador no Console do Cloud.

    Abrir a página IAM e administrador

  2. Clique em Selecionar um projeto e em Abrir. A página agora lista todos os usuários e seus papéis correspondentes para este projeto.

  3. Na navegação à esquerda, clique em Contas de serviço.

  4. Marque a caixa de seleção ao lado da conta de serviço desejada e, então, clique em Mostrar painel de informações. Será exibida uma lista dos papéis que foram concedidos na conta de serviço. Expanda cada função para visualizar os membros que receberam esse papel na conta de serviço.

gcloud

Para acessar uma política para uma conta de serviço, gere o seguinte comando:

gcloud iam service-accounts get-iam-policy \
    my-sa-123@my-project-123.iam.gserviceaccount.com

A saída será a política, semelhante ao seguinte:

bindings:
- members:
  - user:hollis@example.com
  role: roles/owner
- members:
  - user:robin@example.com
  role: roles/iam.serviceAccountUser
etag: BwUqLaVeua8=
version: 1

Se você não atribuiu um papel à conta de serviço, a saída mostrará apenas um valor de ETag:

API

Os seguintes snippets de código conseguem a política do IAM da conta de serviço my-sa-123@my-project-123.iam.gserviceaccount.com.

Solicitação:

POST https://iam.googleapis.com/v1/projects/my-project-123/serviceAccounts/my-sa-123@my-project-123.iam.gserviceaccount.com:getIamPolicy
Response:

{
    "etag": "BwUqLaVeua8=",
    "bindings": [
    {
        "role": "roles/iam.serviceAccountUser",
        "members": [
            "user:robin@example.com"
        ]
    }
    ]
}

Se você não atribuiu um papel à conta de serviço, a resposta conterá apenas um valor de ETag.

Para mais informações sobre as políticas do IAM, consulte a Política.