本主题介绍如何在允许政策中使用条件角色绑定来设置对 Google Cloud 资源的临时(很快就会过期)访问权限。通过使用日期/时间特性,您可以在用户访问给定资源时强制执行基于时间的控制措施。例如,您可以授予对项目的临时访问权限,该访问权限在指定时间或者按计划定期启动和停止。
准备工作
- 请参阅 Conditions 概览,了解 Identity and Access Management (IAM) 条件角色绑定的基础知识。
- 查看可在条件表达式中使用的日期/时间特性。 所有 Google Cloud 服务都能识别日期/时间特性。
所需的角色
如需获得管理条件角色绑定所需的权限,请让您的管理员为您授予以下 IAM 角色:
-
项目的 Project IAM Admin (
roles/resourcemanager.projectIamAdmin
)(如需管理对项目的访问权限) - 文件夹的 Folder Admin (
roles/resourcemanager.folderAdmin
)(如需管理对文件夹的访问权限) - 组织的 Organization Admin (
roles/resourcemanager.organizationAdmin
)(如需管理对项目、文件夹和组织的访问权限) -
您要管理对其资源的访问权限的项目、文件夹或组织的 Security Admin (
roles/iam.securityAdmin
)(如需管理对几乎所有 Google Cloud 资源的访问权限)
如需详细了解如何授予角色,请参阅管理访问权限。
这些预定义角色包含管理条件角色绑定所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
必须拥有以下权限才能管理条件角色绑定:
-
如需管理项目访问权限:
- 针对项目的
resourcemanager.projects.getIamPolicy
权限 - 针对项目的
resourcemanager.projects.setIamPolicy
权限
- 针对项目的
-
如需管理文件夹访问权限:
-
针对文件夹的
resourcemanager.folders.getIamPolicy
权限 -
针对文件夹的
resourcemanager.folders.setIamPolicy
权限
-
针对文件夹的
-
如需管理组织访问权限:
-
针对组织的
resourcemanager.organizations.getIamPolicy
权限 -
针对组织的
resourcemanager.organizations.setIamPolicy
权限
-
针对组织的
授予临时访问权限
条件角色绑定可用于授予对资源的限时访问权限,从而确保用户在指定的到期日期和时间后不能再访问该资源。
请考虑以下情形:ExampleCo 公司的信息安全规则强调,任何员工都不应拥有对生产项目资源的无限期访问权限。以前,管理员一直在手动设置和删除 IAM 角色绑定,以满足工程师的紧急需求。为了减少管理开销,ExampleCo 可以改为配置一个条件角色绑定,使其包含日期/时间条件,该条件用于为绑定设置结束日期。
要授予对项目资源的可过期访问权限,请执行以下操作:
控制台
在 Google Cloud 控制台中,前往 IAM 页面。
从主账号列表中,找到所需主账号,然后点击
按钮。在修改权限面板中,找到要为其配置条件的目标角色。然后在 IAM 条件(可选)下,点击添加 IAM 条件。
在修改条件面板中,输入条件的标题和选填性说明。
您可以使用条件构建器或条件编辑器添加条件表达式。条件构建器提供一个交互式界面,用于选择所需的条件类型、运算符以及有关表达式的其他适用详情。条件编辑器提供基于文本的界面,可使用 CEL 语法手动输入表达式。
条件构建器:
- 在条件类型下拉列表中,选择访问权限到期时间。
- 从运算符下拉列表中,选择 by。
- 从时间下拉列表中,点击 按钮,以便从日期和时间范围中进行选择。
- 点击保存以应用条件。
- 关闭修改条件面板后,在修改权限面板中再次点击保存,以更新允许政策。
条件编辑器:
点击条件编辑器标签页并输入以下表达式(将时间戳替换为您自己的时间戳):
request.time < timestamp("2020-07-01T00:00:00.000Z")
输入表达式后,您可以通过点击右上方文本框上方的运行 linter 来选择验证 CEL 语法。
点击保存以应用条件。
关闭修改条件面板后,在修改权限面板中再次点击保存,以更新允许政策。
gcloud
允许政策是使用读取-修改-写入模式设置的。
执行 gcloud projects get-iam-policy
命令以获取项目的当前允许政策。在以下示例中,将允许政策的 JSON 版本下载到磁盘上的路径中。
命令:
gcloud projects get-iam-policy project-id --format=json > filepath
下载允许政策的 JSON 格式:
{
"bindings": [
{
"members": [
"user:project-owner@example.com"
],
"role": "roles/owner"
},
{
"members": [
"user:travis@example.com"
],
"role": "roles/iam.securityReviewer"
}
],
"etag": "BwWKmjvelug=",
"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_July_1_2020",
"description": "Expires on July 1, 2020",
"expression":
"request.time < timestamp('2020-07-01T00:00:00.000Z')"
}
}
],
"etag": "BwWKmjvelug=",
"version": 3
}
接下来,通过执行 gcloud projects set-iam-policy
命令设置新的允许政策:
gcloud projects set-iam-policy project-id filepath
系统将应用新的允许政策,且 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
字段更改为值 3
:
{
"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')"
}
}
]
}
最后,写入更新后的允许政策:
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')" } } ] } }
如需发送您的请求,请展开以下选项之一:
响应包含更新后的允许政策。
基于一周中的某几天/某些时段管理访问权限
条件角色绑定可用于仅在一周的某几天或特定时段定期授予对资源的访问权限。
请考虑以下情形:ExampleCo 公司有一个质量保证项目。整个 QA 团队需要拥有具备高度特权的角色来完成他们的工作。ExampleCo 必须遵守其所在地的劳动法,将工作时间限制在周一至周五上午 9 点至下午 5 点。ExampleCo 可以使用日期/时间条件来确保员工只能在工作周和预定的工作时间访问 Google Cloud。
要在一周的某几天或特定时段定期授予对项目资源的访问权限,请执行以下操作:
控制台
在 Google Cloud 控制台中,前往 IAM 页面。
从主账号列表中,找到所需主账号,然后点击
按钮。在修改权限面板中,找到要为其配置条件的目标角色。然后在 IAM 条件(可选)下,点击添加 IAM 条件。
在修改条件面板中,输入条件的标题和选填性说明。
您可以使用条件构建器或条件编辑器添加条件表达式。条件构建器提供一个交互式界面,用于选择所需的条件类型、运算符以及有关表达式的其他适用详情。条件编辑器提供基于文本的界面,可使用 CEL 语法手动输入表达式。
条件构建器:
- 点击添加。
- 从条件类型下拉列表中,选择时间 时间表 星期几。
- 从运算符下拉列表中,选择不早于。
- 从星期几下拉列表中,选择星期一。
- 从选择时区下拉列表中,选择所需的时区。
- 确保已选中左侧的与运算符,然后再次点击添加。
- 从条件类型下拉列表中,选择时间 时间表 星期几。
- 从运算符下拉列表中,选择不晚于。
- 从星期几下拉列表中,选择星期五。
- 从选择时区下拉列表中,选择所需的时区。
此时,您已配置仅限于周一到周五的访问权限。现在,您将配置从上午 9 点 (09:00) 到下午 5 点 (17:00) 的访问权限。
- 确保已选中左侧的与运算符,然后再次点击添加。
从条件类型下拉列表中,选择时间
时间表 时段。- 从运算符下拉列表中,选择不早于。
- 从时段下拉列表中,选择 9(上午 9 点)。
- 从选择时区下拉列表中,选择所需的时区。
- 从条件类型下拉列表中,选择时间 时间表 时段。
- 从运算符下拉列表中,选择不晚于。请注意,对于此选择,“所在小时”将在逻辑上计算为 17:00(下午 5:00)到 17:59(下午 5:59)之间的所有时间。要将访问权限设为在下午 4:59 到期,请确保将小时数设置为 16 而不是 17。
- 从时段下拉列表中,选择 17(下午 5 点)。
- 从选择时区下拉列表中,选择所需的时区。
- 点击保存以应用条件。
- 关闭修改条件面板后,在修改权限面板中再次点击保存,以更新允许政策。
您现在已经配置了从周一到周五上午 9 点到下午 5 点的访问权限。
条件编辑器:
点击条件编辑器标签页并输入以下表达式(将占位值替换为您自己的占位值)。
request.time.getHours("Europe/Berlin") >= 9 && request.time.getHours("Europe/Berlin") <= 17 && request.time.getDayOfWeek("Europe/Berlin") >= 1 && request.time.getDayOfWeek("Europe/Berlin") <= 5
输入表达式后,您可以通过点击右上方文本框上方的运行 linter 来选择验证 CEL 语法。
点击保存以应用条件。
关闭修改条件面板后,在修改权限面板中再次点击保存,以更新允许政策。
gcloud
允许政策是使用读取-修改-写入模式设置的。
执行 gcloud projects get-iam-policy
命令以获取项目的当前允许政策。在以下示例中,将允许政策的 JSON 版本下载到磁盘上的路径中。
命令:
gcloud projects get-iam-policy project-id --format=json > filepath
下载允许政策的 JSON 格式:
{
"bindings": [
{
"members": [
"user:project-owner@example.com"
],
"role": "roles/owner"
},
{
"members": [
"user:rita@example.com"
],
"role": "roles/bigquery.dataViewer"
}
],
"etag": "BwWKmjvelug=",
"version": 1
}
要配置具有计划的访问权限的允许政策,请添加以下突出显示的条件表达式(将时间戳替换为您自己的时间戳)。gcloud CLI 会自动更新版本:
{
"bindings": [
{
"members": [
"user:project-owner@example.com"
],
"role": "roles/owner"
},
{
"members": [
"user:rita@example.com"
],
"role": "roles/bigquery.dataViewer",
"condition": {
"title": "Business_hours",
"description": "Business hours Monday-Friday",
"expression": "request.time.getHours('Europe/Berlin') >= 9 && request.time.getHours('Europe/Berlin') <= 17 && request.time.getDayOfWeek('Europe/Berlin') >= 1 && request.time.getDayOfWeek('Europe/Berlin') <= 5"
}
}
],
"etag": "BwWKmjvelug=",
"version": 3
}
接下来,通过执行 gcloud projects set-iam-policy
命令设置新的允许政策:
gcloud projects set-iam-policy project-id filepath
系统将应用新的允许政策,且 rita@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/bigquery.dataViewer", "members": [ "user:rita@example.com" ] } ] }
接下来,修改允许政策以允许计划的访问。
添加以下突出显示的条件表达式(将时间戳替换为您自己的时间戳)。确保您已将 version
值更新为 3
:
{
"etag": "BwWKmjvelug=",
"version": 3,
"bindings": [
{
"role": "roles/owner",
"members": [
"user:project-owner@example.com"
]
},
{
"role": "roles/bigquery.dataViewer",
"members": [
"user:rita@example.com"
],
"condition": {
"title": "Business_hours",
"description": "Business hours Monday-Friday",
"expression":
"request.time.getHours('Europe/Berlin') >= 9 &&
request.time.getHours('Europe/Berlin') <= 17 &&
request.time.getDayOfWeek('Europe/Berlin') >= 1 &&
request.time.getDayOfWeek('Europe/Berlin') <= 5"
}
}
]
}
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:rita@example.com" ], "condition": { "title": "Business_hours", "description": "Business hours Monday-Friday", "expression": "request.time.getHours('Europe/Berlin') >= 9 && request.time.getHours('Europe/Berlin') <= 17 && request.time.getDayOfWeek('Europe/Berlin') >= 1 && request.time.getDayOfWeek('Europe/Berlin') <= 5" } } ] } }
如需发送您的请求,请展开以下选项之一:
响应包含更新后的允许政策。
后续步骤
- 了解如何管理条件角色绑定。
- 了解如何对允许政策执行 lint 请求。
- 了解如何使用条件角色绑定来管理对项目的即时特权访问权限。