您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn.

限制服务间通信

Azure
Azure Active Directory
应用服务

此示例方案限制了应用程序层和网络层上两个 Azure 后端服务之间的通信。 通信只能在明确允许的服务之间流动,遵守 最低权限原则。 此示例使用 Azure App Service 来托管服务,但你可以对 Azure Functions 应用使用类似的技术。

基于仔细规划、 威胁建模安全开发生命周期,服务间通信限制仅是总体安全策略的一部分。 整体安全规划应纳入业务、合规性、法规和其他非功能性要求。 例如,虽然当前方案侧重于网络限制,但许多组织现在采用了一种假定被破坏的 零信任安全模型 ,因此网络层具有辅助性。

体系结构

显示两个 Azure App Service 后端服务之间的网络层和应用层通信限制的关系图。

在网络层步骤1中,服务 A 使用客户端凭据来请求和接收来自 Azure Active Directory 的服务 B 的 OAuth 2.0 令牌。 在步骤2中,服务 A 将令牌注入到服务 B 的通信请求。在第3步中,服务 B 计算访问令牌的 aud 声明,并验证令牌。 在应用程序层中,服务 A 位于虚拟网络的集成子网中。 在步骤1中,服务 A 使用应用服务区域 VNet 集成,以仅从其集成子网中的专用 IP 地址进行通信。 在步骤2中,服务 B 使用服务终结点仅接受来自服务中的 IP 地址(集成子网)的通信。

此关系图显示了从服务 A 到服务 B 的受限通信。基于令牌的授权限制了应用程序层上的访问,服务终结点限制了网络层上的访问权限。

基于令牌的授权

