为服务账号配置情境感知访问权限

本指南介绍了如何设置情境感知访问权限,以根据您定义的访问权限级别,帮助保护服务账号对 Cloud de Confiance by S3NS API 的访问。

限制

以下限制适用于服务账号的情境感知访问权限政策:

  • 如果服务账号用于工作流执行和 Cloud Scheduler,则您无法将基于网络或基于 IP 地址的特性用于服务账号绑定。

  • 情境感知访问权限政策无法阻止使用 kubectl 连接到专用 Google Kubernetes Engine (GKE) 集群,也无法阻止使用 Auth 代理连接到 Cloud SQL。

  • 如果您绑定到服务账号的访问权限级别包含不受支持的属性(例如 Device 属性),则情境感知访问权限会拒绝 API 访问。

  • 服务账号不支持限定范围的访问权限级别。

如果您使用 Cloud Build 和 Cloud Run,我们建议您使用以下内置 Virtual Private Cloud (VPC) 功能:

准备工作

  1. 确保您拥有 Cloud de Confiance 组织和至少一个 Cloud de Confiance 项目。
  2. 安装 Google Cloud CLI。

  3. 配置 gcloud CLI 以使用您的联合身份。

    如需了解详情,请参阅 使用联合身份登录 gcloud CLI。

  4. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  5. 创建或选择 Cloud de Confiance 项目。

    选择或创建项目所需的角色

    • 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
    • 创建项目:如需创建项目,您需要拥有 Project Creator 角色 (roles/resourcemanager.projectCreator),该角色包含 resourcemanager.projects.create 权限。了解如何授予角色。
    • 创建 Cloud de Confiance 项目:

      gcloud projects create PROJECT_ID

      将 PROJECT_ID 替换为您要创建的 Cloud de Confiance 项目的名称。

    • 选择您创建的 Cloud de Confiance 项目:

      gcloud config set project PROJECT_ID

      将 PROJECT_ID 替换为您的 Cloud de Confiance 项目名称。

  6. 验证是否已为您的 Cloud de Confiance 项目启用结算功能。

  7. 启用 IAM、Access Context Manager 和 Resource Manager API(如果尚未启用):

    启用 API 所需的角色

    如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 拥有此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色。

    gcloud services enable accesscontextmanager.googleapis.com cloudresourcemanager.googleapis.com iam.googleapis.com
  8. 更新 Google Cloud CLI 组件:
    gcloud components update --quiet
  9. 如果您还没有服务账号,请在项目中创建一个服务账号。此服务账号是情境感知访问权限政策的目标。

所需的角色

本部分介绍了使用情境感知访问权限所需的 Identity and Access Management (IAM) 角色。

项目级角色

如需获得在项目级层所需的权限,请让您的管理员为您授予用户账号或服务账号的 Service Account Admin (roles/iam.serviceAccountAdmin) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

此预定义角色包含项目级层所需的 the required permissions 权限。

您也可以使用自定义角色或其他预定义角色来获取此权限。

组织级角色

如需获得在组织级层所需的权限,请让管理员向您授予用户账号或服务账号的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

此预定义角色包含组织级层所需的 the required permissions 权限。

您也可以使用自定义角色或其他预定义角色来获取此权限。

将情境感知访问权限政策绑定到不同的资源级别

您可以将具有相同实施模式的情境感知访问权限政策绑定到资源层次结构中不同级别的资源。当资源尝试访问时,情境感知访问权限会先使用绑定到该资源的政策,然后再尝试使用绑定到更高级别资源的政策。

例如,您可以将强制执行模式政策直接绑定到服务账号,并将其他强制执行模式政策绑定到包含该服务账号的项目。当服务账号尝试访问资源时,情境感知访问权限会评估与该服务账号绑定的政策。对于项目中未绑定政策的其他服务账号,情境感知访问权限 会评估绑定到项目的强制执行模式政策。如果项目级政策和服务账号级政策的强制执行模式都设置为试运行,情况也是如此。

您可以使用多项政策来逐步选择性地部署政策,例如,您可以执行以下操作:

  1. 在项目级层以试运行模式绑定政策,并通过在 Cloud Audit Logs 中检查访问遭拒事件,确保政策按预期运行。
  2. 仅将政策以实施模式绑定到特定服务账号。
  3. 在项目级层绑定实施模式的政策,并根据需要将限制较少的实施模式政策绑定到特定服务账号。

