管理条件式角色绑定

本主题介绍了如何在 Identity and Access Management (IAM) 允许政策中添加、修改和移除条件角色绑定。

准备工作

  • 启用 IAM API。

    启用 API

  • 阅读 IAM Conditions 概览,了解 IAM 条件角色绑定的基础知识。

  • 请查看特性参考文档,了解可在表达式中使用的不同条件特性。

所需的角色

如需管理资源的允许政策中的条件角色绑定,您需要拥有获取该资源的权限以及获取和设置该资源的允许政策的权限。这些权限采用以下格式,其中 SERVICE 是拥有该资源的服务的名称,RESOURCE_TYPE 是您要管理其访问权限的资源类型的名称:

  • SERVICE.RESOURCE_TYPE.get
  • SERVICE.RESOURCE_TYPE.getIamPolicy
  • SERVICE.RESOURCE_TYPE.setIamPolicy

例如,如需管理项目的允许政策中的条件角色绑定,您需要以下权限:

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

要获取所需的权限,请让管理员授予您包含权限的预定义角色或自定义角色。例如,管理员可以向您授予 Security Admin 角色 (roles/iam.securityAdmin),该角色拥有获取几乎所有 Google Cloud 资源和管理其允许政策的权限。

向政策添加条件式角色绑定

可以将条件角色绑定添加到新的或现有的允许政策中,以进一步控制对 Google Cloud 资源的访问。本部分介绍如何使用 Google Cloud 控制台、Google Cloud CLI 和 REST API 向现有允许政策添加简单的基于时间的条件

要向现有允许政策添加条件角色绑定,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM 页面

  2. 从主账号列表中,找到所需主账号,然后点击 按钮。

  3. 修改权限面板中,找到要为其配置条件的目标角色。然后,在 IAM 条件(可选)下,点击添加 IAM 条件

  4. 修改条件面板中,输入条件的标题和选填性说明。

  5. 您可以使用条件构建器条件编辑器添加条件表达式。条件构建器提供一个交互式界面,用于选择所需的条件类型、运算符以及有关表达式的其他适用详情。条件编辑器提供基于文本的界面,可使用 CEL 语法手动输入表达式。

    条件构建器

    1. 条件类型下拉列表中,选择访问权限到期时间
    2. 运算符下拉列表中,选择 by
    3. 时间下拉列表中,点击 按钮,以便从日期和时间范围中进行选择。
    4. 点击保存以应用条件。
    5. 关闭修改条件面板后,在修改权限面板中再次点击保存,以更新允许政策。

    条件编辑器

    1. 点击条件编辑器标签页并输入以下表达式(将时间戳替换为您自己的时间戳):

      request.time < timestamp("2019-12-31T12:00:00.000Z")
    2. 输入表达式后,您可以通过点击右上方文本框上方的运行 linter 来选择验证 CEL 语法。

    3. 点击保存以应用条件。

    4. 关闭修改条件面板后,在修改权限面板中再次点击保存,以更新允许政策。

gcloud

允许政策是使用读取-修改-写入模式设置的。

执行 gcloud projects get-iam-policy 命令以获取项目的当前允许政策。在以下示例中,将允许政策的 JSON 版本下载到磁盘上的路径中。

命令:

gcloud projects get-iam-policy project-id --format json > file-path

下载允许政策的 JSON 格式:

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

请注意允许政策的当前 version,即 1。要配置具有可过期访问权限的允许政策,请添加以下突出显示的条件表达式(将时间戳替换为您自己的时间戳)。gcloud CLI 会自动更新版本:

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "user:travis@example.com"
      ],
      "role": "roles/iam.securityReviewer",
      "condition": {
          "title": "Expires_2019",
          "description": "Expires at noon on 2019-12-31",
          "expression":
            "request.time < timestamp('2019-12-31T12:00:00Z')"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

接下来,通过执行 gcloud projects set-iam-policy 命令设置新的允许政策:

gcloud projects set-iam-policy project-id file-path

系统将应用新的允许政策,且 travis@example.com 的角色绑定将在指定时间过期。

REST

使用读取-修改-写入模式以允许在特定时间之前访问。

首先,读取项目的允许政策

Resource Manager API 的 projects.getIamPolicy 方法可获取项目的允许政策。

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

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project
  • POLICY_VERSION:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

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

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

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

请注意允许政策的当前 version,即 1

接下来,修改允许政策以使其允许在特定时间之前访问。请务必将 version 字段更改为值 3

{
  "etag": "BwWKmjvelug=",
  "version": 3,
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/iam.securityReviewer",
      "condition": {
        "title": "Expires_2019",
        "description": "Expires at noon on 2019-12-31",
        "expression": "request.time < timestamp('2019-12-31T12:00:00Z')"
      },
      "members": [
        "user:travis@example.com"
      ]
    }
  ]
}

最后,写入更新后的允许政策

