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

本页介绍了如何为 Web 应用启用基于证书的访问 (CBA)。您可以使用 CBA 从受信任设备安全地访问在 Google Cloud上运行的企业 Web 应用。

概览

适用于 Web 应用的 CBA 使用 Chrome Enterprise 进阶版情境感知访问权限功能和Google Cloud 网络功能,通过双向 TLS (mTLS) 实现安全访问。以下是您在为 Web 应用启用 CBA 时要使用的主要组件:

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

准备工作

运行以下命令,验证您是否使用的是最新版本的 Google Cloud CLI

gcloud components update

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

按照说明设置 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 的形式添加中间 CA。

方法 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 浏览器,并且希望将自签名证书与端点验证搭配使用,请按照本部分中的说明操作。

按照说明为贵组织部署端点验证。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),请在自定义访问权限级别的 Conditions 字段中添加以下表达式,以便在进行身份验证时使用 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,请按照说明设置 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 政策。

如需了解详情,请参阅政策架构文档。以下是使用 Endpoint Verification 中的证书的政策配置示例:

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

Safari

配置身份偏好设置:

  1. 打开“钥匙串访问”应用,然后选择所有内容
  2. 选择要配置的证书。
  3. 依次点击 File(文件)> New Identity Preference(新建身份偏好设置)。
  4. 输入网址,然后点击添加

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

Edge

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