使用访问权限绑定将政策应用于用户群组

您可以使用访问权限绑定来控制用户群组可以访问哪些应用和资源。访问权限绑定用于指定如何将访问权限级别和会话控制应用于用户群组。您可以对所有应用应用相同的访问权限级别和会话控制,也可以为各个应用定义特定行为。

为确保您正确配置了所有内容,请在强制执行政策之前对其进行测试。

使用访问权限绑定时,请注意以下行为:

  • 一个用户群组只能有一个访问权限绑定。
  • 如果用户属于多个群组,则只要有任何政策允许(OR,而不是 AND),用户就会获得访问权限。
  • 对于会话控制,系统只会应用最近创建的访问权限绑定。

对所有应用使用单一配置

此方法会将相同的访问权限级别和会话控制应用于用户群组访问的所有应用。

我们建议您先通过试运行测试政策,或将其应用于小型测试群组,然后再在生产环境中实施。

gcloud

创建访问权限绑定。

gcloud access-context-manager cloud-bindings create \
     --group-key GROUP_ID
     --organization ORG_ID
     --level DEFAULT_ACCESS_LEVEL
  [  --session-length=DEFAULT_SESSION_LENGTH                ]
  [  --session-reauth-method=DEFAULT_SESSION_REAUTH_METHOD  ]

替换以下内容:

  • GROUP_ID:群组 ID。如果您没有群组 ID,可以通过对群组资源调用 get 方法来检索该 ID。
  • ORG_ID:您的组织 ID。
  • DEFAULT_ACCESS_LEVEL:可选的访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。将 POLICY_ID 替换为访问权限政策 ID,并将 ACCESS_LEVEL_NAME 替换为访问权限级别名称。
  • DEFAULT_SESSION_LENGTH:可选会话时长(以小时为单位),例如 15h 表示 15 小时,2h 表示 2 小时。
  • DEFAULT_SESSION_REAUTH_METHOD:要求用户重新验证其身份的可选方法,必须是以下方法之一:
    • LOGIN:应用标准登录,其中可能包括 MFA 或 Workspace 定义的其他因素。
    • PASSWORD:即使定义了其他验证因素,也只需输入密码。如果密码是使用外部 IdP 管理的,用户会被重定向到 IdP。如果 IdP 会话处于活动状态,系统会隐式重新对用户进行身份验证。如果 IdP 未启用,用户必须通过 IdP 登录。
    • SECURITY_KEY:要求使用硬件安全密钥。

API

  1. 创建 JSON 正文:

    {
      "groupKey": "GROUP_ID",
      "accessLevels": [
        "DEFAULT_ACCESS_LEVEL"
      ],
      // optional:
      "sessionSettings": {
        "sessionLength": "DEFAULT_SESSION_LENGTH",
        "sessionReauthMethod": "DEFAULT_SESSION_REAUTH_METHOD"
      }
    }
    

    替换以下内容:

    • GROUP_ID:群组 ID。如果您没有群组 ID,可以通过对群组资源调用 get 方法来检索该 ID。
    • DEFAULT_ACCESS_LEVEL:可选的访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。将 POLICY_ID 替换为访问权限政策 ID,并将 ACCESS_LEVEL_NAME 替换为访问权限级别名称。
    • DEFAULT_SESSION_LENGTH:可选会话时长(以小时为单位),例如 15h 表示 15 小时,2h 表示 2 小时。
    • DEFAULT_SESSION_REAUTH_METHOD:要求用户重新验证其身份的可选方法,必须是以下方法之一:
      • LOGIN:应用标准登录,其中可能包括 MFA 或 Workspace 定义的其他因素。
      • PASSWORD:即使定义了其他验证因素,也只需输入密码。如果密码是使用外部 IdP 管理的,用户会被重定向到 IdP。如果 IdP 会话处于活动状态,系统会隐式重新对用户进行身份验证。如果 IdP 未启用,用户必须通过 IdP 登录。
      • SECURITY_KEY:要求使用硬件安全密钥。
  2. 发送 POST 请求:

    POST https://accesscontextmanager.googleapis.com/v1/organizations/ORG_ID/gcpUserAccessBindings
    

    ORG_ID 是您用于创建 Cloud Access Binding Admin 角色的组织的 ID。如果尚未设置 access-context-manager/organization 属性,请将可选 --organization 标志中的 ORG_ID 替换为您在创建 Cloud Access Binding Admin 角色时使用的组织的 ID。

