你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
在许多多租户 Web 应用程序中,可以使用域名提供以下功能:
将一个租户与另一个租户区分开来
帮助将请求路由到正确的基础结构
为客户提供品牌体验
可以使用子域或自定义域名。 本文为技术决策者提供关于域名方法及其权衡的指导。
子域
可以使用类似于 tenant.provider.com 的格式为每个租户分配一个通用共享域名下的唯一子域。
请考虑 Contoso 构建的示例多租户解决方案。 客户购买 Contoso 的产品,以帮助管理其发票生成。 Contoso 为所有租户分配各自的子域在 contoso.com 域名下。 如果 Contoso 使用区域部署,则他们可能会在 us.contoso.com 和 eu.contoso.com 域下分配子域。
本文将这些区域域称为 根域。 每个客户在主干域下获取自己的子域。 例如,Tailwind Toys 可能会收到 tailwind.contoso.com。 如果使用区域部署模型,Adventure Works 可能会收到 adventureworks.us.contoso.com。
注释
许多 Azure 服务都使用此方法。 例如,创建 Azure 存储帐户时,Azure 会分配一组子域,例如 <your account name>.blob.core.windows.net。
管理域命名空间
在自己的域名下创建子域时,可以有多个具有类似名称的客户。 他们共享一个通用域,因此第一个注册特定域的客户会获得其首选名称。 后续客户必须使用备用子域名称,因为完整的域名必须保持全局唯一。
通配符 DNS
使用通配符域名系统(DNS)条目来简化子域的管理。 与其为tailwind.contoso.com或adventureworks.contoso.com创建 DNS 条目,不如为*.contoso.com创建一个通配符条目。 使用 A 记录将所有子域定向到单个 IP 地址,或使用 CNAME 记录定向到规范名称。 如果使用区域主干域,则可能需要多个通配符条目,例如 *.us.contoso.com 和 *.eu.contoso.com。
注释
如果计划使用此功能,请确保 Web 层服务支持通配符 DNS。 许多 Azure 服务(包括 Azure Front Door 和 Azure 应用服务)都支持通配符 DNS 条目。
基于多部分主体域的子域
许多多租户解决方案跨越多个物理部署。 如果需要符合数据驻留要求,或者通过在地理位置更接近用户部署资源来提高性能,则此方法很常见。
即使在单个区域中,也可以将你的租户分布在独立部署中,以支持你的扩展策略。 如果计划对每个租户使用子域,请考虑多部分子域结构。
例如,Contoso 为其四个客户发布多租户应用程序。 Adventure Works 和 Tailwind Traders 处于美国,其数据存储在 Contoso 平台的共享美国实例上。 Fabrikam 和 Worldwide Importers 处于欧洲,其数据存储在欧洲实例上。
下图显示了 Contoso 为所有客户使用单干域 contoso.com 的示例。
Contoso 可以使用以下 DNS 条目来支持此配置。
| 子域 | CNAME 到 |
|---|---|
adventureworks.contoso.com |
us.contoso.com |
tailwind.contoso.com |
us.contoso.com |
fabrikam.contoso.com |
eu.contoso.com |
worldwideimporters.contoso.com |
eu.contoso.com |
每个新载入的客户都需要一个新的子域。 子域的数量随每个客户一起增加。
或者,Contoso 可以使用与部署相关或与地区相关的根域。
通过使用通配符 DNS,此部署的 DNS 条目可能类似于以下条目。
| 子域 | CNAME 到 |
|---|---|
*.us.contoso.com |
us.contoso.com |
*.eu.contoso.com |
eu.contoso.com |
Contoso 不需要为每个客户创建子域记录。 相反,每个地理位置的部署使用单个通配符 DNS 记录,可让新客户自动继承该主机名下的 CNAME 记录。
每种方法都有其优点和缺点。 使用单干域时,必须为载入的每个租户创建 DNS 记录,这会增加作开销。 但是,您在将租户在不同部署之间移动时拥有更大的灵活性。 可以更改 CNAME 记录以将其流量定向到另一个部署。 此更改不会影响任何其他租户。
多根域的管理开销较低。 您还可以跨多个区域主干域重用客户名称,因为每个主干域都有效地表示自己的命名空间。
自定义域名
你可能要使客户可以自带域名。 一些客户将此功能视为其品牌的重要方面。 客户可能还需要自定义域名来满足安全要求,尤其是在他们需要提供自己的传输层安全性(TLS)证书时。 这种方法可能很简单,但一些隐藏的复杂性需要深思熟虑的考虑。
名称解析
最终,每个域名必须解析为 IP 地址。 如前所述,名称解析过程取决于是部署解决方案的单个实例还是多个实例。
若要重新访问示例,Contoso 的客户之一 Fabrikam 请求将其 invoices.fabrikam.com 用作自定义域名来访问 Contoso 的服务。 Contoso 具有多个多租户平台的部署,因此他们决定使用子域和 CNAME 记录来实现其路由要求。 Contoso 和 Fabrikam 配置以下 DNS 记录。
| 名称 | 记录类型 | 价值 | 配置者 |
|---|---|---|---|
invoices.fabrikam.com |
CNAME | fabrikam.eu.contoso.com |
Fabrikam |
*.eu.contoso.com |
CNAME | eu.contoso.com |
Contoso |
eu.contoso.com |
A | (Contoso 的 IP 地址) | Contoso |
从名称解析的角度来看,此记录链可准确地将对 invoices.fabrikam.com 的请求解析为 Contoso 欧洲部署的 IP 地址。
主机头解析
名称解析只是问题的一部分。 Contoso 欧洲部署中的所有 Web 组件都必须知道如何处理在其请求标头中包含 Host Fabrikam 域名的请求。 根据 Contoso 使用的特定 Web 技术,每个租户的域名可能需要进一步配置,这会增加租户入驻的额外运营开销。
还可以重写主机标头,以便无论传入请求的 Host 标头如何,Web 服务器都会看到一致的标头值。 例如,使用 Azure Front Door 可以重写 Host 标头,以便无论请求如何,应用程序服务器都会接收单个 Host 标头。 Azure Front Door 会在 X-Forwarded-Host 标头中传播原始主机标头,以便您的应用程序可以检查它,然后查找租户信息。 但是,重写 Host 标头可能会导致其他问题。 有关详细信息,请参阅主机名保留。
域验证
在载入自定义域之前,必须验证自定义域的所有权。 否则,客户可能会意外或恶意地声明域名,这有时被称为域名抢注。
考虑 Contoso 对 Adventure Works 的加入过程,后者要求使用 invoices.adventureworks.com 作为其自定义域名。 遗憾的是,有人在尝试加入自定义域名时犯了拼写错误,他们漏掉了 s。 因此,他们把它设置为 invoices.adventurework.com。 因此,Adventure Works 的网络流量无法正常流动。 但是,当另一家名为 Adventure Work 的公司尝试将其自定义域添加到 Contoso 的平台时,他们被告知域名已在使用中。
若要防止此问题,尤其是在自助服务或自动化过程中,可能需要域验证步骤。 可能需要客户在添加域之前创建 CNAME 记录。 或者,可以生成一个随机字符串,并要求客户添加包含字符串值的 DNS TXT 记录。 在验证成功之前,无法添加域名。
无关联的 DNS 和子域接管攻击
使用自定义域名时,会使您的平台暴露于被称为“悬置 DNS或子域接管”的一类攻击。 当客户将其自定义域名与服务取消关联,但不会从其 DNS 服务器中删除记录时,将发生这些攻击。 然后,此 DNS 条目指向不存在的资源,并且容易受到接管。
如果发生以下情况,请考虑 Fabrikam 与 Contoso 的关系如何更改:
Fabrikam 决定不再与 Contoso 合作,因此他们终止了其业务关系。
Contoso 将 Fabrikam 租户退出服务,并禁用
fabrikam.contoso.com。Fabrikam 忘记删除
invoices.fabrikam.com的CNAME记录。恶意参与者会创建一个新 Contoso 帐户,并为其提供名称
fabrikam。攻击者将自定义域名
invoices.fabrikam.com加入其新租户。Contoso 在基于 CNAME 的域验证期间检查 Fabrikam 的 DNS 服务器。 他们会看到 DNS 服务器返回
invoices.fabrikam.com的 CNAME 记录,该记录指向fabrikam.contoso.com。 Contoso 认为自定义域验证成功。如果 Fabrikam 员工尝试访问该网站,则请求似乎起作用。 如果攻击者使用 Fabrikam 的品牌设置其 Contoso 租户,则员工可能会受到愚弄而访问该网站并提供敏感数据,攻击者随后可以访问这些数据。
使用以下策略来防止悬挂的 DNS 攻击:
要求删除 CNAME 记录, 然后 才能从租户的帐户中删除域名。
禁止重复使用租户标识符。 并要求每个租户创建一个 TXT 记录,其中包含与域名匹配的名称以及每次载入尝试更改的随机生成值。
TLS 证书
TLS 是新式应用程序的重要组成部分。 它为 Web 应用程序提供信任和安全性。 仔细考虑多租户应用程序的 TLS 证书的所有权和管理。
通常,域名所有者会颁发并续订其证书。 例如,Contoso 为us.contoso.com颁发并续订 TLS 证书,并为*.contoso.com颁发通配符证书。 同样,Fabrikam 管理域名的 fabrikam.com 记录,包括 invoices.fabrikam.com。
域所有者可以使用证书颁发机构授权(CAA)DNS 记录类型。 CAA 记录可确保只有特定颁发机构才能为域创建证书。
如果允许客户自带域,请考虑是打算代表他们颁发证书还是要求他们自带证书。 每个选项都有其优点和缺点:
如果为客户颁发证书,则可以处理证书续订,因此客户不需要维护它。 但是,如果客户在其域名上拥有 CAA 记录,则可能需要授权你代表他们颁发证书。
如果客户颁发并为你提供自己的证书,则可以安全地接收和管理私钥。 若要避免服务中断,可能需要提醒客户在证书过期之前续订证书。
多个 Azure 服务支持自动管理自定义域的证书。 例如,Azure Front Door 和应用服务为自定义域提供证书,它们会自动处理续订过程。 此功能减轻了操作团队管理证书的负担。 但是,你仍然需要考虑所有权和授权。 确认 CAA 记录已到位并正确配置。 此外,请确保客户的域允许由平台管理的证书。
供稿人
Microsoft维护本文。 以下参与者撰写了本文。
主要作者:
- John Downs |Azure 模式和做法的主要软件工程师
其他参与者:
- 丹尼尔·斯科特-伦斯福德 |合作伙伴技术策略师
- 阿森·弗拉基米尔斯基 | 客户首席工程师,FastTrack for Azure
若要查看非公开的LinkedIn个人资料,请登录LinkedIn。
后续步骤
许多服务使用 Azure Front Door 来管理域名。 有关详细信息,请参阅在多租户解决方案中使用 Azure Front Door。