配置临时访问权限

本主题介绍了如何在 Identity and Access Management (IAM) 政策中使用条件角色绑定来设置对 Google Cloud 资源的临时(很快就会过期)访问权限。通过使用日期/时间特性,您可以在用户访问给定资源时强制执行基于时间的控制措施。例如,您可以授予对项目的临时访问权限,该访问权限在指定时间或者按计划定期启动和停止。

准备工作

  • 阅读 Conditions 概览,了解 IAM 条件角色绑定的基础知识。
  • 查看可在条件表达式中使用的日期/时间特性
  • 目前,所有 Google Cloud 服务均支持日期/时间特性。

授予临时访问权限

条件角色绑定可用于授予对资源的限时访问权限,从而确保用户在指定的到期日期和时间后不能再访问相应资源。

请考虑以下情形:ExampleCo 公司的信息安全政策强调,任何员工都不应拥有对生产项目资源的无限期访问权限。以前,管理员一直在手动设置和删除 IAM 角色绑定,以满足工程师的紧急需求。为了减少管理开销,ExampleCo 可以改为配置一个条件角色绑定,使其包含日期/时间条件,该条件用于为绑定设置结束日期。

要授予对项目资源的可过期访问权限,请执行以下操作:

控制台

  1. 在 Cloud Console 中,转到 IAM 页面。

    转到 IAM 页面

  2. 从成员列表中找到所需成员,然后点击 按钮。

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

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

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

    条件构建器

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

    条件编辑器

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

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

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

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

gcloud

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

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

命令:

gcloud projects get-iam-policy project-id --format=json > filepath

下载 IAM 政策的 JSON 格式:

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

要配置具有可过期访问权限的政策,请添加以下突出显示的条件表达式(将时间戳替换为您自己的时间戳)。如果您使用的不是 263.0.0 或更高版本的 gcloud 工具,请确保将 version 值更新为 3。如果您使用的是较新版本的 gcloud 工具,系统会自动为您设置最大政策值:

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

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

首先,读取项目的 IAM 政策

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

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

  • project-id:您的 Google Cloud 项目 ID。
  • 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 方法会将请求中的政策设置为项目的新 IAM 政策。

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

  • project-id:您的 Google Cloud 项目 ID。

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。

要在一周的某几天或特定时段定期授予对项目资源的访问权限,请执行以下操作:

控制台

  1. 在 Cloud Console 中,转到 IAM 页面。

    转到 IAM 页面

  2. 从成员列表中找到所需成员,然后点击 按钮。

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

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

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

    条件构建器

    1. 点击添加
    2. 条件类型下拉列表中,选择时间 时间表 星期几
    3. 运算符下拉列表中,选择不早于
    4. 星期几下拉列表中,选择星期一
    5. 选择时区下拉列表中,选择所需的时区。
    6. 确保已选中左侧的运算符,然后再次点击添加
    7. 条件类型下拉列表中,选择时间 时间表 星期几
    8. 运算符下拉列表中,选择不晚于
    9. 星期几下拉列表中,选择星期五
    10. 选择时区下拉列表中,选择所需的时区。

    此时,您已配置仅限于周一到周五的访问权限。现在,您将配置从上午 9 点 (09:00) 到下午 5 点 (17:00) 的访问权限。

    1. 确保已选中左侧的运算符,然后再次点击添加
    2. 条件类型下拉列表中,选择时间 时间表 时段

      1. 运算符下拉列表中,选择不早于
      2. 时段下拉列表中,选择 9(上午 9 点)。
      3. 选择时区下拉列表中,选择所需的时区。
      4. 条件类型下拉列表中,选择时间 时间表 时段
      5. 运算符下拉列表中,选择不晚于。请注意,对于此选择,“所在小时”将在逻辑上计算为 17:00(下午 5:00)到 17:59(下午 5:59)之间的所有时间。要将访问权限设为在下午 4:59 到期,请确保将小时数设置为 16 而不是 17。
      6. 时段下拉列表中,选择 17(下午 5 点)。
      7. 选择时区下拉列表中,选择所需的时区。
      8. 点击保存以应用条件。
      9. 关闭修改条件面板后,在修改权限面板中再次点击保存,以更新 IAM 政策。

      您现在已经配置了从周一到周五上午 9 点到下午 5 点的访问权限。

      条件编辑器

      1. 点击条件编辑器标签页并输入以下表达式(将占位值替换为您自己的占位值)。

        request.time.getHours("Europe/Berlin") >= 9 &&
        request.time.getHours("Europe/Berlin") <= 17 &&
        request.time.getDayOfWeek("Europe/Berlin") >= 1 &&
        request.time.getDayOfWeek("Europe/Berlin") <= 5
        
      2. 输入表达式后,您可以通过点击右上方文本框上方的运行 linter 来选择验证 CEL 语法。

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

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

gcloud

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

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

命令:

gcloud projects get-iam-policy project-id --format=json > filepath

下载 IAM 政策的 JSON 格式:

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

要配置具有计划的访问权限的政策,请添加以下突出显示的条件表达式(将时间戳替换为您自己的时间戳)。如果您使用的不是 263.0.0 或更高版本的 gcloud 工具,请确保将 version 值更新为 3。如果您使用的是较新版本的 gcloud 工具,系统会自动为您设置最大政策值:

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

使用读取-修改-写入模式以允许计划的访问。

首先,读取项目的 IAM 政策

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

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

  • project-id:您的 Google Cloud 项目 ID。
  • 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 方法会将请求中的政策设置为项目的新 IAM 政策。

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

  • project-id:您的 Google Cloud 项目 ID。

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"
        }
      }
    ]
  }
}

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

响应中包含更新后的政策。


后续步骤