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

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

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

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

  • 一个用户群组只能有一个访问权限绑定。
  • 如果用户同时属于多个群组,则系统会在任何政策允许的情况下(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 方法来获取。
  • ORG_ID:您的组织 ID。
  • DEFAULT_ACCESS_LEVEL:可选的访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。将 POLICY_ID 替换为访问权限政策 ID,将 ACCESS_LEVEL_NAME 替换为访问权限级别名称。
  • DEFAULT_SESSION_LENGTH:可选的会话时长,采用 ISO 8601 时长格式,例如 30m(30 分钟)或 2h(两小时)。
  • 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 方法来获取。
    • DEFAULT_ACCESS_LEVEL:可选的访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。将 POLICY_ID 替换为访问权限政策 ID,将 ACCESS_LEVEL_NAME 替换为访问权限级别名称。
    • DEFAULT_SESSION_LENGTH:可选的会话时长,采用 ISO 8601 时长格式,例如 30m(30 分钟)或 2h(两小时)。
    • 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 管理员角色时使用的组织的 ID。

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

为特定应用定义配置

通过这种方法,您可以对不同的应用应用不同的访问权限级别和会话控制。您还可以为没有特定配置的应用设置默认规则。如果您想执行以下操作,此方法非常有用:

  • 仅将政策应用于特定应用。
  • 创建一般政策,但从中排除某些应用。

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:
            #
            # because this app is specified by `name`,
            # it won't work with sessionSettings.
            #
            # if you add sessionSettings, make sure to
            # replace the `name` key with `clientId`,
            # and use the OAuth client ID as the value.
            #
            name: CLIENT_NAME
      activeSettings:
        accessLevels:
        - ACCESS_LEVEL_B
    

    替换以下内容:

    • CLIENT_ID:OAuth 客户端 ID。如果应用包含 sessionSettings,则必须使用 clientId
    • ACCESS_LEVEL_A:访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME
    • SESSION_LENGTH:使用 ISO 8601 时长格式表示的会话时长,例如 30m 表示 30 分钟,2h 表示 2 小时。
    • SESSION_REAUTH_METHOD:可选的方法,用于要求用户重新验证其身份,必须是以下方法之一:

      • LOGIN:应用标准登录,其中可能包括多重身份验证 (MFA) 或 Workspace 定义的其他因素。
      • PASSWORD:仅要求输入密码,即使定义了其他因素也是如此。如果使用外部 IdP 管理密码,系统会将用户重定向到该 IdP。如果 IdP 会话有效,系统会隐式重新对用户进行身份验证。如果 IdP 未启用,用户必须通过 IdP 登录。
      • SECURITY_KEY:需要使用硬件安全密钥。
    • CLIENT_NAME:客户端名称。如果应用包含 sessionSettings,则无法使用客户端名称。而应改为使用 OAuth 客户端 ID。

    • 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 方法来获取。
    • BINDING_FILE_PATH:包含访问绑定方案的 YAML 文件的路径。绑定文件仅支持 scopedAccessSettings
    • DEFAULT_ACCESS_LEVEL:可选的访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。将 POLICY_ID 替换为访问权限政策 ID,将 ACCESS_LEVEL_NAME 替换为访问权限级别名称。
    • DEFAULT_SESSION_LENGTH:可选的会话时长,采用 ISO 8601 时长格式,例如 30m(30 分钟)或 2h(两小时)。
    • DEFAULT_SESSION_REAUTH_METHOD:用于要求用户重新验证其身份的可选方法,必须是以下方法之一:
      • LOGIN:应用标准登录,其中可能包括多重身份验证 (MFA) 或 Workspace 定义的其他因素。
      • PASSWORD:仅要求输入密码,即使定义了其他因素也是如此。如果密码是使用外部 IdP 进行管理的,系统会将用户重定向到该 IdP。如果 IdP 会话有效,系统会隐式重新对用户进行身份验证。如果 IdP 未启用,用户必须通过 IdP 登录。
      • SECURITY_KEY:需要使用硬件安全密钥。

--level--binding-file 实参如何协同发挥作用

  • 如果您仅使用 --binding-file,则只有文件中的应用会应用相应政策。
  • 如果您仅使用 --level,则该访问权限级别会应用于所有应用。
  • 如果您同时使用这两种方式,则 YAML 文件中的规则优先。--level 值适用于文件中未列出的任何应用。

使用会话控件

  • 如需为所有应用设置默认会话控制,请使用 --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 方法来获取。
  • DEFAULT_ACCESS_LEVEL:可选的访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。将 POLICY_ID 替换为访问权限政策 ID,将 ACCESS_LEVEL_NAME 替换为访问权限级别名称。
  • CLIENT_ID:OAuth 客户端 ID。如果应用包含 sessionSettings,则必须使用 clientId
  • ACCESS_LEVEL_A:访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME
  • SESSION_LENGTH:使用 ISO 8601 时长格式表示的会话时长,例如 30m 表示 30 分钟,2h 表示 2 小时。
  • SESSION_REAUTH_METHOD:可选的方法,用于要求用户重新验证其身份,该方法必须是以下方法之一:

    • LOGIN:应用标准登录,其中可能包括多重身份验证 (MFA) 或 Workspace 定义的其他因素。
    • PASSWORD:仅要求输入密码,即使定义了其他因素也是如此。如果使用外部 IdP 管理密码,系统会将用户重定向到该 IdP。如果 IdP 会话有效,系统会隐式重新对用户进行身份验证。如果 IdP 未启用,用户必须通过 IdP 登录。
    • SECURITY_KEY:需要使用硬件安全密钥。
  • CLIENT_NAME:客户端名称。如果应用包含 sessionSettings,则无法使用客户端名称。请改用 OAuth 客户端 ID。

  • 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 管理员角色时使用的组织的 ID。

如果成功,您应该会收到 JSON 对象的表示法;如果出现问题,则会收到错误消息。

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

通过试运行访问权限级别,您无需实际强制执行访问权限政策,即可测试这些政策。这有助于您在政策生效之前了解其影响。您可以查看模拟运行日志,了解如果政策生效会出现什么情况。

在试运行模式下,只能使用访问权限级别。在试运行模式下无法使用会话控制功能。

创建试运行绑定

您可以在同一绑定中定义试运行访问权限级别和常规访问权限级别,也可以为试运行使用单独的绑定。

gcloud

  1. 配置访问权限设置。

    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,则无法使用客户端名称。而应改为使用 OAuth 客户端 ID。
    • 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
    • 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 方法来获取。
    • BINDING_FILE_PATH:包含访问绑定方案的 YAML 文件的路径。绑定文件仅支持 scopedAccessSettings
    • DEFAULT_DRY_RUN_ACCESS_LEVEL_2:可选的访问权限级别名称,格式为 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 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
       // be applied by default.
       //
      "access_levels": [
        "DEFAULT_ACCESS_LEVEL"
      ],
       //
       // 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"
              }
            }
          },
          "active_settings": {
            "access_levels": [
              "DRY_RUN_ACCESS_LEVEL_2"
            ]
          }
        }
      ]
    }
    

    替换以下内容:

    • GROUP_ID:组 ID。如果您不知道组 ID,可以通过对组资源调用 get 方法来获取。
    • DEFAULT_ACCESS_LEVEL:可选的访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME。将 POLICY_ID 替换为访问权限政策 ID,将 ACCESS_LEVEL_NAME 替换为访问权限级别名称。
    • DEFAULT_DRY_RUN_ACCESS_LEVEL:可选的访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME
    • CLIENT_NAME:客户端名称。如果应用包含 sessionSettings,则无法使用客户端名称。而应改为使用 OAuth 客户端 ID。
    • 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
    • DRY_RUN_ACCESS_LEVEL_2:访问权限级别名称,格式为 accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME
  2. 发送 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 管理员角色时使用的组织的 ID。

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

查看试运行日志

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

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

字段名称 说明
protoPayload.authenticationInfo.principalEmail 被拒绝访问权限的主账号的电子邮件 ID。
protoPayload.metadata.deniedApplications 被拒绝访问权限的应用的名称。
protoPayload.metadata.evaluationResult 有效访问权限政策的评估结果。可能的值:GRANTEDDENIED
protoPayload.metadata.appliedAccessLevels 有效访问权限政策要求的已应用访问权限级别。
protoPayload.metadata.appliedDryRunAccessLevels 试运行访问权限政策所要求的已应用访问权限级别。
protoPayload.metadata.dryRunEvaluationResult 试运行访问权限政策的评估结果,表示强制执行访问权限政策时的预期操作。 可能的值:GRANTEDDENIED

如需详细了解如何针对日志创建查询,请参阅 Logging 查询语言