查看可针对资源授予的角色

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

针对某项资源为用户授予 Identity and Access Management (IAM) 角色之前,您可能想知道对于某项特定资源可以授予哪些角色。

准备工作

  • 启用 IAM API。

    启用 API

所需的角色

如需获得列出可授予角色所需的权限,请让您的管理员为您授予要列出其可授予角色的资源的 Security Reviewer (roles/iam.securityReviewer) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限

此预定义角色包含所有资源类型的 getIamPolicy 权限。如需列出可授予的角色,您需要拥有要列出可授予的角色的资源的 getIamPolicy 权限 - 例如,要列出项目的可授予角色,您需要 resourcemanager.projects.getIamPolicy 权限。您也可以使用自定义角色或其他预定义角色来获取此权限。

了解可授予哪些角色

如果某个角色包含某种资源类型的任何权限,则可以针对该资源或其上层资源授予该角色。例如,storage.admin 角色授予 storage.buckets.getstorage.objects.get API 的权限,因此可以针对“Storage Buckets”和“Storage Objects”资源类型授予该角色

也可以在定义角色权限的资源类型的“上层”授予这些角色。换句话说,可以针对位于 Google Cloud 资源层次结构中较高级层的资源授予较低层级资源的角色。以 storage.admin 角色为例,除了“Storage Buckets”外,您还可以在项目或组织级层授予该角色

按角色授予的权限只会影响指定级层或更低级层的资源,而不会影响更高级层的资源或同级资源。此外,针对资源授予某项角色时,系统仅会授予适用于指定资源的权限,而无论该角色的名称、说明或其包含的其他权限为何。例如,在项目级层将角色 resourcemanager.organizationAdmin(该角色授予 resourcemanager.projects.list 权限)分配给用户,只会为他们授予该特定项目的权限。而允许他们列出或管理组织中的所有项目。同样,在特定 Compute Engine 实例上分配 compute.admin 角色只会为该实例(而不会为项目中的其他实例)授予权限。

列出可授予的角色

在列出可授予的角色之前,请确保已在项目中启用了服务。如果尚未启用服务,则不会返回其角色。

控制台

  1. 在 Google Cloud 控制台中,转到 IAM 页面。

    转到 IAM 页面

  2. 点击页面顶部的“选择项目”下拉菜单。

  3. 选择要查看其角色的项目或组织。

  4. 点击 授予访问权限

  5. 主帐号中输入主帐号的电子邮件地址、网域或其他标识符。

选择角色下拉菜单会显示您可针对此资源为主帐号授予的所有角色(包括自定义角色)。

gcloud CLI

使用 gcloud iam list-grantable-roles 命令返回可应用于给定资源的所有角色的列表。

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

系统可能会返回大量角色,具体取决于所需的资源。 如需限制结果数量,您可以指定过滤条件表达式

输出结果如下所示:

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

REST

roles.queryGrantableRoles 方法会返回针对某个资源可授予的所有角色的列表。

在使用任何请求数据之前,请先进行以下替换:

  • full-resource-name:由服务名称和资源路径组成的 URI。如需查看示例,请参阅完整资源名称

HTTP 方法和网址:

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

请求 JSON 正文:

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

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "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++

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM C++ API 参考文档

namespace iam = ::google::cloud::iam;
[](std::string const& resource) {
  iam::IAMClient client(iam::MakeIAMConnection());
  int count = 0;
  for (auto& role : client.QueryGrantableRoles(resource)) {
    if (!role) throw std::move(role).status();
    std::cout << "Role successfully retrieved: " << role->name() << "\n";
    ++count;
  }
  if (count == 0) {
    std::cout << "No grantable roles found in resource: " << resource << "\n";
  }
}

C#

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM C# API 参考文档


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

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM Go API 参考文档

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

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM Java API 参考文档

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

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM Python API 参考文档

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(' ')

在上面的示例中,完整资源名称是无传输协议的 URI,由与 DNS 兼容的 API 服务名称和资源路径组成。

例如,如需返回针对项目可授予的所有角色,请使用:

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

较低层级资源具有更详细的完全限定名称。例如,使用以下命令可返回针对 Compute Engine 实例可授予的所有角色:

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

后续步骤