Resource Manager API 的 projects.setIamPolicy 方法会将请求中的允许政策设置为项目的新允许政策。

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

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "policy": {
    "version": 3,
    "etag": "BwWKmjvelug=",
    "bindings": [
      {
        "role": "roles/owner",
        "members": [
          "user:project-owner@example.com"
        ]
      },
      {
        "role": "roles/iam.securityReviewer",
        "members": [
          "user:travis@example.com"
        ],
        "condition": {
          "title": "Expires_July_1_2020",
          "description": "Expires on July 1, 2020",
          "expression":
            "request.time < timestamp('2020-07-01T00:00:00.000Z')"
        }
      }
    ]
  }
}

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

响应包含更新后的允许政策。


修改现有的条件角色绑定

创建条件角色绑定后,您可以随时更改条件表达式。本部分介绍了如何使用 Google Cloud 控制台、Google Cloud CLI 和 REST API 更新现有允许政策中的基于时间的条件

要修改现有允许政策中的条件角色绑定,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM 页面

  2. 从主账号列表中,找到所需主账号,然后点击 按钮。

  3. 修改权限面板中,找到要为其配置条件的目标角色。然后,在 IAM 条件(可选)下,点击现有条件的名称进行修改。

  4. 修改条件面板中,可以保留或更新条件的现有标题和说明。

  5. 您可以使用条件构建器条件编辑器来修改现有条件表达式或添加新条件表达式。条件构建器提供一个交互式界面,用于选择所需的条件类型、运算符以及有关表达式的其他适用详情。条件编辑器提供基于文本的界面,可使用 CEL 语法手动输入表达式。

    条件构建器

    1. 添加新的条件表达式或修改现有的条件表达式。
    2. 点击保存以应用条件。
    3. 关闭修改条件面板后,在修改权限面板中再次点击保存,以更新允许政策。

    条件编辑器

    1. 点击条件编辑器标签页,然后添加新的条件表达式或修改现有的条件表达式。
    2. 输入表达式后,您可以通过点击右上方文本框上方的运行 linter 来选择验证 CEL 语法。
    3. 点击保存以应用条件。
    4. 关闭修改条件面板后,在修改权限面板中再次点击保存,以更新允许政策。

gcloud

允许政策是使用读取-修改-写入模式设置的。

执行 gcloud projects get-iam-policy 命令以获取项目的当前允许政策。在以下示例中,将允许政策的 JSON 版本下载到磁盘上的路径中。

命令:

gcloud projects get-iam-policy project-id --format json > file-path

下载允许政策的 JSON 格式:

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "user:fatima@example.com"
      ],
      "role": "roles/bigquery.dataViewer",
      "condition": {
        "title": "Duration_3_months",
        "description": "Expires in 3 months on 2019-10-12",
        "expression":
          "request.time > timestamp(\"2019-07-12T07:00:00.000Z\") && request.time < timestamp(\"2019-10-12T07:00:00.000Z\")"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

在此示例中,我们将更新表达式中的 titledescription 和时间戳值,以更改计划的访问条件的持续时间。更新条件的以下突出显示部分(将值替换为您自己的值):

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "user:fatima@example.com"
      ],
      "role": "roles/bigquery.dataViewer",
      "condition": {
        "title": "Duration_5_months",
        "description": "Expires in 5 months on 2020-01-12",
        "expression":
          "request.time > timestamp('2019-07-12T07:00:00.000Z') && request.time < timestamp('2020-01-12T07:00:00.000Z')"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

接下来,通过执行 gcloud projects set-iam-policy 命令设置新的允许政策。

gcloud projects set-iam-policy project-id file-path

系统将应用更新后的允许政策,且 fatima@example.com 的角色绑定将在新时间过期。

REST

使用读取-修改-写入模式修改条件角色绑定。

首先,读取项目的允许政策

Resource Manager API 的 projects.getIamPolicy 方法可获取项目的允许政策。

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

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "options": {
    "requestedPolicyVersion": 3
  }
}

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

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

{
  "etag": "BwWKmjvelug=",
  "version": 3,
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/bigquery.dataViewer",
      "condition": {
        "title": "Duration_3_months",
        "description": "Expires in 3 months on 2019-10-12",
        "expression":
          "request.time > timestamp(\"2019-07-12T07:00:00.000Z\") && request.time < timestamp(\"2019-10-12T07:00:00.000Z\")"
      },
      "members": [
        "user:fatima@example.com"
      ]
    }
  ]
}

接下来,修改允许政策中的条件角色绑定。在此示例中,我们将更新时间戳值,以更改计划的访问条件的持续时间。更新条件表达式的以下突出显示部分(将时间戳替换为您自己的时间戳):

