本页将指导您完成通过 Chrome 企业进阶版安全网关保护 SaaS 应用的流程。
Chrome 企业进阶版安全网关充当正向代理,可强制执行零信任访问框架,并根据情境精细控制哪些用户可以访问您的 SaaS 应用。
如何保障对 SaaS 应用的访问安全
下面简要介绍了安全网关如何保护您的 SaaS 应用:
- 客户端浏览器设置通过安全网关代理路由应用流量。
- 安全网关会检查情境感知访问权限政策,以授权客户端(用户和设备)访问。
- 如果允许客户端访问,网关会使用分配给该网关和 Google Cloud 区域的唯一源 IP 地址将流量转发到应用。这些分配的 IP 地址专为所创建的网关预留,不能供其他用户或网关使用。如需控制访问权限,您可以将这些专用来源 IP 地址添加到 SaaS 应用的许可名单中。
准备工作
在设置安全网关之前,请确认您已具备以下条件:
- Chrome 企业进阶版许可
- 使用管理员账号访问 Google 管理控制台
- 已分配结算账号且已启用以下 API 的 Google Cloud 项目: BeyondCorp API
为设置相关事宜的管理员授予以下 Identity and Access Management (IAM) 角色:项目级:Cloud BeyondCorp Admin (
beyondcorp.admin)。您要保护的 SaaS 应用。应用必须支持
IP allowlisting,以便通过安全网关强制执行安全检查。
限制
Chrome 企业进阶版安全网关存在以下限制:
- IPv6 连接:Chrome 企业进阶版安全网关不支持使用 IPv6 连接的 SaaS 应用。
- 作为 SaaS 应用的身份提供方:如果最终用户通过安全网关进行的身份验证依赖于同一 IdP,则不得将身份提供方配置为受安全网关保护的 SaaS 应用。
设置 shell 环境
为了简化设置流程并与安全网关 API 进行交互,请在工作 shell 中定义以下环境变量。
常规参数
API="beyondcorp.googleapis.com" API_VERSION=v1 PROJECT_ID=
PROJECT_IDAPPLICATION_ID=APPLICATION_IDAPPLICATION_DISPLAY_NAME="APPLICATION_DISPLAY_NAME" HOST_NAME=HOST_NAME替换以下内容:
PROJECT_ID:创建安全网关的项目的 ID。APPLICATION_ID:您的应用的 ID,例如github。名称最多可包含 63 个字符,并且可以包含小写字母、数字和连字符。第一个字符必须是字母,最后一个字符可以是字母或数字。APPLICATION_DISPLAY_NAME:要显示的直观易懂的名称。HOST_NAME:应用的 hostname。例如github.com。主机名最多可包含 253 个字符,并且必须遵循以下格式之一:- 有效的 IPv4 地址
- 有效的 IPv6 地址
- 有效的 DNS 名称
- 星号 (*)
- 星号 (*) 后跟有效的 DNS 名称
安全网关参数
SECURITY_GATEWAY_ID=
SECURITY_GATEWAY_IDSECURITY_GATEWAY_DISPLAY_NAME="SECURITY_GATEWAY_DISPLAY_NAME"替换以下内容:
SECURITY_GATEWAY_ID:安全网关的 ID。ID 最多可包含 63 个字符,并且可以包含小写字母、数字和连字符。第一个字符应为字母,最后一个字符可以是字母或数字。SECURITY_GATEWAY_DISPLAY_NAME:安全网关的人类可读名称。名称不得超过 63 个字符,并且只能包含可打印的字符。
创建安全网关
Chrome 企业进阶版安全网关是建立与应用的安全连接的基本构建块。它会分配专用项目和网络,从而提供隔离性和安全性。
如需创建安全网关资源,请使用以下方法之一。
gcloud
运行以下命令。对于 --hubs 标志,请指定以下列表中的一个或多个区域。
gcloud beyondcorp security-gateways create ${SECURITY_GATEWAY_ID} \
--project=${PROJECT_ID} \
--location=global \
--display-name="SECURITY_GATEWAY_DISPLAY_NAME" \
--hubs=us-central1
REST
在请求正文中包含网关详细信息的情况下,调用 Create API 方法。对于 hubs 对象,请指定以下列表中的一个或多个区域。
curl \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-X POST \
-d '{ "display_name": "SECURITY_GATEWAY_DISPLAY_NAME", "hubs": { "us-central1": {} } }' \
"https://${API}/${API_VERSION}/projects/${PROJECT_ID}/locations/global/securityGateways?security_gateway_id=${SECURITY_GATEWAY_ID}"
hubs 表示启用出站连接到目标应用所需的区域资源。每个区域可以有一个 hub,每个 hub 提供两个 IP 地址。您可以指定以下区域:
africa-south1asia-east1asia-south1asia-south2asia-southeast1europe-central2europe-north1europe-southwest1europe-west1europe-west2europe-west3europe-west4europe-west8europe-west9northamerica-northeast1northamerica-northeast2northamerica-south1southamerica-east1southamerica-west1us-central1us-east1us-east4us-east5us-west1
配置 SaaS 应用
创建安全网关后,您可以配置 SaaS 应用,以使用该安全网关进行安全访问。
获取安全网关为每个 Hub 分配的 IP 地址。为一个区域分配两个 IP 地址。
gcloud
gcloud beyondcorp security-gateways describe ${SECURITY_GATEWAY_ID} \ --project=${PROJECT_ID} \ --location=global
REST
curl \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ "https://${API}/${API_VERSION}/projects/${PROJECT_ID}/locations/global/securityGateways/${SECURITY_GATEWAY_ID}"
以下是具有
hubs的安全网关的GET响应示例。在此示例中,hubs是在us-central1和us-east1区域中创建的,并且响应中返回的所有 IP 地址都必须在 SaaS 应用中获得许可。gcloud
createTime: 'CREATE_TIME' displayName: My security gateway hubs: us-central1: internetGateway: assignedIps: - IP_ADDRESS_1 - IP_ADDRESS_2 us-east1: internetGateway: assignedIps: - IP_ADDRESS_1 - IP_ADDRESS_2 name: projects/${PROJECT_ID}/locations/global/securityGateways/${SECURITY_GATEWAY_ID} state: RUNNING updateTime: 'UPDATE_TIME'
REST
{ "securityGateways": [ { "name": "projects/${PROJECT_ID}/locations/global/securityGateways/${SECURITY_GATEWAY_ID}", "createTime": "CREATE_TIME", "updateTime": "UPDATE_TIME", "displayName": "My security gateway", "state": "RUNNING", "hubs": { "us-central1": { "internetGateway": { "assignedIps": [ "IP_ADDRESS_1", "IP_ADDRESS_2", ] } }, "us-east1": { "internetGateway": { "assignedIps": [ "IP_ADDRESS_1", "IP_ADDRESS_2", ] } } } } ] }
将这些 IP 地址添加到 SaaS 应用的 IP 许可名单中。例如,对于 GitHub 应用,您可以按照以下指南操作:管理组织的允许 IP 地址。
创建应用资源
以下信息将引导您完成安全网关应用资源的设置和配置过程。
在 Google Cloud中创建安全网关应用资源
Google Cloud 应用资源是安全网关资源的子资源。通过调用 Create API 创建应用资源。
gcloud
gcloud beyondcorp security-gateways applications create ${APPLICATION_ID} \ --project=${PROJECT_ID} \ --security-gateway=${SECURITY_GATEWAY_ID} \ --location=global \ --display-name="${APPLICATION_DISPLAY_NAME}" \ --endpoint-matchers="hostname=${HOST_NAME},ports=[443]"
REST
curl \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ -X POST \ -d "{ \"display_name\": \"${APPLICATION_DISPLAY_NAME}\", \"endpoint_matchers\": [{hostname: \"${HOST_NAME}\", ports: [443]}] }" \ "https://${API}/${API_VERSION}/projects/${PROJECT_ID}/locations/global/securityGateways/${SECURITY_GATEWAY_ID}/applications?application_id=${APPLICATION_ID}"
配置 Google Chrome 代理模式
您可以在 Google 管理控制台的 Chrome 设置中应用 PAC 文件,以通过安全网关路由应用流量。如需应用 PAC 文件,请执行以下操作:
创建或更新 PAC 文件。
使用以下 PAC 文件示例创建您的第一个应用,即创建一个
pac_config.js文件。更新现有
pac_config.js文件,并将新应用的网域添加到网站数组中,如下面的 PAC 文件示例所示。
function FindProxyForURL(url, host) { const PROXY = "HTTPS ingress.cloudproxy.app:443"; const sites = ["HOST_NAME"]; for (const site of sites) { if (shExpMatch(url, 'https://' + site + '/*') || shExpMatch(url, '*.' + site + '/*')) { return PROXY; } } return 'DIRECT'; }
将 HOST_NAME 替换为应用的 hostname,例如
myapp.example.com。如果您使用的是并非专门针对安全网关的现有 PAC 文件,请通过将应用的网域添加到网站数组来合并 PAC 文件。
上传文件,以便公开下载。例如,您可以将文件上传到 Cloud Storage,并通过向所有用户授予存储桶的 Storage Object User 角色,使文件可供公开下载。
如需验证上传的文件是否为最新版本,您可以将
Cache-Control标头设置为no-cache,以调整其缓存行为。此设置可防止浏览器和中间服务器存储文件副本,以便 Chrome 下载最新版本。如需详细了解
Cache-Control及其对浏览器缓存的影响,请参阅 Cache-Control 标头。复制已上传文件的公开网址。
更新代理模式设置
- 前往 Google 管理控制台。
- 依次点击设备 > Chrome > 设置。
- 选择组织部门或群组,然后点击代理模式。
- 在代理模式中,选择始终使用以下指定的代理自动配置,然后输入 Cloud Storage 中 PAC 文件的网址。
- 如需保存代理模式设置,请点击保存。
配置访问权限政策
您可以应用访问权限政策,以在安全网关级层(影响所有关联的应用)或在单个应用级层控制访问权限,从而实现更精细的控制。
安全地更新访问权限政策
setIamPolicy 命令会将整个现有政策替换为您提供的政策。为避免意外移除现有权限,我们建议您使用以下“读取-修改-写入”模式。此模式有助于防止意外移除现有权限。
读取:首先,获取当前访问权限政策。
修改:在本地修改政策文件,以添加或更改权限。
写入:应用更新后的政策文件。
获取当前政策
在进行任何更改之前,请先检索当前政策。
政策中的 etag 字段充当版本标识符。如果多位管理员同时进行更改,它可以防止发生冲突的更新。
以下命令会检索政策并将其保存到名为 policy.json 的文件中。
gcloud
gcloud beta beyondcorp security-gateways applications get-iam-policy APPLICATION_ID \ --security-gateway=SECURITY_GATEWAY_ID \ --project=PROJECT_ID \ --location=global > policy.json
请替换以下内容:
APPLICATION_ID:应用资源的 IDSECURITY_GATEWAY_ID:安全网关的 IDPROJECT_ID:配置了安全网关的项目的 ID
REST
curl \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ "https://${API}/${API_VERSION}/projects/PROJECT_ID/locations/global/securityGateways/SECURITY_GATEWAY_ID/applications/APPLICATION_ID:getIamPolicy" > policy.json
请替换以下内容:
PROJECT_ID:配置了安全网关的项目的 IDSECURITY_GATEWAY_ID:安全网关的 IDAPPLICATION_ID:应用资源的 ID
该命令会创建一个包含当前政策的 policy.json 文件。
修改政策文件
通过文本编辑器打开 policy.json 文件。如需授予群组使用安全网关的权限,请将该群组添加到 roles/beyondcorp.securityGatewayUser 角色的 members 列表中。
policy.json 文件类似于以下示例:
{
"version": 3,
"bindings": [
{
"role": "roles/beyondcorp.securityGatewayUser",
"members": [
"group:existing-group@example.com"
]
}
],
"etag": "BwXN8_d-bOM="
}
如需添加其他组,请向 members 数组添加新条目。在上述条目后添加一个英文逗号。
以下示例添加了 new-group@example.com:
{
"version": 3,
"bindings": [
{
"role": "roles/beyondcorp.securityGatewayUser",
"members": [
"group:existing-group@example.com",
"group:new-group@example.com"
]
}
],
"etag": "BwXN8_d-bOM="
}
您还可以在政策绑定中添加其他类型的成员,例如 serviceAccount、user、group、principal 和 principalSet。如需了解详情,请参阅 IAM 主账号。
应用更新后的政策
修改并保存 policy.json 文件后,使用 setIamPolicy 命令将其应用到资源。此命令使用文件中的 etag 来确保您更新的是正确的版本。
gcloud
gcloud beta beyondcorp security-gateways applications set-iam-policy APPLICATION_ID policy.json \ --security-gateway=SECURITY_GATEWAY_ID \ --project=PROJECT_ID \ --location=global
请替换以下内容:
APPLICATION_ID:应用资源的 IDSECURITY_GATEWAY_ID:安全网关的 IDPROJECT_ID:配置了安全网关的项目的 ID
REST
jq '{policy: .}' policy.json | curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ -d @- \ "https://${API}/${API_VERSION}/projects/PROJECT_ID/locations/global/securityGateways/SECURITY_GATEWAY_ID/applications/APPLICATION_ID:setIamPolicy"
请替换以下内容:
PROJECT_ID:配置了安全网关的项目的 IDSECURITY_GATEWAY_ID:安全网关的 IDAPPLICATION_ID:应用资源的 ID
添加条件访问权限政策
您还可以设置带条件的访问权限政策。条件用于指定要求,例如用户的 IP 地址来自特定位置。
以下示例政策仅在源 IP 地址位于指定访问权限级别内时授予访问权限:
{
"version": 3,
"bindings": [
{
"role": "roles/beyondcorp.securityGatewayUser",
"members": [
"group:group@example.com"
],
"condition": {
"expression": "request.auth.access_levels.contains('accessPolicies/1234567890/accessLevels/in_us')",
"title": "Source IP must be in US"
}
}
],
"etag": "BwXN8_d-bOM="
}
如需应用此政策,请按照前面所述的步骤操作。
安装 Chrome 企业进阶版扩展程序
Chrome Enterprise 进阶版扩展程序是安全网关不可或缺的一部分,可帮助进行身份验证。为安全网关的所有用户安装扩展程序。如需了解如何部署扩展程序,请参阅查看和配置应用和扩展程序。 如需安装 Chrome 企业进阶版扩展程序,请执行以下操作:
- 前往 Google 管理控制台。
- 依次点击 Chrome 浏览器 > 应用和扩展程序。
- 点击用户和浏览器标签页。
- 如需添加 Chrome 扩展程序,请点击 + 按钮。
搜索以下扩展程序,然后要求组织部门或群组中的所有用户安装该扩展程序:
ekajlcmdfcigmdbphhifahdfjbkciflj
点击已安装的扩展程序,然后在扩展程序政策字段中输入以下 JSON 值:
{ "securityGateway": { "Value": { "authentication": {}, "context": { "resource": "projects/PROJECT_ID/locations/global/securityGateways/SECURITY_GATEWAY_ID" } } } }
请替换以下内容:
PROJECT_ID:配置了安全网关的项目的 IDSECURITY_GATEWAY_ID:安全网关的 ID
如需保存配置,请点击保存。
最终用户体验
设置完成后,访问受保护的 SaaS 应用的最终用户将根据应用于该应用的访问政策获得或被拒绝访问权限。
在 Chrome 中访问应用
Chrome 企业进阶版扩展程序是必需的,用于将流量定向到安全网关。该扩展程序负责处理用户与安全网关之间的身份验证。该扩展程序通过网域政策自动安装。
当用户访问您配置的 SaaS 应用时,其流量会通过安全网关,该网关会检查用户是否满足访问政策。如果用户通过访问政策检查,系统会向其授予应用访问权限。
如果授权政策拒绝浏览器访问应用,用户会收到 Access denied 消息。