为 Web 应用启用基于证书的访问权限

本页面介绍了如何为 Web 应用启用基于证书的访问权限 (CBA)。您可以使用 CBA 来保护从可信设备对在 Google Cloud 上运行的企业 Web 应用的访问。

概览

Web 应用的 CBA 使用 Chrome Enterprise Premium 情境感知访问权限功能和 Google Cloud 网络,通过双向 TLS (mTLS) 来保护访问。以下是为 Web 应用启用 CBA 的主要组件:

  • Access Context Manager:可让您创建在确定对 Web 应用的访问权限时需要证书的访问权限级别。
  • Identity-Aware Proxy (IAP):对访问 Web 应用的用户进行身份验证。
  • Google Cloud HTTPS 负载均衡器:在用户与 Web 应用之间提供双向身份验证 (mTLS)。
  • Chrome 企业版政策:在使用 Chrome 浏览器时,在用户和 Web 应用之间提供双向身份验证 (mTLS)。

准备工作

通过运行以下命令来验证您是否拥有当前版本的 Google Cloud CLI

gcloud components update

为外部 HTTPS 负载均衡器设置 mTLS

按照instructions设置 HTTPS 外部负载均衡器。请记下创建的目标 HTTPS 代理的名称,因为您在后续步骤中会用到该名称。

创建信任配置

创建信任配置来表示您的公钥基础架构 (PKI) 类型。

如需完成此任务,您必须拥有目标 Google Cloud 项目的 certificatemanager.trustconfigs.create 权限。

您可以使用 Google 颁发的证书(方法 1)、您自己的证书(方法 2)或通过端点验证使用自签名证书(方法 3)来创建信任配置。

方法 1

