Gestionar acceso a cuentas de servicio

En esta página se describe cómo conceder, cambiar y revocar el acceso de una principal a una sola cuenta de servicio. Para gestionar el acceso de una principal a todas las cuentas de servicio de un proyecto, una carpeta o una organización, gestiona su acceso a nivel de proyecto, carpeta u organización.

En Gestión de Identidades y Accesos (IAM), el acceso se gestiona mediante políticas de permiso, también conocidas como políticas de IAM. Una política de permiso se adjunta a un recursoGoogle Cloud . Cada política de permiso contiene una colección de vinculaciones de roles que asocian una o varias entidades principales, como usuarios o cuentas de servicio, a un rol de gestión de identidades y accesos. Estas vinculaciones de roles conceden los roles especificados a las entidades principales, tanto en el recurso al que se adjunta la política de permiso como en todos los descendientes de ese recurso. Para obtener más información sobre las políticas de permiso, consulta Información sobre las políticas de permiso.

Las cuentas de servicio son recursos a los que se puede conceder acceso a otras entidades y entidades a las que se puede conceder acceso a otros recursos. En esta página se tratan las cuentas de servicio como recursos y se describe cómo conceder acceso a otros principales. Para saber cómo conceder acceso a una cuenta de servicio a otros recursos, consulta las siguientes guías:

En esta página se describe cómo gestionar el acceso a las cuentas de servicio mediante la consola deGoogle Cloud , la CLI de Google Cloud y la API REST. También puedes gestionar el acceso mediante las bibliotecas de cliente de gestión de identidades y accesos.

Antes de empezar

Roles de gestión de identidades y accesos necesarios

Para obtener los permisos que necesitas para gestionar el acceso a una cuenta de servicio, pide a tu administrador que te asigne el rol de IAM Administrador de cuentas de servicio (roles/iam.serviceAccountAdmin) en la cuenta de servicio o en el proyecto propietario de la cuenta de servicio. 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 gestionar el acceso a una cuenta de servicio. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para gestionar el acceso a una cuenta de servicio, se necesitan los siguientes permisos:

  • iam.serviceAccounts.get
  • iam.serviceAccounts.list
  • iam.serviceAccounts.getIamPolicy
  • iam.serviceAccounts.setIamPolicy

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

Ver el acceso actual

En la siguiente sección se muestra cómo usar la Google Cloud consola, gcloud CLI y la API REST para ver quién tiene acceso a una cuenta de servicio. También puedes ver el acceso mediante las bibliotecas de cliente de gestión de identidades y accesos para obtener la política de permisos de la cuenta de servicio.

Consola

  1. En la Google Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.

  3. Haz clic en la dirección de correo de la cuenta de servicio.

  4. Ve a la pestaña Permisos. En la sección Principales con acceso a esta cuenta de servicio se enumeran todos los principales a los que se les ha concedido un rol en la cuenta de servicio.

    Esta lista incluye las entidades cuyo acceso procede de roles que se han concedido en recursos superiores. Para obtener más información sobre la herencia de políticas, consulta el artículo Herencia de políticas y jerarquía de recursos.

  5. Opcional: Para ver las concesiones de roles de los agentes de servicio, marca la casilla Incluir concesiones de roles proporcionadas por Google.

gcloud

Para ver quién tiene acceso a tu cuenta de servicio, obtén la política de permisos de la cuenta de servicio. Para saber cómo interpretar las políticas de permiso, consulta el artículo Descripción de las políticas de permiso.

Para obtener la política de permiso de la cuenta de servicio, ejecuta el comando get-iam-policy de la cuenta de servicio:

gcloud iam service-accounts get-iam-policy SA_ID --format=FORMAT > PATH

Proporciona los siguientes valores:

  • SA_ID: el ID de tu cuenta de servicio. Puede ser la dirección de correo de la cuenta de servicio con el formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com o el ID numérico único de la cuenta de servicio.

  • FORMAT: formato de la política. Usa json o yaml.

  • PATH: ruta a un nuevo archivo de salida de la política.

Por ejemplo, el siguiente comando obtiene la política de la cuenta de servicio my-service-account y la guarda en tu directorio principal en formato JSON:

gcloud iam service-accounts get-iam-policy my-service-account --format json > ~/policy.json

REST

