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

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

概览

Web 应用的 CBA 使用 Chrome Enterprise Premium 情境感知访问权限功能, Google Cloud 网络,利用相互 TLS (mTLS)。以下内容是主要 用于为 Web 应用启用 CBA 的组件:

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

准备工作

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

按照说明为贵组织部署端点验证。端点验证会自动部署 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:您的信任配置 创建 Deployment 清单

    如需了解 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 政策。

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

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

Safari

配置身份偏好设置:

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

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

边缘

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