本页介绍了如何为 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 颁发的证书创建信任配置。
- 完成创建根 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),请务必将中间 CA 添加为 intermediateCAs
。
方法 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,则可以跳过此步骤。
您必须拥有以下权限才能完成此任务:
certificatemanager.trustconfigs.use
在您为此ServerTlsPolicy
创建的信任配置中- 目标 Google Cloud 项目上的
networksecurity.serverTlsPolicies.create
创建服务器 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 客户端验证模式。将服务器 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 代理配置:您必须拥有以下权限才能完成此任务:
networksecurity.serverTlsPolicies.use
您为目标 HTTPS 代理创建的ServerTlsPolicy
- 目标 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
政策:
如需了解详情,请参阅有关政策架构的文档。以下是使用端点验证中的证书的政策配置示例:
{
"pattern":"https://[*.].mysite.com",
"Filter":{
"ISSUER":{
"CN":"Google Endpoint Verification"
}
}
}
Safari
配置身份偏好设置:
- 打开“钥匙串访问”应用,然后选择所有项目。
- 选择要配置的证书。
- 依次点击文件 > 新建身份偏好设置。
- 输入网址,然后点击添加。
这会在您的钥匙串中创建一个新的身份偏好设置条目,您可以更新该条目。
Edge
按照 Edge 文档中的说明设置 AutoSelectCertificateForUrls
Edge 政策。