如果成功,您会收到 JSON 对象的表示。如果出现问题,您会收到一条出错提示。

为特定应用定义配置

通过此方法,您可以对不同的应用应用不同的访问权限级别和会话控制。您还可以为没有特定配置的应用设置默认规则。

您可以使用应用的 OAuth 客户端 ID 在访问权限绑定中指定应用。您可以使用以下应用的名称来指定这些应用:

如果您想执行以下操作,此方法非常有用:

  • 仅对特定应用应用政策。
  • 创建一项常规政策,但将某些应用排除在外。

gcloud

  1. 创建一个 YAML 格式的绑定文件,其中包含 scopedAccessSettings 列表中的范围条目列表。对于要映射到特定访问权限级别的每个应用,请添加一个 clientScope 条目。

    scopedAccessSettings:
    - scope:
        clientScope:
          restrictedClientApplication:
            clientId: CLIENT_ID
      activeSettings:
        accessLevels:
        - ACCESS_LEVEL_A
        sessionSettings:
          sessionLength: SESSION_LENGTH
          sessionReauthMethod: SESSION_REAUTH_METHOD
          sessionLengthEnabled: true
    - scope:
        clientScope:
          restrictedClientApplication:
            name: CLIENT_NAME
      activeSettings:
        accessLevels:
        - ACCESS_LEVEL_B
    

    替换以下内容:

    • CLIENT_ID:OAuth 客户端 ID。当应用包含 sessionSettings 时,您可以使用 clientId 或 name。
    • ACCESS_LEVEL_A:访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。
    • SESSION_LENGTH:会话时长(以小时为单位),例如 15h 表示 15 小时,2h 表示 2 小时。
    • SESSION_REAUTH_METHOD:要求用户重新验证其身份的可选方法,必须是以下方法之一:

      • LOGIN:应用标准登录,其中可能包括多重身份验证 (MFA) 或其他 Workspace 定义的因素。
      • PASSWORD:仅要求输入密码,即使定义了其他因素也是如此。如果密码是使用外部 IdP 管理的,用户会被重定向到该 IdP。如果 IdP 会话处于活动状态,则系统会隐式重新对用户进行身份验证。如果 IdP 未上线,用户必须通过 IdP 登录。
      • SECURITY_KEY:要求使用硬件安全密钥。
    • CLIENT_NAME:客户端名称。当应用包含 sessionSettings 时,您可以使用 name 或 clientId。

    • ACCESS_LEVEL_B:访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。

    如需为 YAML 文件中未定义的应用设置默认访问权限级别,请使用 --level 参数。YAML 文件仅支持应用专用设置 (scopedAccessSettings)。

  2. 创建访问权限绑定。

    gcloud access-context-manager cloud-bindings create
        --organization ORG_ID
        --group-key GROUP_ID
        --binding-file BINDING_FILE_PATH
      [  --level DEFAULT_ACCESS_LEVEL ]
      [  --session-length=DEFAULT_SESSION_LENGTH                ]
      [  --session-reauth-method=DEFAULT_SESSION_REAUTH_METHOD  ]
    

    替换以下内容:

    • ORG_ID:您的组织 ID。
    • GROUP_ID:群组 ID。如果您没有群组 ID,可以通过对群组资源调用 get 方法来检索该 ID。
    • BINDING_FILE_PATH:包含访问权限绑定方案的 YAML 文件的路径。绑定文件仅支持 scopedAccessSettings。
    • DEFAULT_ACCESS_LEVEL:可选的访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。将 POLICY_ID 替换为访问权限政策 ID,并将 ACCESS_LEVEL_NAME 替换为访问权限级别名称。
    • DEFAULT_SESSION_LENGTH:可选会话时长(以小时为单位),例如 15h 表示 15 小时,2h 表示 2 小时。
    • DEFAULT_SESSION_REAUTH_METHOD:要求用户重新验证其身份的可选方法,必须是以下方法之一:
      • LOGIN:应用标准登录,其中可能包括 MFA 或 Workspace 定义的其他因素。
      • PASSWORD:即使定义了其他验证因素,也只需输入密码。如果密码是使用外部 IdP 管理的,用户会被重定向到 IdP。如果 IdP 会话处于活动状态,系统会隐式重新对用户进行身份验证。如果 IdP 未启用,用户必须通过 IdP 登录。
      • SECURITY_KEY:要求使用硬件安全密钥。

