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

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

概览

Web 应用的 CBA 使用 Chrome 企业进阶版情境感知访问权限功能和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

按照说明设置 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),请务必将中间 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 浏览器,并且想要将自签名证书与端点验证搭配使用,请按照本部分中的说明操作。

按照说明为组织部署端点验证。端点验证会自动向您的设备部署 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,请按照说明设置 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. 依次点击文件 > 新建身份偏好设置
  4. 输入网址,然后点击添加

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

Edge

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