本页介绍了如何为 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 颁发的证书创建信任配置。
- 完成创建根 CA 的步骤。
提取 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 位置。
检索
pemCaCertificates
字段中返回的根证书。该证书是BEGIN CERTIFICATE
和END CERTIFICATE
标记之间的字符串,且包含这两个标记。将 PEM 格式的根证书保存到文件中。
创建信任配置:
设置以下环境变量:
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 编码的中间证书的路径。
准备信任配置 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')
创建信任配置 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
的信任配置。信任配置包含一个受信任证书存储区,其中包含根证书和两个中间证书。将信任配置导入 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 部署与现有证书搭配使用,以创建信任配置。
此类信任配置假定使用具有单个信任关系的基本受信任证书存储区 表示根证书的锚点。未指定任何中间证书。
创建信任配置:
设置以下环境变量:
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 编码的路径。 中间证书
准备信任配置 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')
创建信任配置 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
的信任配置。信任配置包含一个受信任证书存储区,其中包含根证书和两个中间证书。将信任配置导入 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,则可以跳过此步骤。
如需完成此任务,您必须拥有以下权限:
- 您为此
ServerTlsPolicy
创建的信任配置中的certificatemanager.trustconfigs.use
networksecurity.serverTlsPolicies.create
针对目标 Google Cloud 项目
创建服务器 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 客户端验证模式。将服务器 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
权限。
将现有的目标 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。
将
ServerTlsPolicy
附加到目标 HTTPS 代理配置:若要完成此任务,您必须拥有以下权限:
- 你创建的
ServerTlsPolicy
上的networksecurity.serverTlsPolicies.use
(针对目标 HTTPS 代理) - 目标 Google Cloud 项目上的
compute.targetHttpsProxies.update
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 政策。
- 你创建的
通过从本地文件导入新配置来更新目标 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),请添加以下内容 表达式的条件字段中使用 进行身份验证时的 PKI 证明绑定:
certIsPkiAttested(origin, ["TLS_POLICY_FULL_RESOURCE_PATH1", "TLS_POLICY_FULL_RESOURCE_PATH2", …]) == true
其中,TLS_POLICY_FULL_RESOURCE_PATH1 和 TLS_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_PATH1 和 TLS_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 政策,请完成以下步骤:
- 如果您未设置 IAP,请按照说明操作 设置 IAP。
- 前往 IAP 以附加您之前创建的访问权限级别:
前往 IAP - 选择要使用 CBA 保护的资源,然后点击设置。
- 在访问权限级别字段中,输入您创建的访问权限级别的名称。
如需使用 Google Cloud CLI 在 IAP 中配置 CBA 政策,请参阅 Google Cloud CLI 文档。
配置浏览器以自动选择证书
如需让浏览器在确定访问权限时自动选择证书,请完成适用于您浏览器的步骤。
Chrome
配置 AutoSelectCertificateForURLs
Chrome 政策,以便 Chrome 在 mTLS 握手期间使用正确的证书。
确保 Chrome 浏览器由 Chrome 浏览器云管理 管理或 Windows 组策略:
- Windows、macOS、Linux:完成设置受管理的 Chrome 配置文件的步骤。
- Chrome:将设备注册到企业。
添加
AutoSelectCertificateForUrls
政策:
如需了解详情,请参阅有关政策架构的文档。以下是使用 Endpoint Verification 中的证书的政策配置示例:
{
"pattern":"https://[*.].mysite.com",
"Filter":{
"ISSUER":{
"CN":"Google Endpoint Verification"
}
}
}
Safari
配置身份偏好设置:
- 打开“钥匙串访问”应用,然后选择所有内容。
- 选择要配置的证书。
- 点击文件 >新的身份偏好设置。
- 输入网址,然后点击添加。
这会在您的钥匙串中创建一个新的身份偏好设置条目,您可以对其进行更新。
边缘
按照说明设置 AutoSelectCertificateForUrls
Edge 政策
Edge 文档。