Para ver quién tiene acceso a tu cuenta de servicio, obtén la política de permisos de la cuenta de servicio. Para saber cómo interpretar las políticas de permiso, consulta el artículo Descripción de las políticas de permiso.

El método serviceAccounts.getIamPolicy obtiene la política de autorización de una cuenta de servicio.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PROJECT_ID: tu ID de proyecto. Google Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
  • SA_ID: el ID de tu cuenta de servicio. Puede ser la dirección de correo de la cuenta de servicio con el formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com o el ID numérico único de la cuenta de servicio.

  • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.

Método HTTP y URL:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:getIamPolicy

Cuerpo JSON de la solicitud:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

Para enviar tu solicitud, despliega una de estas opciones:

La respuesta contiene la política de autorización de la cuenta de servicio. Por ejemplo:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/serviceAccountAdmin",
      "members": [
        "user:my-user@example.com"
      ]
    }
  ]
}

Conceder o revocar un solo rol de gestión de identidades y accesos

Puedes usar la Google Cloud consola y la interfaz de línea de comandos gcloud para asignar o revocar rápidamente un único rol de una sola entidad principal sin tener que editar directamente la política de permisos de la cuenta de servicio. Entre los tipos habituales de principales se incluyen las cuentas de Google, las cuentas de servicio, los grupos de Google y los dominios.Para ver una lista de todos los tipos de principales, consulta Tipos de principales.

Por lo general, los cambios en las políticas se aplican en un plazo de 2 minutos. Sin embargo, en algunos casos, los cambios pueden tardar 7 minutos o más en propagarse por el sistema.

Si necesitas ayuda para identificar el rol predefinido más adecuado, consulta el artículo Buscar los roles predefinidos adecuados.

Conceder un solo rol de gestión de identidades y accesos

Para conceder un solo rol a una entidad, sigue estos pasos:

Consola

  1. En la Google Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.

  3. Haz clic en la dirección de correo de la cuenta de servicio.

  4. Ve a la pestaña Permisos y busca la sección Principales con acceso a esta cuenta de servicio.

  5. Selecciona una cuenta principal a la que quieras asignar un rol:

    • Para conceder un rol a una cuenta principal que ya tiene otros roles en la cuenta de servicio, busca la fila que contenga la cuenta principal, haz clic en Editar cuenta principal en esa fila y, a continuación, en Añadir otro rol.

      Para conceder un rol a un agente de servicio, selecciona la casilla Incluir concesiones de roles proporcionadas por Google para ver su dirección de correo electrónico.

    • Para asignar un rol a una principal que no tenga ningún rol en la cuenta de servicio, haz clic en Dar acceso y, a continuación, introduce un identificador de la principal (por ejemplo, my-user@example.com o //iam.googleapis.com/locations/global/workforcePools/example-pool/group/example-group@example.com).

  6. Selecciona un rol de la lista desplegable para concederlo. Para seguir las prácticas recomendadas de seguridad, elige un rol que incluya solo los permisos que necesite tu principal.

  7. Opcional: Añade una condición al rol.

  8. Haz clic en Guardar. Se asigna el rol al principal en la cuenta de servicio.

gcloud

Para asignar rápidamente un rol a una cuenta principal, ejecuta el comando add-iam-policy-binding:

gcloud iam service-accounts add-iam-policy-binding SA_ID \
    --member=PRINCIPAL --role=ROLE_NAME \
    --condition=CONDITION

Proporciona los siguientes valores:

  • SA_ID: el ID de tu cuenta de servicio. Puede ser la dirección de correo de la cuenta de servicio con el formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com o el ID numérico único de la cuenta de servicio.

  • PRINCIPAL: identificador de la entidad principal o del miembro, que suele tener el siguiente formato: PRINCIPAL-TYPE:ID. Por ejemplo, user:my-user@example.com o principalSet://iam.googleapis.com/locations/global/workforcePools/example-pool/group/example-group@example.com. Para ver una lista completa de los valores que puede tener PRINCIPAL, consulta Identificadores principales.

    En el caso del tipo de principal user, el nombre de dominio del identificador debe ser un dominio de Google Workspace o de Cloud Identity. Para saber cómo configurar un dominio de Cloud Identity, consulta la descripción general de Cloud Identity.

  • ROLE_NAME: el nombre del rol que quieres conceder. Se debe utilizar uno de los formatos indicados a continuación.

    • Roles predefinidos: roles/SERVICE.IDENTIFIER
    • Roles personalizados a nivel de proyecto: projects/PROJECT_ID/roles/IDENTIFIER
    • Roles personalizados a nivel de organización: organizations/ORG_ID/roles/IDENTIFIER

    Si quieres ver una lista de los roles predefinidos, consulta el artículo Descripción de los roles.

  • CONDITION: opcional. La condición que se va a añadir a la vinculación de roles. Para obtener más información sobre las condiciones, consulta el resumen de las condiciones.

Por ejemplo, para conceder el rol Usuario de cuenta de servicio al usuario my-user@example.com para la cuenta de servicio my-service-account@my-project.iam.gserviceaccount.com:

gcloud iam service-accounts add-iam-policy-binding my-service-account@my-project.iam.gserviceaccount.com \
    --member=user:my-user@example.com --role=roles/iam.serviceAccountUser

Revocar un solo rol de gestión de identidades y accesos

Para revocar un solo rol de una entidad de seguridad, haz lo siguiente:

Consola

  1. En la Google Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.

  3. Haz clic en la dirección de correo de la cuenta de servicio.

  4. Ve a la pestaña Permisos y busca la sección Principales con acceso a esta cuenta de servicio.

  5. Busca la fila que contenga la cuenta principal cuyo acceso quieras revocar. A continuación, haga clic en Editar principal en esa fila.

  6. Haga clic en el botón Eliminar del rol que quiera revocar y, a continuación, haga clic en Guardar.

gcloud

Para revocar rápidamente un rol de un usuario, ejecuta el comando remove-iam-policy-binding:

gcloud iam service-accounts remove-iam-policy-binding SA_ID \
    --member=PRINCIPAL --role=ROLE_NAME

Proporciona los siguientes valores:

  • SA_ID: el ID de tu cuenta de servicio. Puede ser la dirección de correo de la cuenta de servicio con el formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com o el ID numérico único de la cuenta de servicio.

  • PRINCIPAL: identificador de la entidad principal o del miembro, que suele tener el siguiente formato: PRINCIPAL-TYPE:ID. Por ejemplo, user:my-user@example.com o principalSet://iam.googleapis.com/locations/global/workforcePools/example-pool/group/example-group@example.com. Para ver una lista completa de los valores que puede tener PRINCIPAL, consulta Identificadores principales.

    En el caso del tipo de principal user, el nombre de dominio del identificador debe ser un dominio de Google Workspace o de Cloud Identity. Para saber cómo configurar un dominio de Cloud Identity, consulta la descripción general de Cloud Identity.

  • ROLE_NAME: El nombre del rol que quieres revocar. Se debe utilizar uno de los formatos indicados a continuación.

    • Roles predefinidos: roles/SERVICE.IDENTIFIER
    • Roles personalizados a nivel de proyecto: projects/PROJECT_ID/roles/IDENTIFIER
    • Roles personalizados a nivel de organización: organizations/ORG_ID/roles/IDENTIFIER

    Si quieres ver una lista de los roles predefinidos, consulta el artículo Descripción de los roles.

Por ejemplo, para revocar el rol Usuario de cuenta de servicio del usuario my-user@example.com de la cuenta de servicio my-service-account@my-project.iam.gserviceaccount.com:

gcloud iam service-accounts remove-iam-policy-binding my-service-account@my-project.iam.gserviceaccount.com \
    --member=user:my-user@example.com --role=roles/iam.serviceAccountUser

Conceder o revocar varios roles de gestión de identidades y accesos con la Google Cloud consola

Puedes usar la consola para asignar y revocar varios roles a una sola entidad principal: Google Cloud

  1. En la Google Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.

  3. Haz clic en la dirección de correo de la cuenta de servicio.

  4. Ve a la pestaña Permisos y busca la sección Principales con acceso a esta cuenta de servicio.

  5. Selecciona el principal cuyos roles quieras modificar:

    • Para modificar los roles de una cuenta principal que ya tiene roles en la cuenta de servicio, busca la fila que contiene la cuenta principal, haz clic en Editar cuenta principal en esa fila y, a continuación, haz clic en Añadir otro rol.

      Para modificar los roles de un agente de servicio, marca la casilla Incluir concesiones de roles proporcionadas por Google para ver su dirección de correo.

    • Para conceder roles a una cuenta principal que no tenga ningún rol en la cuenta de servicio, haz clic en Conceder acceso y, a continuación, introduce la dirección de correo electrónico u otro identificador de la cuenta principal.

  6. Modifica los roles de la entidad principal:

    • Para asignar un rol a un principal que no tenga ningún rol en el recurso, haz clic en Seleccionar un rol y, a continuación, selecciona el rol que quieras asignar en la lista desplegable.
    • Para asignar otro rol al principal, haz clic en Añadir otro rol y selecciona un rol de la lista desplegable.
    • Para sustituir uno de los roles del administrador principal por otro, haz clic en el rol actual y, a continuación, elige otro rol en la lista desplegable.
    • Para revocar uno de los roles del principal, haz clic en el botón Eliminar de cada rol que quieras revocar.

    También puedes añadir una condición a un rol, modificar la condición de un rol o quitar la condición de un rol.

  7. Haz clic en Guardar.

Conceder o revocar varios roles de gestión de identidades y accesos de forma programática

Para hacer cambios de acceso a gran escala que impliquen conceder y revocar varios roles a varias entidades, utiliza el patrón lectura-modificación-escritura para actualizar la política de autorización de la cuenta de servicio:

  1. Lee la política de permiso actual llamando a getIamPolicy().
  2. Edita la política de permiso, ya sea mediante un editor de texto o de forma programática, para añadir o eliminar principales o enlaces de roles.
  3. Escribe la política de permiso actualizada llamando a setIamPolicy().

En esta sección se muestra cómo usar la CLI de gcloud y la API REST para actualizar la política de permiso. También puedes actualizar la política de permiso mediante las bibliotecas de cliente de gestión de identidades y accesos.

Por lo general, los cambios en las políticas se aplican en un plazo de 2 minutos. Sin embargo, en algunos casos, los cambios pueden tardar 7 minutos o más en propagarse por el sistema.

Obtener la política de permisos actual

gcloud

Para obtener la política de permiso de la cuenta de servicio, ejecuta el comando get-iam-policy de la cuenta de servicio:

gcloud iam service-accounts get-iam-policy SA_ID --format=FORMAT > PATH

Proporciona los siguientes valores:

  • SA_ID: el ID de tu cuenta de servicio. Puede ser la dirección de correo de la cuenta de servicio con el formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com o el ID numérico único de la cuenta de servicio.

  • FORMAT: formato de la política de permiso. Usa json o yaml.

  • PATH: ruta a un nuevo archivo de salida para la política de permiso.

Por ejemplo, el siguiente comando obtiene la política de permiso de la cuenta de servicio my-service-account y la guarda en tu directorio principal en formato JSON:

gcloud iam service-accounts get-iam-policy my-service-account --format json > ~/policy.json

REST

El método serviceAccounts.getIamPolicy obtiene la política de autorización de una cuenta de servicio.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PROJECT_ID: tu ID de proyecto. Google Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
  • SA_ID: el ID de tu cuenta de servicio. Puede ser la dirección de correo de la cuenta de servicio con el formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com o el ID numérico único de la cuenta de servicio.

  • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.

Método HTTP y URL:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:getIamPolicy

Cuerpo JSON de la solicitud:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

Para enviar tu solicitud, despliega una de estas opciones:

La respuesta contiene la política de autorización de la cuenta de servicio. Por ejemplo:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/serviceAccountAdmin",
      "members": [
        "user:my-user@example.com"
      ]
    }
  ]
}