服务账号的访问权限级别属性

本部分列出了服务账号支持的访问权限级别属性。

服务账号支持以下属性:

  • IP 子网,基于公共 IP 地址。
  • VPC 网络,基于专用 IP 地址。
  • 地理位置,基于公共 IP 地址。

    当服务账号向 Cloud de ConfianceAPI 发出任何请求时,情境感知访问权限会评估该请求,并将请求的 IP 地址与情境感知访问权限政策中指定的 IP 地址进行比较。如果 IP 地址匹配,情境感知访问权限会允许 API 调用。 如果 IP 地址不匹配,情境感知访问权限会拒绝 API 调用。

  • 具有通用表达式语言 (CEL) 表达式的自定义访问权限级别。表达式的求值结果必须为 true 才能允许访问,求值结果为 false 则拒绝访问。

    以下 CEL 表达式可用于限制服务账号的访问权限。

    如果请求源自一个或多个指定的项目编号,则表达式的计算结果为 true:

        expression: "originatesFromProjects(origin, ['projects/PROJECT_NUMBER'])"
        

    originatesFromProjects 会检查请求是否来自与指定项目关联的网络,以及请求是否来自专用 IP 地址。

  • 一天中的时间,基于指定时区中请求的时间和日期。

    如需了解详情,请参阅配置时间和日期访问条件。

创建访问权限级别

本部分介绍如何在组织内创建访问权限级别。访问权限级别定义了允许访问的条件。

  1. 按照说明创建基本访问权限级别或创建自定义访问权限级别。

  2. 请记下访问权限级别的全名,其格式为:accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。

创建访问权限绑定

将访问权限级别绑定到所选服务账号。这样做会强制执行访问权限级别中定义的条件。您可以将访问权限级别绑定到单个服务账号或项目中的所有服务账号。

将访问权限级别绑定到特定服务账号

本部分介绍如何将访问权限级别绑定到特定服务账号。

gcloud

使用 gcloud CLI 将访问权限级别绑定到服务账号。

gcloud access-context-manager cloud-bindings create \
    --organization=ORGANIZATION_ID \
    --service-account=SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.s3ns.iam.gserviceaccount.com \
    --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

替换以下内容:

  • ORGANIZATION_ID:您的 Cloud de Confiance组织 ID。
  • SERVICE_ACCOUNT_NAME:目标服务账号的 ID(邮箱中 @ 符号前面的部分)。
  • SERVICE_ACCOUNT_PROJECT_ID:包含目标服务账号的项目 ID。
  • POLICY_ID:Access Context Manager 访问权限政策的 ID。
  • ACCESS_LEVEL_NAME:您创建的访问权限级别的名称。

    如需使用情境感知访问权限而不强制执行访问权限级别和禁止访问,您可以在试运行模式下绑定访问权限级别。

REST API

