缩小短期凭据的权限范围

本页面介绍了如何缩小或限制短期凭据可以使用的 Cloud Identity and Access Management (Cloud IAM) 权限范围。

要缩小权限范围,您需要定义凭据访问边界(用来指定短期凭据可以访问的资源),以及每个资源可用权限的上限。然后,您可以创建一个短期凭据,并将其交换为符合凭据访问边界的新凭据。

以下示例展示了一个简单的凭据访问边界。它应用于 Cloud Storage 存储分区 example-bucket,并且将权限上限设置为 Storage Object Viewer 角色 (roles/storage.objectViewer) 中包含的权限:

{
      "accessBoundaryRules": [
        {
          "availablePermissions": [
            "inRole:roles/storage.objectViewer"
          ],
          "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket"
        }
      ]
    }
    

如果您需要为每个会话分配不同的成员权限,那么与创建多个不同的服务帐号,并且为每个服务帐号授予不同的角色组相比,使用凭据访问边界更高效。例如,如果您的某个客户需要访问您控制的 Cloud Storage 数据,您可以创建一个可以访问您拥有的所有 Cloud Storage 存储分区的服务帐号,然后再应用一个只允许访问包含客户数据的存储分区的凭据访问边界。

准备工作

在使用凭据访问边界之前,请确保满足以下要求:

  • 您只能针对 Cloud Storage 缩小权限范围,并不针对其他 Google Cloud 服务。

    如果您需要缩小其他 Google Cloud 服务的权限范围,您可以创建多个服务帐号并为每个服务帐号授予一组不同的角色。

  • 您需要缩小存储分区级别的权限范围,而不是对象级别的权限范围。

  • 您可以使用统一存储分区级访问权限来管理 Cloud Storage 资源的访问权限。

  • 您可以使用 OAuth 2.0 访问令牌进行身份验证。其他类型的短期凭据不支持凭据访问边界。

创建权限范围缩小的短期凭据

要创建权限范围缩小的 OAuth 2.0 访问令牌,请按以下步骤操作:

  1. 向用户或服务帐号授予相应的 Cloud IAM 角色
  2. 定义凭据访问边界,此边界用来设置用户或服务帐号可用权限的上限。
  3. 为用户或服务帐号创建 OAuth 2.0 访问令牌
  4. 用符合凭据访问边界的新令牌替换 OAuth 2.0 访问令牌

然后,您可以使用权限范围缩小的全新 OAuth 2.0 访问令牌对 Cloud Storage 请求进行身份验证。

授予 Cloud IAM 角色

凭据访问边界设置了资源可用权限的上限。它可以删除成员已获取的权限,但无法添加该成员尚未拥有的权限。

因此,您还必须在 Cloud Storage 存储分区上,或更高级别的资源(例如项目)上向成员授予提供所需权限的角色。

例如,假设您需要创建一个权限范围缩小的短期凭据,以允许服务帐号在存储分区中创建对象:

  • 您必须至少向包含 storage.objects.create 权限的服务帐号授予角色,例如 Storage Object Creator 角色 (roles/storage.objectCreator)。凭据访问边界也必须包含此权限。
  • 您还可以授予包含更多权限的角色,例如 Storage Object Admin 角色 (roles/storage.objectAdmin)。服务帐号只能使用角色授权和凭据访问边界中显示的权限。

定义凭据访问边界

凭据访问边界是包含一系列访问边界规则的 SON 对象。每条规则都包含以下信息:

  • 应用规则的资源
  • 该资源上的可用权限上限

如果您将凭据访问边界应用于短期凭据,则该凭据只能访问凭据访问边界中的资源。无法访问其他资源。

凭证访问边界最多包含 10 条访问边界规则。您只能为每个短期凭据应用一个凭据访问边界。

凭据访问边界包含以下字段:

字段
accessBoundaryRules[]

object

一系列应用于短期凭据的访问边界规则。

accessBoundaryRules[].availablePermissions[]

string

用于定义资源可用权限上限的列表。

每个值都是 Cloud IAM 预定义角色自定义角色的标识符,并且带有前缀 inRole:。例如:inRole:roles/storage.objectViewer。只有这些角色中的权限才可用。