Guarda la respuesta en un archivo del tipo adecuado (json o yaml).

Java

Para saber cómo instalar y usar la biblioteca de cliente de IAM, consulta Bibliotecas de cliente de IAM. Para obtener más información, consulta la documentación de referencia de la API Java de gestión de identidades y accesos.

Para autenticarte en IAM, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.


import com.google.cloud.iam.admin.v1.IAMClient;
import com.google.iam.admin.v1.ServiceAccountName;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.Policy;
import java.io.IOException;

public class GetServiceAccountPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";
    // TODO: Replace with your service account name.
    String serviceAccount = "your-service-account";
    getPolicy(projectId, serviceAccount);
  }

  // Gets a service account's IAM policy.
  public static Policy getPolicy(String projectId, String serviceAccount) throws IOException {

    // Construct the service account email.
    // You can modify the ".iam.gserviceaccount.com" to match the name of the service account
    // whose allow policy you want to get.
    String serviceAccountEmail = serviceAccount + "@" + projectId + ".iam.gserviceaccount.com";

    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (IAMClient iamClient = IAMClient.create()) {
      GetIamPolicyRequest request = GetIamPolicyRequest.newBuilder()
              .setResource(ServiceAccountName.of(projectId, serviceAccountEmail).toString())
              .build();
      Policy policy = iamClient.getIamPolicy(request);
      System.out.println("Policy retrieved: " + policy.toString());
      return policy;
    }
  }
}