--level 和 --binding-file 实参如何协同运作

  • 如果您仅使用 --binding-file,则只有文件中的应用会应用这些政策。
  • 如果您仅使用 --level,则访问权限级别会应用于所有应用。
  • 如果您同时使用这两种规则,则规则会合并。--level 值适用于所有应用,而 --binding-file 指定的 YAML 文件中的政策仅适用于该文件中定义的应用。

使用会话控件

  • 如需为所有应用设置默认会话控制,请使用 --session-length 和 --session-reauth-method。
  • 如果您还在 YAML 文件中定义了会话控制,这些会话控制会替换这些特定应用的默认设置。
  • 您必须同时使用 --session-length 和 --session-reauth-method。

API

创建 JSON 正文:

{
  "groupKey": "GROUP_ID",
   //
   // Optional; if specified, all applications that aren't defined in
   // scopedAccessSettings have these access levels applied.
   //
   // If more than one access level is specified, the user is
   // granted access if any one resolves to TRUE (OR logic, not AND).
   //
   // If you omit this key entirely, then no policy enforcement is
   // applied by default.
   //
  "accessLevels": [
    "DEFAULT_ACCESS_LEVEL"
  ],
  "scopedAccessSettings": [
    {
      "scope": {
        "clientScope": {
          "restrictedClientApplication": {
            "clientId": "CLIENT_ID"
          }
        }
      },
      "activeSettings": {
        "accessLevels": [
          "ACCESS_LEVEL_A"
        ],
        "sessionSettings": {
          "sessionLength": "SESSION_LENGTH",
          "sessionReauthMethod": "SESSION_REAUTH_METHOD",
          "sessionLengthEnabled": true
        }
      }
    },
    {
      "scope": {
        "clientScope": {
          "restrictedClientApplication": {
            "name": "CLIENT_NAME"
          }
        },
        "activeSettings": {
          "accessLevels": [
            "ACCESS_LEVEL_B"
          ]
        }
      }
    }
  ]
}

替换以下内容:

  • GROUP_ID:群组 ID。如果您没有群组 ID,可以通过对群组资源调用 get 方法来检索该 ID。
  • DEFAULT_ACCESS_LEVEL:可选的访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。将 POLICY_ID 替换为访问权限政策 ID,并将 ACCESS_LEVEL_NAME 替换为访问权限级别名称。
  • CLIENT_ID:OAuth 客户端 ID。当应用包含 sessionSettings 时,您可以使用 clientId 或 name。
  • ACCESS_LEVEL_A:访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。
  • SESSION_LENGTH:会话时长(采用小时格式),例如 2h 表示两小时。
  • SESSION_REAUTH_METHOD:要求用户重新验证其身份的可选方法,必须是以下方法之一:

    • LOGIN:应用标准登录,其中可能包括 MFA 或 Workspace 定义的其他因素。
    • PASSWORD:仅要求输入密码,即使定义了其他因素也是如此。如果密码是使用外部 IdP 管理的,用户会被重定向到该 IdP。如果 IdP 会话处于活动状态,则系统会隐式重新对用户进行身份验证。如果 IdP 未上线,用户必须通过 IdP 登录。
    • SECURITY_KEY:要求使用硬件安全密钥。
  • CLIENT_NAME:客户端名称。当应用包含 sessionSettings 时,您可以使用 name 或 clientId。

  • ACCESS_LEVEL_B:访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。

发送 POST 请求:

POST https://accesscontextmanager.googleapis.com/v1/organizations/ORG_ID/gcpUserAccessBindings