accessBoundaryRules[].availableResource

string

应用规则的 Cloud Storage 存储分区的完整资源名称。请使用格式 //storage.googleapis.com/projects/_/buckets/[BUCKET_NAME]

以下示例展示了包含多项资源规则的凭据访问边界:

  • Cloud Storage 存储分区 example-bucket-1。对于此存储分区,只能使用 Storage Object Viewer 角色 (roles/storage.objectViewer) 中的权限。
  • Cloud Storage 存储分区 example-bucket-2。对于此存储分区,只能使用 Storage Object Creatorr 角色 (roles/storage.objectCreator) 中的权限可用。
{
      "accessBoundaryRules": [
        {
          "availablePermissions": [
            "inRole:roles/storage.objectViewer"
          ],
          "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-1"
        },
        {
          "availablePermissions": [
            "inRole:roles/storage.objectCreator"
          ],
          "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-2"
        }
      ]
    }
    

创建定义凭据访问边界的 JSON 文件。您将在后面的步骤中使用此文件。

创建 OAuth 2.0 访问令牌

要创建权限范围缩小的短期凭据,您必须先创建一个常规的 OAuth 2.0 访问令牌。然后将常规凭据交换为权限范围缩小的凭据。在创建访问令牌时,请使用 OAuth 2.0 范围 https://www.googleapis.com/auth/cloud-platform

要为服务帐号创建访问令牌,您可以完成服务器到服务器的 OAuth 2.0 流程,或者您可以使用服务帐号凭据 API 生成 OAuth 2.0 访问令牌

要为用户创建访问令牌,请参阅获取 OAuth 2.0 访问令牌。您还可以使用 OAuth 2.0 Playground,为您自己的 Google 帐 创建访问令牌。

交换 OAuth 2.0 访问令牌

创建 OAuth 2.0 访问令牌后,您可以将访问令牌交换为符合凭据访问边界的新令牌。您可以通过 Identity Platform 中的安全令牌服务来交换访问令牌。

要交换访问令牌,请使用以下 HTTP 方法和网址:

POST https://securetoken.googleapis.com/v2beta1/token

将请求中的 Content-Type 标头设置为 application/x-www-form-urlencoded。在请求正文中添加以下字段:

字段
access_boundary

string

采用百分比编码的凭据访问边界。

grant_type

string

使用值 urn:ietf:params:oauth:grant-type:token-exchange

requested_token_type

string

使用值 urn:ietf:params:oauth:token-type:access_token

subject_token

string

您想要交换的 OAuth 2.0 访问令牌。

subject_token_type

string

使用值 urn:ietf:params:oauth:token-type:access_token

响应是包含以下字段的 JSON 对象:

字段
access_token

string

符合凭据访问边界的全新 OAuth 2.0 访问令牌。

expires_in

number

新访问令牌到期前的时间量(以秒为单位)。

仅当原始访问令牌代表服务帐号时才会显示此字段。如果此字段不存在,则新访问令牌的到期时间与原始访问令牌的时间相同。

issued_token_type

string

包含值 urn:ietf:params:oauth:token-type:access_token

token_type

string

包含值 Bearer

例如,如果凭据访问边界存储在文件 ./access-boundary.json 中,您可以使用以下 curl 命令交换访问令牌。将 [ORIGINAL_TOKEN] 替换为原始访问令牌:

curl -H "Content-Type:application/x-www-form-urlencoded" \
        -X POST \
        https://securetoken.googleapis.com/v2beta1/token \
        -d "grant_type=urn:ietf:params:oauth:grant-type:token-exchange&subject_token_type=urn:ietf:params:oauth:token-type:access_token&requested_token_type=urn:ietf:params:oauth:token-type:access_token&subject_token=[ORIGINAL_TOKEN]" \
        --data-urlencode "access_boundary=$(cat ./access-boundary.json)"

响应类似于以下示例:

{
      "access_token": "ya29.dr.AbCDeFg-123456...",
      "issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
      "token_type": "Bearer",
      "expires_in": 3600
    }
    

后续步骤