Cómo otorgar, cambiar y revocar el acceso a los recursos

En esta página, se describe cómo otorgar, cambiar y revocar el acceso a un recurso. Puedes otorgar diferentes niveles de acceso para los recursos que posees a diferentes usuarios mediante el uso de funciones de IAM específicas.

Puedes administrar las funciones de los usuarios con Cloud Console, la herramienta de línea de comandos de gcloud, la API de REST o las bibliotecas cliente. En la primera mitad de este artículo, se aborda el uso de Cloud Console, que es el método más sencillo, junto con las actualizaciones rápidas mediante la herramienta de línea de comandos de gcloud. En la segunda mitad, se abordará el uso de métodos programáticos para situaciones más complejas.

Si quieres usar IAM con Identity-Aware Proxy (IAP) para proteger el acceso a las aplicaciones, consulta la Documentación de IAP.

Antes de comenzar

Permisos necesarios

Para administrar el acceso a un proyecto, necesitas una función que incluya los siguientes permisos:

  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.setIamPolicy

Para obtener estos permisos y seguir el principio de privilegio mínimo, pídele a tu administrador que te otorgue una de las siguientes funciones:

  • Administrador del proyecto de IAM (roles/resourcemanager.projectIamAdmin)
  • Administrador de seguridad (roles/iam.securityAdmin)

Como alternativa, el administrador puede otorgarte una función diferente con los permisos necesarios, como una función personalizada o una función predefinida con más permisos.

Usa Cloud Console

El uso de Cloud Console es una manera rápida y sencilla de administrar las funciones de los usuarios.

Otorga acceso

Para agregar un miembro del equipo a un proyecto y otorgarle una función de IAM, sigue estos pasos:

  1. En Cloud Console, ve a la página IAM.

    Ir a la página IAM

  2. Haz clic en Agregar.

  3. Ingresa una dirección de correo electrónico. Puedes agregar personas, cuentas de servicio o Grupos de Google como miembros, pero cada proyecto debe tener al menos una persona como miembro.

  4. Selecciona una función. Las funciones les dan a los miembros el nivel adecuado de permisos. Para una mejor seguridad, se recomienda brindarle al miembro la menor cantidad de privilegios que necesite. Los miembros con permisos de propietario también son propietarios de proyectos y pueden gestionar todos los aspectos del proyecto, incluida su finalización.

  5. Haz clic en Guardar.

Para otorgar una función a un miembro en más de un proyecto, sigue estos pasos:

  1. En Cloud Console, ve a la página Administrar recursos.

    Abrir la página Administrar recursos

  2. Selecciona todos los proyectos para los que deseas otorgar permisos.

  3. Haz clic en Mostrar panel de información y, luego, en la pestaña Permisos.

  4. Ingresa una dirección de correo electrónico en el campo Nuevos miembros y selecciona la función deseada en el menú desplegable.

  5. Haz clic en Guardar. Al miembro se le otorga la función seleccionada en cada uno de los proyectos seleccionados.

Revoca el acceso

  1. En Cloud Console, ve a la página IAM.

    Ir a la página IAM

  2. Identifica el miembro al que deseas revocarle el acceso y haz clic en el botón Editar  que se encuentra a la derecha.

  3. Haz clic en el botón Borrar para cada función que desees revocar y, luego, haz clic en Guardar.

Modifica el acceso

No hay ningún procedimiento especial para modificar el acceso. Tan solo sigue los pasos para otorgar y revocar el acceso hasta que el usuario tenga las funciones deseadas.

Usa gcloud para obtener actualizaciones rápidas

Puedes agregar o revocar una sola función con los comandos add-iam-policy-binding y remove-iam-policy-binding de la herramienta de línea de comandos de gcloud.

Otorga acceso

Para otorgarle una función a un miembro con rapidez, ejecuta el comando add-iam-policy-binding de la herramienta de gcloud:

gcloud group add-iam-policy-binding resource \
    --member=member --role=role-id