Python

Para saber cómo instalar y usar la biblioteca de cliente de IAM, consulta Bibliotecas de cliente de IAM. Para obtener más información, consulta la documentación de referencia de la API Python de gestión de identidades y accesos.

Para autenticarte en IAM, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

from google.cloud import iam_admin_v1
from google.iam.v1 import iam_policy_pb2, policy_pb2


def get_service_account_iam_policy(project_id: str, account: str) -> policy_pb2.Policy:
    """Get policy for service account.

    project_id: ID or number of the Google Cloud project you want to use.
    account: ID or email which is unique identifier of the service account.
    """

    iam_client = iam_admin_v1.IAMClient()
    request = iam_policy_pb2.GetIamPolicyRequest()
    request.resource = f"projects/{project_id}/serviceAccounts/{account}"

    policy = iam_client.get_iam_policy(request)
    return policy

Modificar la política de permiso

Modifica la copia local de la política de permitidos de tu cuenta de servicio de forma programática o mediante un editor de texto para reflejar los roles que quieras otorgar o revocar a usuarios determinados.

Para asegurarte de que no sobrescribes otros cambios, no edites ni quites el campo etag de la política de permiso. El campo etag identifica el estado actual de la política de permiso. Cuando estableces la política de permiso actualizada, IAM compara el valor de etag de la solicitud con el valor de etag actual y solo escribe la política de permiso si los valores coinciden.

Para editar los roles que concede una política de permiso, debes editar las vinculaciones de roles en la política de permiso. Las asignaciones de roles tienen el siguiente formato:

{
  "role": "ROLE_NAME",
  "members": [
    "PRINCIPAL_1",
    "PRINCIPAL_2",
    ...
    "PRINCIPAL_N"
  ],
  "conditions:" {
    CONDITIONS
  }
}

Los marcadores de posición tienen los siguientes valores:

  • ROLE_NAME: el nombre del rol que quieres conceder. Se debe utilizar uno de los formatos indicados a continuación.

    • Roles predefinidos: roles/SERVICE.IDENTIFIER
    • Roles personalizados a nivel de proyecto: projects/PROJECT_ID/roles/IDENTIFIER
    • Roles personalizados a nivel de organización: organizations/ORG_ID/roles/IDENTIFIER

    Si quieres ver una lista de los roles predefinidos, consulta el artículo Descripción de los roles.

  • PRINCIPAL_1, PRINCIPAL_2, ...PRINCIPAL_N: identificadores de las entidades a las que quieres asignar el rol.

    Los identificadores principales suelen tener el siguiente formato: PRINCIPAL-TYPE:ID. Por ejemplo, user:my-user@example.com o principalSet://iam.googleapis.com/locations/global/workforcePools/example-pool/group/example-group@example.com. Para ver una lista completa de los valores que puede tener PRINCIPAL, consulta Identificadores principales.

    En el caso del tipo de principal user, el nombre de dominio del identificador debe ser un dominio de Google Workspace o de Cloud Identity. Para saber cómo configurar un dominio de Cloud Identity, consulta la descripción general de Cloud Identity.

  • CONDITIONS: opcional. Las condiciones que especifican cuándo se concederá el acceso.

Conceder un rol

Para asignar roles a tus entidades principales, modifica las vinculaciones de roles en la política de permisos. Para saber qué roles puedes conceder, consulta Descripción de los roles o Ver los roles que se pueden conceder de la cuenta de servicio. Si necesitas ayuda para identificar los roles predefinidos más adecuados, consulta Buscar los roles predefinidos adecuados.

También puedes usar condiciones para conceder roles solo cuando se cumplan determinados requisitos.

Para conceder un rol que ya esté incluido en la política de permitidos, añade la cuenta principal a una vinculación de roles:

gcloud