如需使用 REST API 将访问权限级别绑定到特定服务账号,请运行以下命令:

  1. 创建一个包含以下内容的 request.json 文件:

    {
      "principal": {
        "serviceAccount": "SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.s3ns.iam.gserviceaccount.com"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    替换以下内容:

    • SERVICE_ACCOUNT_NAME:目标服务账号的 ID(邮箱中 @ 符号前面的部分)。

    • SERVICE_ACCOUNT_PROJECT_ID:包含目标服务账号的项目的 ID。

    • POLICY_ID:Access Context Manager 访问权限政策的 ID。

    • ACCESS_LEVEL_NAME:您创建的访问权限级别的名称。

  2. 运行以下命令:

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @request.json \
      "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    替换以下内容:

    • PROJECT_ID:您用于进行 API 调用的项目的 ID。

    • ORGANIZATION_ID:您的 Cloud de Confiance组织 ID。

将访问权限级别绑定到项目中的所有服务账号

本部分介绍如何将访问权限级别绑定到项目中的所有服务账号。

gcloud

如需使用 gcloud CLI 将访问权限级别绑定到项目中的所有服务账号,请运行以下命令:

gcloud access-context-manager cloud-bindings create \
  --organization=ORGANIZATION_ID \
  --service-account-project-number=PROJECT_NUMBER \
  --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

替换以下内容:

  • ORGANIZATION_ID:您的 Cloud de Confiance组织 ID。
  • PROJECT_NUMBER:项目的项目编号,该项目包含您要绑定访问权限的所有服务账号。
  • POLICY_ID:Access Context Manager 访问权限政策的 ID。
  • ACCESS_LEVEL_NAME:您创建的访问权限级别的名称。

REST API

如需使用 REST API 将访问权限级别绑定到项目中的所有服务账号,请执行以下操作:

  1. 创建一个包含以下内容的 request.json 文件:

    {
      "principal": {
        "serviceAccountProjectNumber": "PROJECT_NUMBER"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    替换以下内容:

    • PROJECT_NUMBER:项目的项目编号,该项目包含您要绑定访问权限的所有服务账号。
    • POLICY_ID:Access Context Manager 访问权限政策的 ID。
    • ACCESS_LEVEL_NAME:您创建的访问权限级别的名称。
  2. 运行以下命令:

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    替换以下内容:

    • PROJECT_ID:您用于进行 API 调用的项目的 ID。
    • ORGANIZATION_ID:您的 Cloud de Confiance组织 ID。

如需在不强制执行访问权限级别和拒绝访问的情况下使用情境感知访问权限,您可以在试运行模式下绑定访问权限级别。

创建绑定操作的 API 响应包含绑定的名称,其中包含唯一的绑定 ID。

使用试运行模式

您可以在试运行模式下绑定访问权限级别。使用试运行模式时,您的服务账号可以继续访问资源,而不会强制执行。但是,如果您的服务账号尝试进行违反访问权限级别的访问,情境感知访问权限会将违规行为记录到 Cloud Audit Logs。

在试运行模式下绑定访问权限级别

gcloud

如需在试运行模式下绑定访问权限级别,请将 --level 参数替换为 --dry-run-level,格式如下:

--dry-run-level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

REST API

如需在试运行模式下绑定访问权限级别,请创建包含以下内容的 request.json 文件:

{
"principal": {
  "serviceAccountProjectNumber": "TARGET_PROJECT_NUMBER"
},
"dryRunAccessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
}

替换以下内容:

  • TARGET_PROJECT_NUMBER:目标项目的项目编号。
  • POLICY_ID:Access Context Manager 访问权限政策的 ID。
  • ACCESS_LEVEL_NAME:访问权限级别的名称。

查看 Cloud Audit Logs

本部分介绍如何检查 Cloud Audit Logs,以了解服务账号在试运行模式下被拒绝访问的情况。如需详细了解如何在 Cloud Audit Logs 中搜索试运行模式条目,请参阅查看试运行模式日志。

控制台

如需使用 Cloud de Confiance 控制台查看 Cloud Audit Logs 试运行模式服务账号访问拒绝,请执行以下操作:

在 Cloud de Confiance 控制台中,前往 Logs Explorer 页面:

前往 Logs Explorer

如果您使用搜索栏查找此页面,请选择子标题为 Logging 的结果。

  1. 在 Cloud de Confiance 控制台中,选择您的项目或组织。

  2. 在日志查询字段中,输入以下查询:

    protoPayload.serviceName="contextawareaccess.googleapis.com"
    protoPayload.metadata.dryRunEvaluationResult:DENIED
    SEARCH("SERVICE_ACCOUNT_NAME")
    
  3. 在时间范围选择器中,从预定义的相对时间(例如过去 30 分钟、过去 1 小时或过去 24 小时)中进行选择,或指定自定义范围。

gcloud

如需使用 gcloud CLI 查看 Cloud Audit Logs 试运行模式服务账号访问拒绝,请执行以下操作:

gcloud logging read \
'protoPayload.serviceName="contextawareaccess.googleapis.com" AND
 protoPayload.metadata.dryRunEvaluationResult:DENIED AND
 SEARCH("SERVICE_ACCOUNT_NAME")' \
  --organization=ORGANIZATION_ID

替换以下内容:

  • ORGANIZATION_ID:组织的 ID。
  • SERVICE_ACCOUNT_NAME:服务账号的 ID(邮箱中 @ 符号前面的部分)。

gcloud logging read 命令支持 --freshness 标志,用于查看相对时间范围内的日志记录信息。例如,通过向命令添加 --freshness=3h,您可以查看过去 3 小时的试运行模式日志条目。

后续步骤