Microsoft 身份验证库) ( 的 OIDC) 兼容的库(如 Microsoft 身份验证库)支持此基于令牌的客户端凭据流 (。 有关详细信息,请参阅应用 场景:用于调用 Web api 的后台应用程序后台方案的示例应用程序

  1. 服务 A 和服务 B 在 Azure AD 中注册。 服务 A 拥有共享机密或证书形式的客户端凭据。
  2. 服务 A 可以使用自己的客户端凭据来请求服务 B 的访问令牌。
  3. Azure AD 提供了一个具有服务 B 受众或 aud 声明的访问令牌。
  4. 服务 A 根据 OAuth 2.0 持有者令牌使用规范,将令牌作为请求的 HTTP 授权标头中的 持有者令牌 注入到服务 B 的请求。
  5. 服务 B 验证令牌 ,以确保 aud 声明与服务 B 应用程序匹配。

服务 B 使用以下方法之一来确保只有专门允许的客户端在这种情况下可以访问:

  • 验证令牌 appid 声明。 服务 B 可以验证令牌 appid 声明,该声明标识哪个 Azure AD 注册的应用程序请求了该令牌。 服务 B 针对已知的访问控制调用方列表显式检查声明。

  • 检查令牌中的角色。 同样,服务 B 可以检查传入令牌中是否存在特定的 角色 声明,以确保服务 a 具有显式访问权限。

  • 需要用户分配。 或者,服务 B 所有者或管理员可以将 Azure AD 配置为要求 用户分配,因此只有对服务 b 应用程序具有显式权限的应用程序才能获取服务 b 的令牌。除非业务逻辑要求,否则服务 b 不需要检查特定角色。

    若要设置用户分配要求以访问服务 B:

    1. 在 Azure AD 中,对服务 B 启用用户分配
    2. 公开服务 A 上至少有一个可请求权限的应用程序角色。 此角色的 AllowedMemberTypes 必须包含 Application
    3. 向公开的服务 B 角色请求服务 A 的应用权限
      1. 从服务的 " API 权限 " 部分,选择 " 添加权限",然后从列表中选择 "服务 B" 应用程序。
      2. 在 " 请求 API 权限 " 屏幕上,选择 " 应用程序权限",因为在没有登录用户的情况下运行后端应用程序。 选择公开的服务 B 角色,然后选择 " 添加权限"。
    4. 向管理员授予对应用程序权限请求的管理员许可。 只有服务 B 的所有者或管理员才能同意该服务的权限请求。

服务终结点

体系结构关系图的下半部分显示了如何限制网络层上的服务间通信:

  1. 服务 web 应用使用 区域 VNet 集成 通过集成子网 ip 范围内的专用 IP 地址来路由所有出站通信。
  2. 服务 B 的 服务终结点 仅允许从服务 B 的集成子网中的 web 应用进行入站通信。

有关详细信息,请参阅 设置 Azure App Service 访问限制

组件

此方案使用以下 Azure 服务:

  • Azure App Service 托管服务 A 和服务 B,允许自动缩放和高可用性,而无需管理基础结构。
  • Azure AD 是一种基于云的标识和访问管理服务,可对服务进行身份验证并启用基于 OAuth 2.0 令牌的授权。
  • Azure 虚拟网络 是 azure 中专用网络的基本构建基块。 Azure 虚拟网络可将 Azure 虚拟机等资源 (Vm) 安全地相互通信、internet 和本地网络。
  • Azure 服务终结点 通过 azure 主干网络上的优化路由,提供与 azure 服务的安全直接连接,只允许从集成子网中的专用源 ip 范围进行访问。
  • (MSAL) 的 Microsoft 身份验证库 是一个与 OIDC 兼容的库,它允许服务使用客户端凭据流从 Azure AD 中提取访问令牌。

备选方法

示例方案有几个替代方法。

托管标识

服务 A 可以使用 托管标识 来提取访问令牌,而不是使用 Azure AD 注册为应用程序。 托管标识使操作员不必为应用注册管理凭据。

托管标识允许服务获取令牌,而不提供 Azure AD 的应用注册。 对于其他服务,若要为服务 A 自身请求访问令牌,服务 A 仍需要 Azure AD 的应用注册。

不能通过 Azure 门户将托管标识分配给应用程序角色,只能通过 Azure PowerShell 命令行。 有关详细信息,请参阅 使用 PowerShell 向应用程序角色分配托管标识访问权限

Azure Functions

可以在 Azure Functions 而不是应用服务中承载服务。 要使用区域 VNet 集成限制网络层上的访问,需要在应用服务计划或高级计划中托管函数应用。 有关详细信息,请参阅 Azure Functions 网络选项

应用服务内置身份验证和授权

按照设计,此方案通过在应用程序代码中执行令牌验证,将授权代码与业务逻辑的其余部分将。 应用服务内置身份验证和授权,或者简单身份验证,还可以在向服务发送请求之前执行基本令牌验证。 然后,该服务依赖于托管基础结构来拒绝未经授权的请求。

若要配置应用服务身份验证和授权,请将授权行为设置为 登录 Azure Active Directory。 此设置验证令牌并仅限制对有效令牌的访问。

使用 Easy Auth 的缺点是,如果服务在其他位置移动,则会丢失身份验证和授权保护。 尽管应用服务身份验证和授权适用于简单方案,但复杂的授权要求应在应用程序代码中使用逻辑。

服务终结点与专用终结点

此方案使用服务终结点而不是 私有终结点,因为只有服务终结点允许从给定子网限制对 web 应用的访问。 不支持通过网络安全组 (Nsg) 或使用应用服务访问限制来筛选专用终结点上的入站流量。 网络线路可见的每个服务都可以与 web 应用程序的专用终结点通信。 这限制了用于锁定网络层上的流量的专用终结点有用性。

注意事项

  • 应用服务区域 VNet 集成为每个应用服务计划提供一个集成子网。 同一计划中的所有 web 应用都与同一子网集成,并共享同一组专用出站 IP 地址。 接收服务不能区分流量来源于哪个 web 应用。 如果需要确定源 web 应用,则必须在单独的应用服务计划中部署 web 应用,每个计划都有自己的集成子网。

  • 应用服务计划中的每个辅助角色实例都在集成子网中占用单独的专用 IP 地址。 若要规划规模,请确保集成子网足够大,能够容纳所需的规模。

定价

此方案的定价取决于具体的基础结构和要求。 Azure AD 最多可免费获得高级级别,具体取决于需要。 Azure App Service 或其他主机的成本因具体的规模和安全要求而异,如 其他方法注意事项中所述。

若要计算方案的成本,请参阅 Azure 定价计算器

后续步骤