{
  "etag": "BwWKmjvelug=",
  "version": 3,
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/bigquery.dataViewer",
      "condition": {
        "title": "Duration_5_months",
        "description": "Expires in 5 months on 2020-01-12",
        "expression":
          "request.time > timestamp('2019-07-12T07:00:00.000Z') && request.time < timestamp('2020-01-12T07:00:00.000Z')"
      },
      "members": [
        "user:fatima@example.com"
      ]
    }
  ]
}

最后,写入更新后的允许政策

Resource Manager API 的 projects.setIamPolicy 方法会将请求中的允许政策设置为项目的新允许政策。

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

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "policy": {
    "etag": "BwWKmjvelug=",
    "version": 3,
    "bindings": [
      {
        "role": "roles/owner",
        "members": [
          "user:project-owner@example.com"
        ]
      },
      {
        "role": "roles/bigquery.dataViewer",
        "condition": {
          "title": "Duration_5_months",
          "description": "Expires in 5 months on 2020-01-12",
          "expression":
            "request.time > timestamp('2019-07-12T07:00:00.000Z') && request.time < timestamp('2020-01-12T07:00:00.000Z')"
        },
        "members": [
          "user:fatima@example.com"
        ],
      }
    ]
  }
}

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

响应包含更新后的允许政策。


从角色绑定中移除条件

从角色绑定中移除条件不会撤消角色。相反,它允许该角色绑定中的所有主账号无条件地使用该角色的权限。

本部分介绍了如何使用 Google Cloud 控制台、Google Cloud CLI 和 REST API 移除允许政策中基于时间的条件

要从允许政策中的角色绑定移除条件,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM 页面

  2. 从主账号列表中,找到所需主账号,然后点击 按钮。

  3. 修改权限面板中,找到所需的角色绑定。然后,在 IAM 条件(可选)下,点击现有条件的名称。

  4. 修改条件面板中,点击 按钮以移除条件。系统会提示您确认是否移除条件。

  5. 关闭修改条件面板后,在修改权限面板中再次点击保存,以更新允许政策。

gcloud

允许政策是使用读取-修改-写入模式设置的。

执行 gcloud projects get-iam-policy 命令以获取项目的当前允许政策。在以下示例中,将允许政策的 JSON 版本下载到磁盘上的路径中。

命令:

gcloud projects get-iam-policy project-id --format json > file-path

下载允许政策的 JSON 格式:

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "user:fatima@example.com"
      ],
      "role": "roles/bigquery.dataViewer",
      "condition": {
        "title": "Duration_3_months",
        "description": "Expires in 3 months on 2019-10-12",
        "expression":
          "request.time > timestamp(\"2019-07-12T07:00:00.000Z\") && request.time < timestamp(\"2019-10-12T07:00:00.000Z\")"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

要从允许政策中移除条件角色绑定,请移除 condition 块,如下所示:

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

请注意,尽管无条件角色绑定仅需要版本 1 允许政策,但 version 仍会设为 3。我们建议您在为条件角色绑定和无条件角色绑定设置允许政策时,始终使用最高的版本号。如需了解详情,请参阅版本要求。gcloud CLI 会自动更新允许政策的版本号。

接下来,通过执行 gcloud projects set-iam-policy 命令设置更新后的允许政策:

gcloud projects set-iam-policy project-id file-path

系统将应用更新后的允许政策,其中移除了 fatima@example.com 的条件角色绑定。角色绑定不会再过期。

REST

使用读取-修改-写入模式移除条件角色绑定。

首先,读取项目的允许政策

Resource Manager API 的 projects.getIamPolicy 方法可获取项目的允许政策。

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

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "options": {
    "requestedPolicyVersion": 3
  }
}

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

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

{
  "etag": "BwWKmjvelug=",
  "version": 3,
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/bigquery.dataViewer",
      "condition": {
        "title": "Duration_3_months",
        "description": "Expires in 3 months on 2019-10-12",
        "expression":
          "request.time > timestamp(\"2019-07-12T07:00:00.000Z\") && request.time < timestamp(\"2019-10-12T07:00:00.000Z\")"
      },
      "members": [
        "user:fatima@example.com"
      ]
    }
  ]
}

接下来,通过移除条件角色绑定修改允许政策

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

请注意,尽管无条件角色绑定仅需要版本 1 允许政策,但 version 仍会设为 3。我们建议您在为条件角色绑定和无条件角色绑定设置允许政策时,始终使用最高的版本号。如需了解详情,请参阅版本要求

最后,写入更新后的允许政策

Resource Manager API 的 projects.setIamPolicy 方法会将请求中的允许政策设置为项目的新允许政策。

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

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "policy": {
    "etag": "BwWKmjvelug=",
    "version": 3,
    "bindings": [
      {
        "role": "roles/owner",
        "members": [
          "user:project-owner@example.com"
        ]
      },
      {
        "role": "roles/bigquery.dataViewer",
        "members": [
          "user:fatima@example.com"
        ]
      }
    ]
  }
}

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

响应包含更新后的允许政策。


后续步骤