Ingresa los siguientes valores:

  • group: Es el grupo de herramientas de gcloud del recurso que deseas actualizar. Por ejemplo, puedes usar organizations o projects.
  • resource: Es el nombre del recurso.
  • member: Es un identificador para el miembro, que suele tener el formato member-type:id. Por ejemplo, user:my-user@example.com. Si deseas obtener una lista completa de los valores que member puede tener, consulta la referencia sobre la vinculación de políticas.

  • role-id: El nombre de la función.

Por ejemplo, para otorgarle la función de visualizador al usuario my-user@example.com en el proyecto my-project, ejecuta este comando:

gcloud projects add-iam-policy-binding my-project \
    --member=user:my-user@example.com --role=roles/viewer

Revoca el acceso

Para revocar una función de un usuario con rapidez, ejecuta el comando remove-iam-policy-binding de la herramienta de gcloud:

gcloud group remove-iam-policy-binding resource \
    --member=member --role=role-id

Ingresa los siguientes valores:

  • group: Es el grupo de herramientas de gcloud del recurso que deseas actualizar. Por ejemplo, puedes usar organizations o projects.
  • resource: Es el nombre del recurso.
  • member: Es un identificador para el miembro, que suele tener el formato member-type:id. Por ejemplo, user:my-user@example.com. Si deseas obtener una lista completa de los valores que member puede tener, consulta la referencia sobre la vinculación de políticas.

  • role-id: El nombre de la función.

Por ejemplo, para revocar la función de visualizador del usuario my-user@example.com en el proyecto my-project, ejecuta este comando:

gcloud projects remove-iam-policy-binding my-project \
    --member=user:my-user@example.com --role=roles/viewer

Controla el acceso de manera programática

En algunos casos de uso, es más sencillo administrar el control de acceso de manera programática. Puedes usar la herramienta de línea de comandos de gcloud, la API de REST o las bibliotecas cliente para controlar el acceso de manera programática. Los métodos programáticos son útiles cuando se realizan actualizaciones automáticas o a gran escala que llevarían mucho tiempo en Cloud Console o mediante la ejecución de comandos de gcloud para cada miembro.

Descripción general de la política de IAM

El acceso a un recurso se administra a través de una política de IAM. Una política es una colección de vinculaciones que asocian a un miembro, como una cuenta de usuario o de servicio, con una función. Las políticas se representan con JSON o YAML.

En el siguiente ejemplo, se muestra una política en la que se le otorgó la función de propietario a fatima@example.com, y la función de editor a wei@example.com y service-account-13@appspot.gserviceaccount.com:

{
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:fatima@example.com"
      ]
    },
    {
      "role": "roles/editor",
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:wei@example.com"
      ]
    }
  ],
  "etag": "BwUjMhCsNvY=",
  "version": 1
}

Actualizas una política para un recurso con el patrón de lectura-modificación-escritura. Esto significa que no hay métodos distintos para crear, modificar o revocar el acceso de los usuarios. En cambio, todas las modificaciones se hacen mediante lo siguiente:

  1. Lectura de la política actual mediante una llamada a getIamPolicy()
  2. Edición de la política mostrada, ya sea mediante el uso de un editor de texto o de manera programática, para agregar o quitar a los miembros deseados y sus concesiones de funciones
  3. Escritura de la política actualizada mediante una llamada a setIamPolicy()

Es común otorgar permisos para un proyecto o una organización en su totalidad. Sin embargo, también puedes establecer políticas de manera más detallada en una amplia gama de recursos de Google Cloud, como instancias de Compute Engine o depósitos de Cloud Storage. Para obtener una lista completa de las funciones y el nivel de recursos más bajo al que puedes otorgar cada función, consulta Comprende las funciones.

Obtén la política actual

Comando de gcloud

Ejecuta el comando get-iam-policy para el recurso. En el siguiente ejemplo, se muestra el comando get-iam-policy para proyectos:

gcloud projects get-iam-policy project-id --format=format > filepath