使用 Google 颁发的证书创建信任配置。

  1. 完成创建根 CA 的步骤。
  2. 提取 PEM 文件内容:

    gcloud privateca roots describe ROOT_CA_ID \
        --pool=POOL_ID \
        --location=CA_LOCATION \
        --format='value(pemCaCertificates)'
    

    请替换以下内容:

    • ROOT_CA_ID:根证书 ID。
    • POOL_ID:根证书 ID。
    • CA_LOCATION:CA 位置。
  3. 检索 pemCaCertificates 字段中返回的根证书。该证书是 BEGIN CERTIFICATEEND CERTIFICATE 标记之间的字符串,且包含这两个标记。

  4. 以 PEM 格式将根证书保存到文件中。

  5. 创建信任配置:

    1. 设置以下环境变量:

      ROOT_PEM_FILE=TRUST_ANCHOR_PATH
      INT_PEM_FILE1=IM_CERT_PATH
      INT_PEM_FILE2=SECOND_IM_CERT_PATH
      

      请替换以下内容:

      • TRUST_ANCHOR_PATH:指向 PEM 编码的信任锚的路径。
      • IM_CERT_PATH:指向 PEM 编码的中间证书的路径。
      • SECOND_IM_CERT_PATH:第二个 PEM 编码的中间证书的路径。
    2. 准备信任配置 YAML 文件的内容:

      ROOT=$(cat ROOT_PEM_FILE | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
      INT_1=$(cat INT_PEM_FILE1 | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
      INT_2=$(cat INT_PEM_FILE2 | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
      
    3. 创建信任配置 YAML 文件:

      cat << EOF > trust_config.yaml
      name: "${TRUST_CONFIG_NAME?}"
      trustStores:
      - trustAnchors:
        - pemCertificate: "${ROOT?}"
        intermediateCas:
        - pemCertificate: "${INT_1?}"
        - pemCertificate: "${INT_2?}"
       EOF
      

      此 YAML 文件定义了名为 TRUST_CONFIG_NAME 的信任配置。信任配置包含一个信任存储区,此存储区包括根证书和两个中间证书。

    4. 将信任配置导入 Google Cloud Certificate Manager:

      gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME \
        --project=GCP_PROJECT \
        --source=${PWD?}/trust_config.yaml
      

      请替换以下内容:

      • TRUST_CONFIG_NAME:您的信任配置的名称。
      • GCP_PROJECT:Google Cloud 项目 ID。

如果您要部署更复杂的结构,其中中间 CA 由根证书签名,请确保将中间 CA 添加为 intermediateCAs

方法 2

使用您自己的 PKI 部署和现有证书来创建信任配置。

此类信任配置假定基本信任存储区具有一个表示根证书的信任锚。未指定中间证书。

创建信任配置:

  1. 设置以下环境变量:

    ROOT_PEM_FILE=TRUST_ANCHOR_PATH
    INT_PEM_FILE1=IM_CERT_PATH
    INT_PEM_FILE2=SECOND_IM_CERT_PATH
    

    请替换以下内容:

    • TRUST_ANCHOR_PATH:指向 PEM 编码的信任锚的路径。
    • IM_CERT_PATH:指向 PEM 编码的中间证书的路径。
    • SECOND_IM_CERT_PATH:指向第二个 PEM 编码的中间证书的路径。
  2. 准备信任配置 YAML 文件的内容:

    ROOT=$(cat ROOT_PEM_FILE | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
    INT_1=$(cat INT_PEM_FILE1 | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
    INT_2=$(cat INT_PEM_FILE2 | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
    
  3. 创建信任配置 YAML 文件:

    cat << EOF > trust_config.yaml
    name: "${TRUST_CONFIG_NAME?}"
    trustStores:
    - trustAnchors:
      - pemCertificate: "${ROOT?}"
      intermediateCas:
      - pemCertificate: "${INT_1?}"
      - pemCertificate: "${INT_2?}"
    EOF
    

    此 YAML 文件定义了名为 TRUST_CONFIG_NAME 的信任配置。信任配置包含一个信任存储区,此存储区包括根证书和两个中间证书。

  4. 将信任配置导入 Google Cloud Certificate Manager:

    gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME \
      --project=GCP_PROJECT \
      --source=${PWD?}/trust_config.yaml
    

    请替换以下内容:

    • TRUST_CONFIG_NAME:您的信任配置的名称。
    • GCP_PROJECT:Google Cloud 项目 ID。

方法 3

如果您使用的是 Chrome 浏览器,并且想要将自签名证书用于端点验证,请按照本部分中的说明操作。

按照instructions为您的组织部署端点验证。Endpoint Verification 会自动将 Google 签发的自签名证书部署到您的设备,您无需创建信任配置。

创建 TLS 政策以在外部负载均衡器上启用 mTLS

如果您使用的是方法 3,则可以跳过此步骤。

如需完成此任务,您必须拥有以下权限:

  1. 创建服务器 TLS 政策 YAML 文件:

    cat << EOF > server_tls_policy.yaml
    name: "SERVER_TLS_POLICY_NAME"
    mtlsPolicy:
      clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT
      clientValidationTrustConfig: projects/GCP_PROJECT/locations/global/trustConfigs/TRUST_CONFIG_NAME
    EOF
    

    请替换以下内容:

    • SERVER_TLS_POLICY_NAME:服务器 TLS 政策的名称。
    • GCP_PROJECT:Google Cloud 项目 ID。
    • TRUST_CONFIG_NAME:您在上一步中创建的信任配置。

    如需了解 clientValidationMode 的客户端验证选项,请参阅 MTLS 客户端验证模式

  2. 将服务器 TLS 政策 YAML 导入 Google Cloud 项目:

    gcloud network-security server-tls-policies import ${SERVER_TLS_POLICY_NAME?} \
      --project=GCP_PROJECT \
      --source=${PWD?}/server_tls_policy.yaml \
      --location=global
    

    GCP_PROJECT 替换为 Google Cloud 项目 ID。

创建 TLS 政策后,便无法修改。如果您要更改现有的 TLS 政策,请删除现有 TLS 政策并创建新政策。

将 TLS 政策附加到目标 HTTPS 政策

如需完成此任务,您必须拥有目标 Google Cloud 项目的 compute.targetHttpsProxies.get 权限。

  1. 将现有目标 HTTPS 代理导出到本地文件:

    gcloud compute target-https-proxies export TARGET_HTTPS_PROXY_NAME \
        --project=GCP_PROJECT \
        --global \
        --destination=${PWD?}/xlb-mtls-target-proxy.yaml
    

    请替换以下内容:

    • TARGET_HTTPS_PROXY_NAME:目标 HTTPS 代理。
    • GCP_PROJECT:Google Cloud 项目 ID。
  2. ServerTlsPolicy 附加到目标 HTTPS 代理配置:

    如需完成此任务,您必须拥有以下权限:

    echo "serverTlsPolicy:
    //networksecurity.googleapis.com/projects/GCP_PROJECT/locations/global/serverTlsPolicies/SERVER_TLS_POLICY_NAME" >> xlb-mtls-target-proxy.yaml
    

    请替换以下内容:

    • GCP_PROJECT:Google Cloud 项目 ID。
    • SERVER_TLS_POLICY_NAME:服务器 TLS 政策。
  3. 通过从本地文件导入新配置来更新目标 HTTPS 代理:

    gcloud compute target-https-proxies import TARGET_HTTPS_PROXY_NAME \
        --project=GCP_PROJECT \
        --global \
        --source=${PWD?}/xlb-mtls-target-proxy.yaml
    

    请替换以下内容:

    • TARGET_HTTPS_PROXY_NAME:目标 HTTPS 代理。
    • GCP_PROJECT:Google Cloud 项目 ID。

创建需要证书的访问权限级别

控制台

  1. 按照相关说明创建自定义访问权限级别
  2. 将以下表达式添加到您的自定义访问权限级别:

    如果您创建了信任配置(方法 1 或方法 2),请在自定义访问权限级别的条件字段中添加以下表达式,以便在进行身份验证时使用 PKI 认证绑定:

    certIsPkiAttested(origin, ["TLS_POLICY_FULL_RESOURCE_PATH1", "TLS_POLICY_FULL_RESOURCE_PATH2", …]) == true
    

    其中 TLS_POLICY_FULL_RESOURCE_PATH1TLS_POLICY_FULL_RESOURCE_PATH2 是表示多个信任配置的路径:certificatemanager.googleapis.com/projects/GCP_PROJECT/locations/global/trustConfigs/TRUST_CONFIG_NAME

    您必须提供至少一个信任配置路径。

    请替换以下内容:

    • GCP_PROJECT:Google Cloud 项目 ID。
    • TRUST_CONFIG_NAME:您的信任配置的名称。

    如果您使用的是 Google 签发的自签名证书(方法 3),请在自定义访问权限级别的条件字段中添加以下表达式,以便在进行身份验证时使用证书绑定:

    certificateBindingState(origin, device) == CertificateBindingState.CERT_MATCHES_EXISTING_DEVICE
    

gcloud

如果您创建了信任配置(方法 1 或方法 2),请运行以下命令,创建一个在进行身份验证时使用 PKI 认证绑定的自定义访问权限级别:

gcloud access-context-manager levels create ACCESS_LEVEL_NAME \
    --title=TITLE \
    --custom-level-spec=FILE \
    --description=DESCRIPTION \
    --policy=POLICY_NAME

请替换以下内容:

  • ACCESS_LEVEL_NAME:访问权限级别的唯一名称。
  • TITLE:直观易懂的标题。
  • FILE:包含以下表达式的 YAML 文件:

    certIsPkiAttested(origin, ["TLS_POLICY_FULL_RESOURCE_PATH1", "TLS_POLICY_FULL_RESOURCE_PATH2", …]) == true

    其中 TLS_POLICY_FULL_RESOURCE_PATH1TLS_POLICY_FULL_RESOURCE_PATH2 是表示多个信任配置的路径:certificatemanager.googleapis.com/projects/GCP_PROJECT/locations/global/trustConfigs/TRUST_CONFIG_NAME

    您必须提供至少一个信任配置路径。

    请替换以下内容:

    • GCP_PROJECT:Google Cloud 项目 ID。
    • TRUST_CONFIG_NAME:您的信任配置的名称。
  • DESCRIPTION:访问权限级别的详细说明。

  • POLICY_NAME:您的组织的访问权限政策。

如果您没有信任配置,因为您在端点验证中使用自签名证书(方法 3),请将以下表达式添加到您的自定义访问权限级别:

certificateBindingState(origin, device) == CertificateBindingState.CERT_MATCHES_EXISTING_DEVICE

使用 Identity-Aware Proxy (IAP) 强制执行基于证书的访问权限

在 Web 应用架构的 CBA 中,IAP 提供基于主账号的强制执行政策,以保护您的 Web 应用免受不可信设备的侵害。

如需启用 IAP 并配置 CBA 政策,请完成以下步骤:

  1. 如果您未设置 IAP,请按照instructions设置 IAP。
  2. 前往 IAP 关联您之前创建的访问权限级别
    前往 IAP
  3. 选择要使用 CBA 保护的资源,然后点击设置
  4. 访问权限级别字段中,输入您创建的访问权限级别的名称。

如需使用 Google Cloud CLI 在 IAP 中配置 CBA 政策,请参阅 Google Cloud CLI 文档

将浏览器配置为自动选择证书

如需让浏览器在确定访问权限时自动选择证书,请针对浏览器完成相关步骤。

Chrome

配置 AutoSelectCertificateForURLs Chrome 政策,以便 Chrome 在 mTLS 握手期间使用正确的证书。

  1. 确保 Chrome 浏览器受 Chrome 浏览器云管理或 Windows 组政策管理:

  2. 添加 AutoSelectCertificateForUrls 政策:

    1. 管理控制台中,前往设备 > Chrome > 设置 > 用户和浏览器设置 > 客户端证书
    2. 选择一个组织。
    3. 为您的 Web 应用网址和根证书信息添加 AutoSelectCertificateForUrls 政策。

如需了解详情,请参阅有关政策架构的文档。以下是使用端点验证所提供证书的政策配置示例:

{
  "pattern":"https://[*.].mysite.com",
  "Filter":{
    "ISSUER":{
      "CN":"Google Endpoint Verification"
    }
  }
}

Safari

配置身份偏好设置:

  1. 打开钥匙串访问应用,然后选择所有项
  2. 选择要配置的证书。
  3. 依次点击 File > New Identity Preference
  4. 输入网址,然后点击添加

这会在您的钥匙串中创建一个新的身份偏好设置条目,您可以对其进行更新。

边缘

按照 Edge 文档中的说明设置 AutoSelectCertificateForUrls Edge 政策。