TLS 检查(也称为 TLS 解密或 HTTPS 检查)允许 Cloudflare Gateway 执行更深入的流量分析,并采取诸如扫描请求正文中的敏感数据、升级到远程浏览器隔离会话以及根据请求的完整 URL 和路径进行重定向等操作。
TLS 检查对于涉及用户访问敏感系统的安全策略是非常理想的,但它也可能带来挑战。在未开启 TLS 检查的情况下,策略仍可以使用用户身份、设备姿态、IP 地址、解析的域名、SNI 以及支持 Zero Trust 安全实施的许多其他属性。
组织往往对采用 TLS 检查做法持犹豫态度,原因在于过去使用概念上以相同方式工作的遗留系统的经历导致了对与现有系统互操作性的担忧。但是,Cloudflare 的 TLS 检查方法功能强大、性能卓越、现代化,最重要的是非常灵活。我们理解永远不可能检查绝对所有的流量——总有一些东西会崩溃。我们的建议记住了这一实际现实。
要决定为什么以及应如何开启 TLS 检查,我们建议你从以下步骤开始:
Cloudflare Zero Trust 大多数高级安全和数据丢失防护 (DLP) 功能都需要 TLS 检查。
由于对用户隐私和合规使用的担忧,一些安全组织选择避免 TLS 检查。这是一个重要且有时很复杂的组织决定,但你可以通过建立与你的安全实践相关的目标来简化它。需要考虑的问题:
- 你的组织对 TLS 检查的使用旨在保护“已知”(例如公司认可的 SaaS 应用程序中的敏感数据)还是“未知”(例如用户向全新的对象存储桶下载或上传文件)?
- 你打算主要通过域名或主机名进行拦截,还是通过为完整 URL 构建策略来进行拦截?
- 你计划针对 DLP 配置文件扫描请求正文或文件,还是使用防病毒或防恶意软件引擎扫描下载的文件?
- 你是否打算使用内联远程浏览器隔离 (Remote Browser Isolation) 来利用数据安全功能(如复制/粘贴阻断、键盘阻断和打印阻断)?
如果这些问题中大多数的答案都是否,并且你的组织主要依赖于基于主机名或基于 DNS 的安全控制,那么你可能不需要检查大部分(如果不是全部)TLS 流量。因为 Cloudflare 既作为安全 Web 网关运营,也作为连接用户的安全 DNS 解析器运营,所以你可以应用策略控制,以在不需要广泛检查 TLS 流量的情况下提高你的安全姿态。
要为你的 Zero Trust 组织开启 TLS 检查:
- 在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Traffic policies(流量策略) > Traffic settings(流量设置)。
- 在 Proxy and inspection(代理与检查) 中,开启 Inspect HTTPS requests with TLS decryption(通过 TLS 解密检查 HTTPS 请求)。
-
向您的
cloudflare_api_token↗ 添加以下权限:Zero Trust Write
-
在
cloudflare_zero_trust_gateway_settings↗ 中配置tls_decrypt参数:resource "cloudflare_zero_trust_gateway_settings" "team_name" { account_id = var.cloudflare_account_id settings = { tls_decrypt = { enabled = true } } }
默认情况下,Gateway 仅通过端口 80 检查 HTTP 流量。此外,如果您开启 TLS 解密,Gateway 将检查通过端口 443 的 HTTPS 流量。
要在 80 和 443 以外的端口上检测并检查 HTTP 和 HTTPS 流量,你可以开启 协议检测 并配置 Gateway 以 检查所有端口上的流量。
TLS 检查需要受信任的私有根证书才能检查和过滤加密流量。Cloudflare 根证书是一种简单且常见的解决方案,当部署到你的设备时,通常适用于测试或概念验证条件。你可以在 Zero Trust 中生成 Cloudflare 证书。
或者,如果你已经拥有用于其他检查或信任应用程序的根 CA,我们建议使用你自己的证书。其中的一些原因包括:
- 假设相关设备群上已部署根证书,使用单个证书可精简你的 IT 管理。
- 如果 Git 工作流或 CLI 工具等外部服务依赖于现有的证书存储,在检查中展示相同的证书极不可能中断其流量流,尽管这些可能是你希望豁免于检查的内容。
- 如果你正在使用 Cloudflare Mesh 或 Cloudflare WAN IPsec/GRE 隧道向 Cloudflare 引导接入流量,这些隧道后面的设备将无法使用需要 TLS 检查的 HTTP 策略,除非它们拥有一张匹配你组织选择的证书。你的网络基础设施极有可能已部署了你自己的设备证书,因此在检查中使用你自己现有的公钥基础设施将简化保护。
在生成 Cloudflare 证书或上传自定义证书后,你需要将其设置为 Available 以便在 Cloudflare 网络中部署,并设置为 In-Use 以将其用于检查。有关更多信息,请参阅激活根证书。
你想要默认检查所有流量,还是只想检查显式目的地?我们建议你构建一个要从检查中排除的应用程序和端点的 Gateway 列表,并将该列表作为 OR 运算符添加到我们现有的“不检查”应用程序组中。例如:
| 选择器 | 运算符 | 值 | 逻辑 | 操作 |
|---|---|---|---|---|
| Application(应用程序) | in | Do Not Inspect(不检测) | Or(或) | Do Not Inspect(不检测) |
| Host(主机) | in list | Trusted Hostnames |
如果你的组织是新近采用需要 TLS 检查的安全框架,我们建议从最小化开始。事实上,选择仅显式检查预先确定的主机名、IP 或特定用户组或设备类型的列表,并在初始部署阶段放弃对其他所有内容的检查,甚至可能是恰当的。Cloudflare 对于在何处以及何时可以部署检查拥有独特且灵活的方法,这意味着它可以像你的组织需要的那样受限和精细,而不会影响设备路由表或其他对内存敏感的本地结构。
你可以构建直通规则,以适应不应受到检查的任何类型的设备或用户组。
例如,如果向用户发放了具备受限权限的公司托管 iPhone,请为匹配该设备姿态值的所有流量设置附加的“不检查”策略。这可以包括操作系统类型、操作系统版本或这些 iPhone 的序列号列表(通过带有来自你的 MDM 工具的钩子的 API 进行更新):
| 选择器 | 运算符 | 值 | 逻辑 | 操作 |
|---|---|---|---|---|
| Passed Device Posture(已通过的设备状况) | in | iOS 17 or higher (OS version) | And | Do Not Inspect(不检测) |
| Passed Device Posture | in | iPhone Serial Numbers (Serial number) |
-
创建你不希望检查的设备序列号列表。
Create Zero Trust listbash curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/lists" \ --request POST \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ --json '{ "description": "The serial numbers for administrators", "items": [ { "value": "8GE8721RE" } ], "name": "Admin Serial Numbers", "type": "SERIAL" }' -
创建针对序列号列表检查设备的“不检查”策略。
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/rules" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"name": "Do not inspect corporate devices",
"traffic": "",
"identity": "",
"device_posture": "any(device_posture.checks.passed[*] in {\"<SERIAL_NUMBER_LIST_UUID>\"})",
"action": "off",
"precedence": 14002,
"enabled": true,
"filters": [
"http"
]
}'如果你使用 IPsec/GRE 隧道、Cloudflare Mesh 或未安装 Cloudflare 证书的其他设备过滤网络连接设备,则需要通过创建直通策略来进行适应。对于这些设备,你应当显式对该流量来源的源网络 IP 范围豁免 TLS 检查。例如:
| 选择器 | 运算符 | 值 | 操作 |
|---|---|---|---|
| Source Internal IP(源内部 IP) | in | 203.0.113.0/24 |
Do Not Inspect(不检测) |
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/rules" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"name": "Do not inspect corporate devices",
"traffic": "http.conn.internal_src_ip in {203.0.113.0/24}",
"identity": "",
"device_posture": "",
"action": "off"
}'