ORG_ID 是您用于创建 Cloud Access Binding Admin 角色的组织的 ID。如果未设置 access-context-manager/organization 属性,请将可选 --organization 标志中的 ORG_ID 替换为您在创建 Cloud Access Binding Admin 角色时使用的组织的 ID。

如果成功,您应该会收到 JSON 对象的表示形式;如果出现问题,则会收到出错提示。

使用试运行访问权限级别模拟强制执行

借助试运行访问权限级别,您可以测试访问权限政策,而无需实际强制执行。这有助于您在政策生效之前了解其影响。您可以查看试运行日志,了解如果政策处于有效状态,会发生什么情况。

在试运行模式下,只能使用访问权限级别。会话控件在试运行模式下不可用。

创建一揽子试运行政策

此方法会将相同的试运行访问权限级别应用于用户群组访问的所有应用。

gcloud

使用 --dry-run-level 标志创建访问权限绑定。

gcloud access-context-manager cloud-bindings create \
     --group-key=<var>GROUP_ID</var> \
     --organization=<var>ORG_ID</var> \
     --dry-run-level=<var>DEFAULT_DRY_RUN_ACCESS_LEVEL</var>

替换以下内容:

  • GROUP_ID:群组 ID。如果您没有群组 ID,可以通过对群组资源调用 get 方法来检索该 ID。
  • ORG_ID:您的组织 ID。
  • DEFAULT_DRY_RUN_ACCESS_LEVEL:试运行访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。

API

  1. 创建一个包含 dry_run_access_levels 的 JSON 正文。

    {
      "group_key": "GROUP_ID",
      "dry_run_access_levels": [
        "DEFAULT_DRY_RUN_ACCESS_LEVEL"
      ]
    }
    

    替换以下内容:

    • GROUP_ID:群组 ID。如果您没有群组 ID,可以通过对群组资源调用 get 方法来检索该 ID。
    • DEFAULT_DRY_RUN_ACCESS_LEVEL:试运行访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。
  2. 发送 POST 请求:

    POST https://accesscontextmanager.googleapis.com/v1/organizations/ORG_ID/gcpUserAccessBindings
    

    ORG_ID 是您用于创建 Cloud Access Binding Admin 角色的组织的 ID。如果未设置 access-context-manager/organization 属性,请将可选 --organization 标志中的 ORG_ID 替换为您在创建 Cloud Access Binding Admin 角色时使用的组织的 ID。

为特定应用创建试运行政策

通过此方法,您可以对不同的应用应用不同的试运行访问权限级别。 您还可以为没有特定配置的应用设置默认规则。

gcloud

  1. 使用 dryRunSettings 字段在 YAML 绑定文件中配置访问权限设置。

    scopedAccessSettings:
    - scope:
        clientScope:
          restrictedClientApplication:
            name: CLIENT_NAME
      activeSettings:
        accessLevels:
        - ACCESS_LEVEL_A
      dryRunSettings:
        accessLevels:
        - DRY_RUN_ACCESS_LEVEL_1
    - scope:
        clientScope:
          restrictedClientApplication:
            clientId: CLIENT_ID
      dryRunSettings:
        accessLevels:
        - DRY_RUN_ACCESS_LEVEL_2
    

    替换以下内容:

    • CLIENT_NAME:客户端名称。当应用包含 sessionSettings 时,您可以使用 name 或 clientId。
    • ACCESS_LEVEL_A:访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。
    • DRY_RUN_ACCESS_LEVEL_1:访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。
    • CLIENT_ID:OAuth 客户端 ID。当应用包含 sessionSettings 时,您可以使用 clientId 或 name。
    • DRY_RUN_ACCESS_LEVEL_2:访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。
  2. 创建访问权限绑定。

    gcloud access-context-manager cloud-bindings create \
      --organization ORG_ID \
      --group-key GROUP_ID \
      --binding-file BINDING_FILE_PATH
      --dry-run-level DEFAULT_DRY_RUN_ACCESS_LEVEL
    

    替换以下内容:

    • ORG_ID:您的组织 ID。
    • GROUP_ID:群组 ID。如果您没有群组 ID,可以通过对群组资源调用 get 方法来检索该 ID。
    • BINDING_FILE_PATH:包含访问权限绑定方案的 YAML 文件的路径。绑定文件仅支持 scopedAccessSettings。
    • DEFAULT_DRY_RUN_ACCESS_LEVEL:可选的试运行访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。

    添加此标志,以便默认将指定的试运行访问权限级别应用于 YAML 中未指定的所有应用。