Ingresa los siguientes valores:

  • project-id: Es el proyecto que deseas actualizar (por ejemplo, my-project).
  • format: Es el valor json o yaml.
  • filepath: Es la ruta a un nuevo archivo de salida de la política.

Por ejemplo, con el siguiente comando, se obtiene la política para el proyecto my-project en formato JSON y se guarda en el directorio principal del usuario:

gcloud projects get-iam-policy my-project --format json > ~/policy.json

API de REST

El método projects.getIamPolicy de la API de Resource Manager obtiene la política de IAM de un proyecto.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

Método HTTP y URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:getIamPolicy

Cuerpo JSON de la solicitud:

{
  "options": {
    "requestedPolicyVersion": policy-version
  }
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/iam.securityReviewer",
      "members": [
        "user:fatima@example.com"
      ]
    }
  ]
}

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para C#.


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy GetPolicy(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
            projectId).Execute();
        return policy;
    }
}

Java

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Java.

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.model.GetIamPolicyRequest;
import com.google.api.services.cloudresourcemanager.model.Policy;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class GetPolicy {

  // Gets a project's policy.
  public static Policy getPolicy(String projectId) {
    // projectId = "my-project-id"

    Policy policy = null;

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return policy;
    }

    try {
      GetIamPolicyRequest request = new GetIamPolicyRequest();
      policy = service.projects().getIamPolicy(projectId, request).execute();
      System.out.println("Policy retrieved: " + policy.toString());
      return policy;
    } catch (IOException e) {
      System.out.println("Unable to get policy: \n" + e.toString());
      return policy;
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Python.

def get_policy(project_id, version=1):
    """Gets IAM policy for a project."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
        scopes=["https://www.googleapis.com/auth/cloud-platform"],
    )
    service = googleapiclient.discovery.build(
        "cloudresourcemanager", "v1", credentials=credentials
    )
    policy = (
        service.projects()
        .getIamPolicy(
            resource=project_id,
            body={"options": {"requestedPolicyVersion": version}},
        )
        .execute()
    )
    print(policy)
    return policy

Modifica una política

De manera programática o mediante un editor de texto, modifica la copia local de la política de tu proyecto para que refleje las funciones que deseas otorgar o revocar a determinados usuarios.

Otorga una función

Para otorgar funciones a los miembros, modifica las vinculaciones de funciones en la política. Para obtener información sobre qué funciones puedes otorgar, consulta Comprende las funciones.

Para otorgar una función que ya está incluida en la política, sigue estos pasos:

Comando de gcloud

Para otorgar una función, edita la política JSON o YAML que muestra el comando get-iam-policy. Ten en cuenta que este cambio en la política se implementará una vez que hayas establecido la política actualizada.

En el siguiente ejemplo, se otorga la función de revisor de seguridad (roles/iam.securityReviewer) a wei@example.com. A fin de otorgar esta función, agrega el usuario al arreglo members para la vinculación:

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:fatima@example.com",
    "user:wei@example.com"
  ]
}

API de REST

Para otorgar una función, edita la política JSON o YAML que muestra el comando get-iam-policy. Ten en cuenta que este cambio en la política se implementará una vez que hayas establecido la política actualizada.

En el siguiente ejemplo, se otorga la función de revisor de seguridad (roles/iam.securityReviewer) a wei@example.com. A fin de otorgar esta función, agrega el usuario al arreglo members para la vinculación:

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:fatima@example.com",
    "user:wei@example.com"
  ]
}

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para C#.


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddMember(Policy policy, string role, string member)
    {
        var binding = policy.Bindings.First(x => x.Role == role);
        binding.Members.Add(member);
        return policy;
    }
}

Java

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Java.

import com.google.api.services.cloudresourcemanager.model.Binding;
import com.google.api.services.cloudresourcemanager.model.Policy;
import java.util.List;

public class AddMember {

  // Adds a member to a preexisting role.
  public static void addMember(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/existing-role";
    String member = "user:member-to-add@example.com";

    List<Binding> bindings = policy.getBindings();

    for (Binding b : bindings) {
      if (b.getRole().equals(role)) {
        b.getMembers().add(member);
        System.out.println("Member " + member + " added to role " + role);
        return;
      }
    }

    System.out.println("Role not found in policy; member not added");
  }
}

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Python.

def modify_policy_add_member(policy, role, member):
    """Adds a new member to a role binding."""

    binding = next(b for b in policy["bindings"] if b["role"] == role)
    binding["members"].append(member)
    print(binding)
    return policy

Para otorgar una función que aún no está incluida en la política, agrega una nueva binding.

Comando de gcloud

Para agregar una nueva vinculación, edita la política JSON o YAML que muestra el comando get-iam-policy. Ten en cuenta que este cambio en la política se implementará una vez que hayas establecido la política actualizada.

En el siguiente ejemplo, se le otorga la función de lector a fatima@example.com. Para otorgar esta función, agrega una nueva vinculación al arreglo bindings de la política:

{
  "role": "roles/reader",
  "members": [
    "user:fatima@example.com"
  ]
}

API de REST

Para agregar una nueva vinculación, edita la política JSON o YAML que muestra el comando get-iam-policy. Ten en cuenta que este cambio en la política se implementará una vez que hayas establecido la política actualizada.

En el siguiente ejemplo, se le otorga la función de lector a fatima@example.com. Para otorgar esta función, agrega una nueva vinculación al arreglo bindings de la política:

{
  "role": "roles/reader",
  "members": [
    "user:fatima@example.com"
  ]
}

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para C#.


using System.Collections.Generic;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddBinding(Policy policy, string role, string member)
    {
        var binding = new Binding
        {
            Role = role,
            Members = new List<string> { member }
        };
        policy.Bindings.Add(binding);
        return policy;
    }
}

Java

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Java.

import com.google.api.services.cloudresourcemanager.model.Binding;
import com.google.api.services.cloudresourcemanager.model.Policy;
import java.util.ArrayList;
import java.util.List;

public class AddBinding {

  // Adds a member to a role with no previous members.
  public static void addBinding(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/role-to-add";
    List<String> members = new ArrayList<String>();
    members.add("user:member-to-add@example.com");

    Binding binding = new Binding();
    binding.setRole(role);
    binding.setMembers(members);

    policy.getBindings().add(binding);
    System.out.println("Added binding: " + binding.toString());
  }
}

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Python.

def modify_policy_add_role(policy, role, member):
    """Adds a new role binding to a policy."""

    binding = {"role": role, "members": [member]}
    policy["bindings"].append(binding)
    print(policy)
    return policy

Solo puedes otorgar funciones relacionadas con los servicios de API activados. Si un servicio, como Compute Engine, no está activo, no puedes otorgar funciones relacionadas exclusivamente con Compute Engine. Para obtener más información, consulta la página sobre cómo habilitar o inhabilitar las API.

Hay algunas restricciones únicas cuando se otorgan permisos en proyectos, en particular, cuando se otorga la función de propietario. Consulta la documentación de referencia de projects.setIamPolicy() para obtener más información.

Revoca una función

Para revocar una función, usa el siguiente comando:

Comando de gcloud

Para revocar una función, edita la política JSON o YAML que muestra el comando get-iam-policy. Este cambio en la política se implementará una vez que hayas establecido la política actualizada.

Para revocar una función de un miembro, borra los miembros o las vinculaciones que desees del arreglo bindings de la política.

API de REST

Para revocar una función, edita la política JSON o YAML que muestra el comando get-iam-policy. Este cambio en la política se implementará una vez que hayas establecido la política actualizada.

Para revocar una función de un miembro, borra los miembros o las vinculaciones que desees del arreglo bindings de la política.

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para C#.


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy RemoveMember(Policy policy, string role, string member)
    {
        try
        {
            var binding = policy.Bindings.First(x => x.Role == role);
            if (binding.Members.Count != 0 && binding.Members.Contains(member))
            {
                binding.Members.Remove(member);
            }
            if (binding.Members.Count == 0)
            {
                policy.Bindings.Remove(binding);
            }
            return policy;
        }
        catch (System.InvalidOperationException e)
        {
            System.Diagnostics.Debug.WriteLine("Role does not exist in policy: \n" + e.ToString());
            return policy;
        }
    }
}

Java

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Java.

import com.google.api.services.cloudresourcemanager.model.Binding;
import com.google.api.services.cloudresourcemanager.model.Policy;
import java.util.List;

public class RemoveMember {

  // Removes member from a role; removes binding if binding contains 0 members.
  public static void removeMember(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/existing-role";
    String member = "user:member-to-remove@example.com";

    List<Binding> bindings = policy.getBindings();
    Binding binding = null;
    for (Binding b : bindings) {
      if (b.getRole().equals(role)) {
        binding = b;
      }
    }
    if (binding.getMembers().contains(member)) {
      binding.getMembers().remove(member);
      System.out.println("Member " + member + " removed from " + role);
      if (binding.getMembers().isEmpty()) {
        policy.getBindings().remove(binding);
      }
      return;
    }

    System.out.println("Role not found in policy; member not removed");
    return;
  }
}

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Python.

def modify_policy_remove_member(policy, role, member):
    """Removes a  member from a role binding."""
    binding = next(b for b in policy["bindings"] if b["role"] == role)
    if "members" in binding and member in binding["members"]:
        binding["members"].remove(member)
    print(binding)
    return policy

Establece una política

Una vez que hayas modificado la política para otorgar las funciones deseadas, llama a setIamPolicy() con el fin de hacer las actualizaciones.

Comando de gcloud

Usa el comando set-iam-policy y proporciona una ruta al archivo JSON que contiene la política actualizada: En el siguiente ejemplo, se muestra el comando set-iam-policy para proyectos:

gcloud projects set-iam-policy project-id filepath

Ingresa los siguientes valores:

  • project-id: Es el proyecto que deseas actualizar (por ejemplo, my-project).
  • filepath: Es la ruta a un archivo que contiene la política nueva.

La respuesta contiene la política actualizada.

API de REST

El método projects.setIamPolicy de la API de Resource Manager establece la política en la solicitud como la nueva política de IAM del proyecto.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: El ID del proyecto de Google Cloud.
  • policy: Una representación JSON de la política que deseas establecer. Para obtener más información sobre el formato de una política, consulta la Referencia de políticas.

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

{
  "policy": {
    policy
  }
}

Para enviar tu solicitud, expande una de estas opciones:

La respuesta contiene la política actualizada.


C#


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy SetPolicy(string projectId, Policy policy)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        return service.Projects.SetIamPolicy(new SetIamPolicyRequest
        {
            Policy = policy
        }, projectId).Execute();
    }
}

Java

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Java.

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.model.Policy;
import com.google.api.services.cloudresourcemanager.model.SetIamPolicyRequest;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class SetPolicy {

  // Sets a project's policy.
  public static void setPolicy(Policy policy, String projectId) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();
    // projectId = "my-project-id"

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    try {
      SetIamPolicyRequest request = new SetIamPolicyRequest();
      request.setPolicy(policy);
      Policy response = service.projects().setIamPolicy(projectId, request).execute();
      System.out.println("Policy set: " + response.toString());
    } catch (IOException e) {
      System.out.println("Unable to set policy: \n" + e.toString());
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Python.

def set_policy(project_id, policy):
    """Sets IAM policy for a project."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
        scopes=["https://www.googleapis.com/auth/cloud-platform"],
    )
    service = googleapiclient.discovery.build(
        "cloudresourcemanager", "v1", credentials=credentials
    )

    policy = (
        service.projects()
        .setIamPolicy(resource=project_id, body={"policy": policy})
        .execute()
    )
    print(policy)
    return policy

Para evitar colisiones si varias fuentes intentan actualizar la política de forma simultánea, la política contiene un valor de etag. Cuando llamas a setIamPolicy(), IAM compara el valor de etag en la solicitud con el etag existente y solo escribe la política si los valores coinciden.

Próximos pasos