Edita la política de permiso añadiendo la cuenta principal a una vinculación de roles. Ten en cuenta que este cambio no se aplicará hasta que definas la política de permiso actualizada.

Por ejemplo, supongamos que la política de permiso contiene el siguiente enlace de rol, que otorga el rol Usuario de cuenta de servicio (roles/iam.serviceAccountUser) a Kai:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com"
  ]
}

Para concederle el mismo rol a Raha, añádela a la vinculación de roles que ya existe:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

REST

Edita la política de permiso añadiendo la cuenta principal a una vinculación de roles. Ten en cuenta que este cambio no se aplicará hasta que definas la política de permiso actualizada.

Por ejemplo, supongamos que la política de permiso contiene el siguiente enlace de rol, que otorga el rol Usuario de cuenta de servicio (roles/iam.serviceAccountUser) a Kai:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com"
  ]
}

Para concederle el mismo rol a Raha, añádela a la vinculación de roles que ya existe:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

Para conceder un rol que aún no se haya incluido en la política de permisos, añade una nueva vinculación de roles:

gcloud

Edita la política de permiso añadiendo una nueva vinculación de roles que conceda el rol al principal. Este cambio no se aplicará hasta que definas la política de permiso actualizada.

Por ejemplo, para asignar el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) a Raha, añade el siguiente enlace de rol a la matriz bindings de la política de permiso:

{
  "role": "roles/iam.serviceAccountTokenCreator",
  "members": [
    "user:raha@example.com"
  ]
}

REST

Edita la política de permiso añadiendo una nueva vinculación de roles que conceda el rol al principal. Este cambio no se aplicará hasta que definas la política de permiso actualizada.

Por ejemplo, para asignar el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) a Raha, añade el siguiente enlace de rol a la matriz bindings de la política de permiso:

{
  "role": "roles/iam.serviceAccountTokenCreator",
  "members": [
    "user:raha@example.com"
  ]
}

Revocar un rol

Para revocar un rol, quita la cuenta principal de la vinculación de roles. Si no hay otros principales en la vinculación de roles, elimina toda la vinculación de roles de la política de permiso.

gcloud

Edita la política de permiso quitando la entidad principal o toda la vinculación de roles. Este cambio no se aplicará hasta que definas la política de permiso actualizada.

Por ejemplo, supongamos que la política de permiso contiene el siguiente enlace de rol, que otorga a Kai y Raha el rol Usuario de cuenta de servicio (roles/iam.serviceAccountUser):

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

Para revocar el rol de Kai, elimina el identificador principal de Kai de la vinculación de roles:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    user:raha@example.com
  ]
}

Para revocar el rol de Kai y Raha, elimina la vinculación de roles de la política de permiso.

REST

Edita la política de permiso quitando la entidad principal o toda la vinculación de roles. Este cambio no se aplicará hasta que definas la política de permiso actualizada.

Por ejemplo, supongamos que la política de permiso contiene el siguiente enlace de rol, que otorga a Kai y Raha el rol Usuario de cuenta de servicio (roles/iam.serviceAccountUser):

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

Para revocar el rol de Kai, elimina el identificador principal de Kai de la vinculación de roles:

{
  "role": "roles/iam.serviceAccountUser",
  "members": [
    user:raha@example.com
  ]
}

Para revocar el rol de Kai y Raha, elimina la vinculación de roles de la política de permiso.

Definir la política de permitir

Cuando hayas modificado la política de permiso para asignar y revocar roles, llama a setIamPolicy() para hacer las actualizaciones pertinentes.

gcloud

Para definir la política de permiso del recurso, ejecuta el comando set-iam-policy de la cuenta de servicio:

gcloud iam service-accounts set-iam-policy SA_ID PATH

Proporciona los siguientes valores:

  • SA_ID: el ID de tu cuenta de servicio. Puede ser la dirección de correo de la cuenta de servicio con el formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com o el ID numérico único de la cuenta de servicio.

  • PATH: ruta a un archivo que contiene la nueva política de permiso.

La respuesta contiene la política de permiso actualizada.

Por ejemplo, el siguiente comando define la política de permiso almacenada en policy.json como política de permiso de la cuenta de servicio my-service-account@my-project.iam.gserviceaccount.com:

gcloud iam service-accounts set-iam-policy my-service-account@my-project.iam.gserviceaccount.com \
    ~/policy.json

REST