API

  1. 创建 JSON 正文:

    {
      "group_key": "GROUP_ID",
      //
      // Optional; if specified, all applications that aren't defined in scopedAccessSettings will have these dry-run access levels applied.
      //
      "dry_run_access_levels": [
        "DEFAULT_DRY_RUN_ACCESS_LEVEL"
      ],
      "scoped_access_settings": [
        {
          "scope": {
            "client_scope": {
              "restricted_client_application": {
                "name": "CLIENT_NAME"
              }
            }
          },
          "active_settings": {
            "access_levels": [
              "ACCESS_LEVEL_A"
            ]
          },
          "dry_run_settings": {
            "access_levels": [
              "DRY_RUN_ACCESS_LEVEL_1"
            ]
          }
        },
        {
          "scope": {
            "client_scope": {
              "restricted_client_application": {
                "client_id": "CLIENT_ID"
              }
            }
          },
          "dry_run_settings": {
            "access_levels": [
              "DRY_RUN_ACCESS_LEVEL_2"
            ]
          }
        }
      ]
    }
    

    替换以下内容:

    • GROUP_ID:群组 ID。如果您没有群组 ID,可以通过对群组资源调用 get 方法来检索该 ID。
    • DEFAULT_DRY_RUN_ACCESS_LEVEL:可选的试运行访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。
    • CLIENT_NAME:客户端名称。当应用包含 sessionSettings 时,您可以使用 name 或 clientId。
    • ACCESS_LEVEL_A:访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。
    • DRY_RUN_ACCESS_LEVEL_1:访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。
    • CLIENT_ID:OAuth 客户端 ID。当应用包含 sessionSettings 时,您可以使用 client_id 或 name。
    • DRY_RUN_ACCESS_LEVEL_2:访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。
  2. 发送 POST 请求:

    POST https://accesscontextmanager.googleapis.com/v1/organizations/ORG_ID/gcpUserAccessBindings
    

    ORG_ID 是您用于创建 Cloud Access Binding Admin 角色的组织的 ID。如果未设置 access-context-manager/organization 属性,请将可选 --organization 标志中的 ORG_ID 替换为您在创建 Cloud Access Binding Admin 角色时使用的组织的 ID。

    如果成功,您会收到 JSON 对象的表示。如果出现问题,您会收到一条出错提示。

查看试运行日志

设置试运行后,您可以查看日志,了解哪些访问尝试会被拒绝。

下表列出了可用于创建和运行查询以获取日志的日志字段:

字段名称 说明
protoPayload.authenticationInfo.principalEmail 访问遭拒的主账号的邮箱 ID。
protoPayload.metadata.deniedApplications 被拒绝访问的应用的名称。
protoPayload.metadata.evaluationResult 有效访问权限政策的评估结果。可能的值:GRANTED 或 DENIED。如果绑定中未应用任何有效的访问权限级别,则此字段会设置为 GRANTED。
protoPayload.metadata.appliedAccessLevels 有效访问权限政策要求的已应用访问权限级别。
protoPayload.metadata.appliedDryRunAccessLevels 试运行访问权限政策所需的应用访问权限级别。
protoPayload.metadata.dryRunEvaluationResult 试运行访问权限政策的评估结果,指示强制执行访问权限政策时的预期操作。可能的值:GRANTED 或 DENIED。如果绑定中未应用试运行访问权限级别,则此字段会设置为 GRANTED,即使 evaluationResult 为 DENIED 也是如此。
protoPayload.metadata.unsatisfiedAccessLevels 请求未能满足的组织中的访问权限级别。此列表可以包含未在访问权限绑定中应用的访问权限级别。如需确定哪些访问权限级别导致访问被拒,请将此字段与 appliedAccessLevels 或 appliedDryRunAccessLevels 进行比较。

如需了解如何为日志创建查询,请参阅 Logging 查询语言。