VPN 本身并不能让 Cosmos DB 变成私有
VPN 只是把笔记本接入网络,而不是进入数据库。看看私有终结点、DNS 区域、连接模式和账户访问各自要做什么。
你通过 VPN 把笔记本接入 VNet,打开 Cosmos DB 账户的 URL,请求却仍然经由公共互联网发出。隧道完成了它的任务。它没有做的是创建私有终结点、发布私有 DNS 记录或关闭公共访问,因为这是对账户的三项独立改动,而不是你网络连接的属性。本示例使用用于 NoSQL 的 Azure Cosmos DB、VNet 中的私有终结点,以及通过 VPN 连接到该 VNet 的笔记本,并保持应用程序的地址不变。
迷思:连上 VPN 就能让数据库变成私有
处在 VNet 中只意味着你的数据包能够到达该 VNet 内的私有地址。它并不说明账户名称在哪里解析,也不说明账户是否仍然接受公共流量。
私有终结点是一个独立资源,有自己的地址、自己的审批步骤和自己的 DNS 接线。在它存在并获得批准之前,名称会解析到公共终结点,无论隧道如何,流量都会去那里。
真正让名称以私有方式解析的是什么
保留 SDK 的常规账户终结点,类似 https://ACCOUNT.documents.azure.com 的东西。私有 DNS 应通过 Private Link 链把该名称解析到终结点的私有地址。不要用数字 URL 替换它,也不要关闭证书检查,因为那是用 DNS 问题换安全问题。
| Example choice | Value |
|---|---|
| Cosmos API | NoSQL |
| Private endpoint subresource | Sql |
| Private DNS zone | privatelink.documents.azure.com |
| SDK connection mode | Gateway |
这些值专属于 NoSQL API。其他 Cosmos API 并不是同一示例中可以互换的条目,而从其他 API 复制子资源名称会产生一个永远无法解析的终结点。
通过经授权的 Azure 工作流创建并批准该终结点,然后使用其私有 DNS 区域组集成。笔记本需要 能够为该区域作答的解析器,无论是直接还是通过经批准的转发,以及到每个相关终结点地址的 VPN 客户端路由。
私有终结点可以有多个地址,包括全局和区域条目。当账户区域变化时,应维护 DNS 集成,而不是把单个地址钉在 hosts 文件中;并记住,无关公共解析器的答案并不能证明私有路径。如果你通过中心转发 DNS,请在调试客户端之前确认转发器能够作答。过期的转发器会返回公共答案,看起来与缺失终结点完全一样。
Gateway 模式和 Direct 模式不可互换
Gateway 模式通过 TCP 443 上的 HTTPS 发送服务请求。这就是为什么仅放行 443 的防火墙策略对它有效,也是本示例刻意选择它的原因。
通过 Private Link 的 Direct 模式有不同的连接要求,包括账户文档中列出的更宽的 TCP 端口范围。为 Gateway 模式编写的策略不得被悄悄复用到 Direct 模式客户端上,否则 SDK 会连接成功,然后在第一次数据操作时挂起。
选定一种模式,与账户一起记录下来,并让网络策略与之匹配。在排查故障时切换模式的团队,通常最终得到的防火墙规则集两种模式都不满足。
关闭公共访问是另一个开关
如果账户应仅为私有,请通过账户支持的设置关闭公共网络访问并验证结果。不要把私有终结点的存在当作完整的访问决定,因为同时拥有私有终结点和已启用公共访问的账户仍会在互联网上作答。
既要从 VPN 外部验证,也要从内部验证。来自应被排除的网络的请求,才是证明该设置已生效的测试,也是大多数变更窗口会跳过的测试。
可达并不等于有权限
从 VPN 笔记本执行一次被允许的 SDK 操作就是验收测试,使用常规账户 URL 和预期身份。VPN 可达并不授予 Cosmos 数据权限;数据平面检查自己的角色或密钥。
然后执行拒绝测试:换一个身份,以及一条不应再到达该账户的网络路径。如果其中任何一个成功,你记录的边界就不是你构建的边界。
完成时写下四个事实:终结点的私有地址、为账户名称作答的 DNS 区域、连接模式及其端口要求,以及公共访问是否已关闭。这四点能向下一人解释整套配置,而且每一点都会独立失效。