El método serviceAccounts.setIamPolicy define una política de permiso actualizada para la cuenta de servicio.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PROJECT_ID: tu ID de proyecto. Google Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
  • SA_ID: el ID de tu cuenta de servicio. Puede ser la dirección de correo de la cuenta de servicio con el formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com o el ID numérico único de la cuenta de servicio.

  • POLICY: representación JSON de la política que quieres definir. Para obtener más información sobre el formato de una política, consulta la referencia de la política.

    Por ejemplo, para definir la política de permiso que se muestra en el paso anterior, sustituya policy por lo siguiente:

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "group:my-group@example.com"
          ]
        },
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }

Método HTTP y URL:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:setIamPolicy

Cuerpo JSON de la solicitud:

{
  "policy": POLICY
}

Para enviar tu solicitud, despliega una de estas opciones:

La respuesta contiene la política de permiso actualizada.

Java

Para saber cómo instalar y usar la biblioteca de cliente de IAM, consulta Bibliotecas de cliente de IAM. Para obtener más información, consulta la documentación de referencia de la API Java de gestión de identidades y accesos.

Para autenticarte en IAM, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

import com.google.cloud.iam.admin.v1.IAMClient;
import com.google.iam.admin.v1.ServiceAccountName;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import com.google.protobuf.FieldMask;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class SetServiceAccountPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";
    // TODO: Replace with your service account name.
    String serviceAccount = "your-service-account";
    // TODO: Replace with your policy, GetPolicy.getPolicy(projectId, serviceAccount).
    Policy policy = Policy.newBuilder().build();

    setServiceAccountPolicy(policy, projectId, serviceAccount);
  }

  // Sets a service account's policy.
  public static Policy setServiceAccountPolicy(Policy policy, String projectId,
                                               String serviceAccount) throws IOException {

    // Construct the service account email.
    // You can modify the ".iam.gserviceaccount.com" to match the name of the service account
    // whose allow policy you want to set.
    String accountEmail = String.format("%s@%s.iam.gserviceaccount.com", serviceAccount, projectId);

    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (IAMClient iamClient = IAMClient.create()) {
      List<String> paths = Arrays.asList("bindings", "etag");
      SetIamPolicyRequest request = SetIamPolicyRequest.newBuilder()
              .setResource(ServiceAccountName.of(projectId, accountEmail).toString())
              .setPolicy(policy)
              // A FieldMask specifying which fields of the policy to modify. Only
              // the fields in the mask will be modified. If no mask is provided, the
              // following default mask is used:
              // `paths: "bindings, etag"`
              .setUpdateMask(FieldMask.newBuilder().addAllPaths(paths).build())
              .build();

      return iamClient.setIamPolicy(request);
    }
  }
}

Python

Para saber cómo instalar y usar la biblioteca de cliente de IAM, consulta Bibliotecas de cliente de IAM. Para obtener más información, consulta la documentación de referencia de la API Python de gestión de identidades y accesos.

Para autenticarte en IAM, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

from google.cloud import iam_admin_v1
from google.iam.v1 import iam_policy_pb2, policy_pb2


def set_service_account_iam_policy(
    project_id: str, account: str, policy: policy_pb2.Policy
) -> policy_pb2.Policy:
    """Set policy for service account.

    Pay attention that previous state will be completely rewritten.
    If you want to update only part of the policy follow the approach
    read->modify->write.
    For more details about policies check out
    https://cloud.google.com/iam/docs/policies

    project_id: ID or number of the Google Cloud project you want to use.
    account: ID or email which is unique identifier of the service account.
    policy: Policy which has to be set.
    """

    # Same approach as for policies on project level,
    # but client stub is different.
    iam_client = iam_admin_v1.IAMClient()
    request = iam_policy_pb2.SetIamPolicyRequest()
    request.resource = f"projects/{project_id}/serviceAccounts/{account}"

    # request.etag field also will be merged which means
    # you are secured from collision, but it means that request
    # may fail and you need to leverage exponential retries approach
    # to be sure policy has been updated.
    request.policy.MergeFrom(policy)

    policy = iam_client.set_iam_policy(request)
    return policy

Siguientes pasos

Pruébalo

Si es la primera vez que utilizas Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los nuevos clientes también reciben 300 USD en crédito gratuito para ejecutar, probar y desplegar cargas de trabajo.

Empezar gratis