Asigna funciones a cuentas de servicio

Cuando otorgas funciones de IAM, puedes considerar una cuenta de servicio como un recurso o como una identidad.

Tu aplicación usa una cuenta de servicio como identidad para autenticar los servicios de Google Cloud Platform. Por ejemplo, si tienes una máquina virtual (VM) de Compute Engine que se ejecuta como una cuenta de servicio, puedes otorgar la función de editor a la cuenta de servicio (la identidad) para un proyecto (el recurso).

Al mismo tiempo, es posible que también desees controlar quién puede iniciar la VM. Para ello, otorga a un usuario (la identidad) la función serviceAccountUser para la cuenta de servicio (el recurso).

Para obtener más información sobre las cuentas de servicio y más ejemplos sobre el uso de cuentas de servicio como un recurso y una identidad, consulta Cuentas de servicio.

Requisitos previos para esta guía

Otorga funciones a una cuenta de servicio para recursos específicos

A fin de que una cuenta de servicio tenga permisos para completar acciones específicas en los recursos de tu proyecto de Cloud Platform, debes otorgar funciones a la cuenta de servicio. Por ejemplo, puedes otorgar la función storage.admin a una cuenta de servicio para que tenga control sobre objetos y depósitos en Google Cloud Storage.

Usa alguno de los siguientes métodos para otorgar funciones a una cuenta de servicio:

Console

Puedes administrar funciones en cuentas de servicio de la misma forma en que administras funciones en usuarios de tu proyecto.

  1. Abre la página IAM y administración en Cloud Console.

    Abrir la página IAM y administrador

  2. Haz clic en Seleccionar un proyecto, elige un proyecto y haz clic en Abrir.

  3. Identifica la cuenta de servicio a la que le quieres agregar una función.

    • Si la cuenta de servicio no se encuentra aún en la lista de miembros, no tiene ninguna función asignada. Haz clic en Agregar y, luego, ingresa la dirección de correo electrónico de la cuenta de servicio.
    • Si la cuenta de servicio ya se encuentra en la lista de miembros, es porque tiene funciones existentes. Para editar las funciones de la cuenta de servicio, haz clic en el botón Editar .
  4. Selecciona una o más funciones para aplicar a la cuenta de servicio.

  5. Haz clic en Guardar para aplicar las funciones a la cuenta de servicio.

gcloud

Agrega una función a una sola cuenta de servicio.

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

El siguiente comando genera la política actualizada:

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

Si quieres obtener instrucciones sobre la manera de otorgar acceso a cuentas de servicio como identidades para proyectos, consulta la sección sobre cómo otorgar, cambiar y revocar el acceso a miembros del proyecto.

API

La siguiente solicitud POST usa el método projects.setIamPolicy() a fin de otorgar acceso de editor a una cuenta de servicio my-sa-123 para el proyecto my-project-123. El cuerpo de la solicitud debe contener la política nueva que otorga permisos a la cuenta de servicio. Cada función puede tener varios miembros.

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"
            ]
        },
        ]
    },
}

La respuesta contiene esta política nueva:

{
    "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"
        ]
    },
    ]
}

Visualiza funciones otorgadas a una cuenta de servicio

Puedes ver las funciones en las cuentas de servicio de la misma manera en que ves las funciones en los usuarios de tu proyecto. Para ello, completa los siguientes pasos:

  • Abre la página IAM en Cloud Console.

    Abrir la página IAM

  • Haz clic en Seleccionar un proyecto.
  • Selecciona tu proyecto y haz clic en Abrir.
  • Busca tu cuenta de servicio en la lista de miembros asociados con tu proyecto. Las funciones de las cuentas de servicio se enumerarán en la columna Función.

Configura la propiedad y el acceso a una cuenta de servicio

Puedes permitir que usuarios específicos sean propietarios y tengan acceso a cuentas de servicio si se los trata como un recurso, en lugar de como una identidad. En los pasos de esta sección, las cuentas de servicio se tratan como un recurso. Para obtener más información sobre las diferencias entre cada tipo de uso, consulta el tema Cuentas de servicio.

Los usuarios con funciones básicas de propietario y editor de proyectos ya pueden modificar las cuentas de servicio, pero es posible que quieras permitir que algunos usuarios realicen solo acciones específicas en los recursos de la cuenta de servicio.

Usa alguno de los siguientes métodos si deseas otorgar permisos a un usuario para una cuenta de servicio:

Console

  1. Abre la página IAM y administración en Cloud Console.

    Abrir la página IAM y administrador

  2. Haz clic en Seleccionar un proyecto, elige un proyecto y haz clic en Abrir.

  3. En el panel de navegación izquierdo, haz clic en Cuentas de servicio.

  4. Selecciona una cuenta de servicio y, luego, haz clic en Mostrar panel de información. Se muestran todos los usuarios que pueden acceder a esa cuenta de servicio.

  5. Haz clic en Agregar miembro.

  6. Agrega la dirección de correo electrónico de un miembro del proyecto.

  7. Selecciona una función para ese miembro a modo de definir qué acciones puede realizar en la cuenta de servicio.

  8. Haz clic en Agregar para aplicar la función al miembro del proyecto.

gcloud

Actualiza toda la política:

Primero, obtén la política que deseas modificar y guárdala en un archivo JSON. Puedes usar la marca --format para elegir los formatos de salida (los formatos de salida disponibles son JSON, YAML y texto). En los otros ejemplos de esta página, se usan los formatos de salida de texto predeterminados, pero en este ejemplo, se escribe el resultado en un archivo JSON (policy.json) para modificar la política existente antes de configurarla.

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

Ten en cuenta que este comando solo muestra una política que se configuró en la cuenta de servicio. Si no hay ninguna política establecida en la cuenta de servicio, el archivo JSON contiene un valor de ETag predeterminado y nada más.

Cuando no existe ninguna política, puedes configurar una política nueva con una sola vinculación mediante los siguientes pasos, o puedes crear la política de forma manual si usas el archivo JSON en los pasos a continuación como plantilla.

Si ya hay una política vigente, los contenidos del archivo de salida policy.json se verán similares a los siguientes:

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

En segundo lugar, en un editor de texto, modifica el archivo policy.json; para ello, agrega un objeto nuevo al arreglo bindings en el que se definen los miembros del grupo y sus funciones. Crea el arreglo bindings si aún no existe. Para otorgar la función serviceAccountUser a robin@example.com, deberías cambiar el ejemplo que se muestra arriba de la siguiente manera:

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

En tercer lugar, actualiza la política mediante la ejecución del siguiente comando:

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

El siguiente comando genera la política actualizada:

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

Agrega una sola vinculación:

Puedes agregar una sola vinculación a una política nueva o existente con la ejecución del comando siguiente:

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'

El comando genera esta política actualizada:

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

Quita una sola vinculación:

Puedes quitar una sola vinculación desde una política existente si ejecutas el comando a continuación:

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'

El comando genera esta política actualizada:

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

API

Solicitud:

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

En el cuerpo de la solicitud debe estar la política que se otorga:

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

En la siguiente respuesta, se incluye la política actualizada:

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

Visualiza funciones existentes en una cuenta de servicio

Dado que una cuenta de servicio se puede considerar como un recurso, las cuentas de servicio contienen políticas de Cloud IAM, como otros recursos de Google Cloud. Por lo tanto, para ver los miembros a los que se les otorgó una función en una cuenta de servicio determinada, obtén la política de Cloud IAM para una cuenta de servicio mediante el método serviceAccounts.getIamPolicy(), Cloud Console o la herramienta de gcloud.

Console

  1. Abre la página IAM y administración en Cloud Console.

    Abrir la página IAM y administrador

  2. Haz clic en Seleccionar un proyecto, elige un proyecto y haz clic en Abrir. En esta página, ahora se brinda una lista de todos los usuarios y sus funciones correspondientes para este proyecto.

  3. En el panel de navegación izquierdo, haz clic en Cuentas de servicio.

  4. Selecciona la casilla de verificación junto a la cuenta de servicio deseada y haz clic en Mostrar panel de información. Se muestra una lista de las funciones que se otorgaron en la cuenta de servicio. Expande cada función para ver los miembros a los que se les otorgó esa función en la cuenta de servicio.

gcloud

Si quieres obtener una política para una cuenta de servicio, ejecuta el comando siguiente:

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

El resultado será la política, que se verá similar a lo siguiente:

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

Si no asignaste una función a la cuenta de servicio, el resultado mostrará solo un valor Etag:

API

Con los siguientes fragmentos de código, se obtiene la política de IAM para la cuenta de servicio my-sa-123@my-project-123.iam.gserviceaccount.com.

Solicitud:

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"
        ]
    }
    ]
}

Si no asignaste una función a la cuenta de servicio, la respuesta contendrá solo un valor Etag:

Si quieres obtener más información sobre las políticas de IAM, consulta la sección sobre política.