Visualiza las funciones otorgables en los recursos

Antes de otorgar una función de administración de identidades y accesos (IAM) a un usuario para un recurso, es posible que quieras saber qué funciones se pueden otorgar a un recurso en particular.

Comprende qué funciones se pueden otorgar

Una función es otorgable en un recurso, o por encima de él, si contiene algún permiso para ese tipo de recurso. Por ejemplo, la función storage.admin otorga permisos a las API de storage.buckets.get y storage.objects.get, de modo que se puede otorgar en los tipos de recursos de Depósito de almacenamiento y Objetos de almacenamiento.

Las funciones también se pueden otorgar “por encima” de los tipos de recursos para los que se definen sus permisos. En otras palabras, se pueden otorgar funciones para recursos de nivel inferior en un recurso que es superior en la jerarquía de recursos de Google Cloud. Por ejemplo, la función storage.admin también se puede otorgar a nivel del proyecto o de la organización, además de los Depósitos de almacenamiento.

Los permisos otorgados por una función solo afectan a los recursos en el nivel especificado o inferior; no afectan a los recursos de un nivel superior o de pares. Además, cuando se otorga una función en un recurso, solo se otorgan los permisos aplicables al recurso dado, independientemente del nombre de la función, la descripción o de otros permisos que contenga. Por ejemplo, si asignas la función resourcemanager.organizationAdmin (que otorga el permiso resourcemanager.projects.list) a un usuario en el nivel del proyecto, solo le otorgas permisos para ese proyecto específico. No podrán enumerar o administrar todos los proyectos de la organización. Del mismo modo, si asignas la función compute.admin a una instancia de Compute Engine específica, solo otorgas permisos para esa instancia, no para otras en el proyecto.

Cómo enumerar las funciones otorgables

Antes de enumerar las funciones que se pueden otorgar, asegúrate de que el servicio se haya habilitado en el proyecto. Si no se habilitó un servicio, sus funciones no se mostrarán.

Console

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

    Ir a la página IAM

  2. Haz clic en el menú desplegable "Seleccionar un proyecto" en la parte superior de la página.

  3. Selecciona el proyecto o la organización para los que deseas ver las funciones.

  4. Haz clic en Agregar.

  5. Ingresa el correo electrónico o dominio del miembro en Miembros.

En el menú desplegable Selecciona una función, se muestran todas las funciones (incluidas las funciones personalizadas) que puedes otorgar al miembro en este recurso.

Comando de gcloud

Usa el comando gcloud iam list-grantable-roles para mostrar una lista de todas las funciones que se pueden aplicar a un recurso determinado.

gcloud iam list-grantable-roles full-resource-name

Según el recurso deseado, se puede mostrar una gran cantidad de funciones. Para limitar los resultados, puedes especificar una expresión de filtro.

El resultado se verá similar a lo siguiente:

description: Full control of all Compute Engine resources.
name: roles/compute.admin
title: Compute Admin
---
description: Full control of Compute Engine instance resources.
name: roles/compute.instanceAdmin
title: Compute Instance Admin

# Additional results here...

API de REST

Mediante el método roles.queryGrantableRoles, se muestra una lista de todas las funciones que se pueden otorgar en un recurso.

Antes de usar cualquiera de los datos de solicitud siguientes, realiza estos reemplazos:

  • full-resource-name: Un URI que consiste en el nombre del servicio y la ruta al recurso. Para ver ejemplos, consulta Nombres completos de recursos.

Método HTTP y URL:

POST https://iam.googleapis.com/v1/roles:queryGrantableRoles

Cuerpo JSON de la solicitud:

{
  "fullResourceName": "full-resource-name"
}

Para enviar tu solicitud, expande una de estas opciones:

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

{
  "roles": [
    {
      "name": "roles/compute.admin",
      "title": "Compute Admin",
      "description": "Full control of all Compute Engine resources."
    },
    {
      "name": "roles/compute.instanceAdmin",
      "title": "Compute Instance Admin (beta)",
      "description": "Full control of Compute Engine instance resources."
    }
  ]
}

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;
using System.Collections.Generic;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class CustomRoles
{
    public static IList<Role> ViewGrantableRoles(string fullResourceName)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var request = new QueryGrantableRolesRequest
        {
            FullResourceName = fullResourceName
        };
        var response = service.Roles.QueryGrantableRoles(request).Execute();
        foreach (var role in response.Roles)
        {
            Console.WriteLine("Title: " + role.Title);
            Console.WriteLine("Name: " + role.Name);
            Console.WriteLine("Description: " + role.Description);
            Console.WriteLine();
        }
        return response.Roles;
    }
}

Go

Antes de probar esta muestra, sigue las instrucciones de configuración para Go 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 Go.

import (
	"context"
	"fmt"
	"io"

	iam "google.golang.org/api/iam/v1"
)

// viewGrantableRoles lists roles grantable on a resource.
func viewGrantableRoles(w io.Writer, fullResourceName string) ([]*iam.Role, error) {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return nil, fmt.Errorf("iam.NewService: %v", err)
	}

	request := &iam.QueryGrantableRolesRequest{
		FullResourceName: fullResourceName,
	}
	response, err := service.Roles.QueryGrantableRoles(request).Do()
	if err != nil {
		return nil, fmt.Errorf("Roles.QueryGrantableRoles: %v", err)
	}
	for _, role := range response.Roles {
		fmt.Fprintf(w, "Found grantable role: %v\n", role.Name)
	}
	return response.Roles, err
}

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.

QueryGrantableRolesRequest request = new QueryGrantableRolesRequest();
request.setFullResourceName(fullResourceName);

QueryGrantableRolesResponse response = service.roles().queryGrantableRoles(request).execute();

for (Role role : response.getRoles()) {
  System.out.println("Title: " + role.getTitle());
  System.out.println("Name: " + role.getName());
  System.out.println("Description: " + role.getDescription());
  System.out.println();
}

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 view_grantable_roles(full_resource_name):
    roles = service.roles().queryGrantableRoles(body={
        'fullResourceName': full_resource_name
    }).execute()

    for role in roles['roles']:
        if 'title' in role:
            print('Title: ' + role['title'])
        print('Name: ' + role['name'])
        if 'description' in role:
            print('Description: ' + role['description'])
        print(' ')

En los ejemplos anteriores, el nombre completo del recurso es una URI sin esquema que consiste en un nombre de servicio de API compatible con DNS y una ruta de acceso a recursos.

Por ejemplo, para mostrar todas las funciones que se pueden conceder en un proyecto, usa lo siguiente:

//cloudresourcemanager.googleapis.com/projects/project-id

Los recursos de nivel inferior tienen un nombre calificado completo más detallado. Por ejemplo, usa lo siguiente para mostrar todas las funciones que se pueden conceder en una instancia de Compute Engine:

//compute.googleapis.com/projects/project-id/zones/zone-name/instances/instance-id

Próximos pasos