本页面介绍了如何为 Web 应用启用基于证书的访问权限 (CBA)。您可以使用 CBA 来保护从可信设备对在 Google Cloud 上运行的企业 Web 应用的访问。
概览
Web 应用的 CBA 使用 Chrome Enterprise Premium 情境感知访问权限功能和 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
按照instructions设置 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
。
方法 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 浏览器,并且想要将自签名证书用于端点验证,请按照本部分中的说明操作。
按照instructions为您的组织部署端点验证。Endpoint Verification 会自动将 Google 签发的自签名证书部署到您的设备,您无需创建信任配置。
创建 TLS 政策以在外部负载均衡器上启用 mTLS
如果您使用的是方法 3,则可以跳过此步骤。
如需完成此任务,您必须拥有以下权限:
- 您为此
ServerTlsPolicy
创建的信任配置上的certificatemanager.trustconfigs.use
权限 - 针对目标 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 代理配置:如需完成此任务,您必须拥有以下权限:
- 您为目标 HTTPS 代理创建的
ServerTlsPolicy
上的networksecurity.serverTlsPolicies.use
- 针对目标 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 代理创建的
通过从本地文件导入新配置来更新目标 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,请按照instructions设置 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
配置身份偏好设置:
- 打开钥匙串访问应用,然后选择所有项。
- 选择要配置的证书。
- 依次点击 File > New Identity Preference。
- 输入网址,然后点击添加。
这会在您的钥匙串中创建一个新的身份偏好设置条目,您可以对其进行更新。
边缘
按照 Edge 文档中的说明设置 AutoSelectCertificateForUrls
Edge 政策。