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 Cloud 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. El uso de Cloud Console es el método más sencillo y se aborda en la primera mitad de este artículo, junto con la obtención de 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 deseas usar Cloud IAM con Identity-Aware Proxy (IAP) para proteger el acceso a tus aplicaciones, consulta la Documentación sobre Cloud Identity-Aware Proxy.

Antes de comenzar

Usa Cloud Console

Usar Cloud Console es una manera rápida y sencilla de administrar las funciones de los usuarios. Cuando le otorgas una función a un usuario, este no recibe un correo electrónico de invitación. Su acceso se actualiza directamente.

Otorga acceso

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

  1. Abre la página IAM en Cloud Console.

    Abrir la página IAM

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

  3. Haz clic en Agregar.

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

  5. Selecciona una función. Las funciones les dan a los miembros el nivel adecuado de permiso. 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.

  6. Haga clic en Save.

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

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

    Abrir la página IAM y proyectos de administración

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

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

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

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

Revoca acceso

  1. Abre la página IAM en Google Cloud Console.

    Abrir la página IAM

  2. Haz clic en Seleccionar un proyecto.

  3. Selecciona un proyecto y haz clic en Abrir.

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

  5. Haz clic en el botón Borrar delete 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

También puedes otorgar o revocar el acceso con rapidez mediante 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]: El grupo de herramientas de gcloud del recurso que deseas actualizar. Por ejemplo, puedes usar organizations o projects.
  • [RESOURCE]: El nombre del recurso
  • [MEMBER]: Un identificador para el miembro, que suele tener el siguiente formato: member_type:id. Por ejemplo, user:alice@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 alice@example.com en el proyecto my-project, ejecuta este comando:

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

Revoca 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]: El grupo de herramientas de gcloud del recurso que deseas actualizar. Por ejemplo, puedes usar organizations o projects.
  • [RESOURCE]: El nombre del recurso
  • [MEMBER]: Un identificador para el miembro, que suele tener el siguiente formato: member_type:id. Por ejemplo, user:alice@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 bob@example.com en el proyecto my-project, ejecuta este comando:

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

Controla el acceso de manera programática

En algunos casos prácticos, es más sencillo administrar el control del 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 Cloud IAM

El acceso a un recurso se administra a través de una política de Cloud 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 alice@example.com, y la función de editor a bob@example.com y service-account-13@appspot.gserviceaccount.com:

{
      "bindings": [
        {
          "members": [
            "user:alice@example.com"
          ],
          "role": "roles/owner"
        },
        {
          "members": [
            "serviceAccount:service-account-13@appspot.gserviceaccount.com",
            "user:bob@example.com"
          ],
          "role": "roles/editor"
        }
      ],
      "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 son hechas por 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 completos. 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.

Las secciones a continuación muestran cómo obtener, modificar y configurar una política para un proyecto.

Obtén la política actual

Comando de gcloud

Ejecuta el comando get-iam-policy:

    gcloud projects get-iam-policy [PROJECT_ID] --format [FORMAT] > [FILE-PATH]
    

Ingresa los siguientes valores:

  • [PROJECT_ID]: El proyecto que estás actualizando (por ejemplo, my-project)
  • [FORMAT]: El valor JSON o YAML
  • [FILEPATH]: 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 de inicio del usuario:

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

API de REST

Llama a getIamPolicy():

    POST https://cloudresourcemanager.googleapis.com/v1/projects/[PROJECT_ID]:getIamPolicy
    

Reemplaza [PROJECT_ID] por el proyecto sobre el que recibes información (por ejemplo, my-project).

La respuesta contiene 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 Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud 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;
        }
    }

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 Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud 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 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 le otorga la función de editor a eve@example.com. A fin de otorgar esta función, agrega el usuario al arreglo members para la vinculación:

{
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:bob@example.com",
        "user:eve@example.com"
      ],
      "role": "roles/editor"
    }
    

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 le otorga la función de editor a eve@example.com. A fin de otorgar esta función, agrega el usuario al arreglo members para la vinculación:

{
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:bob@example.com",
        "user:eve@example.com"
      ],
      "role": "roles/editor"
    }
    

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 Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud 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;
        }
    }

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 Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud 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 eve@example.com. Para otorgar esta función, agrega una nueva vinculación al arreglo bindings de la política:

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

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 eve@example.com. Para otorgar esta función, agrega una nueva vinculación al arreglo bindings de la política:

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

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 Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud 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;
        }
    }

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 Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud 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 vinculaciones deseados 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 vinculaciones deseados 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 Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud 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;
            }
        }
    }

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 Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud 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:

    gcloud projects set-iam-policy [PROJECT_ID] [FILEPATH]
    

Ingresa los siguientes valores:

  • [PROJECT_ID]: El proyecto que estás actualizando (por ejemplo, my-project)
  • [FILEPATH]: La ruta a un archivo que contiene la política nueva

La respuesta contiene la política actualizada.

API de REST

Llama a setIamPolicy():

    POST https://cloudresourcemanager.googleapis.com/v1/projects/[PROJECT_ID]:setIamPolicy
    

Reemplaza [PROJECT_ID] por el proyecto que estás actualizando (por ejemplo, my-project).

El cuerpo de la solicitud debe contener la política de IAM actualizada.

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();
        }
    }

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 Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud 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(), Cloud IAM compara el valor de etag en la solicitud con el etag existente y solo escribe la política si los valores coinciden.

Qué sigue