Windows Azure 虚拟网络中虚拟机的网络隔离选项

最近我们发布了一份《Windows 网络安全白皮书》(单击此处下载),文中深入说明了客户可以如何利用该平台的本地功能,为他们的信息资产提供最好的保护。

由首席顾问 Walter Myers 撰写的这篇文章从这份白皮书展开,说明了如何在网络级别隔离虚拟网络中的虚拟机。

简介

应用程序隔离是企业环境中的一个重要问题,因为企业客户需要保护多种环境,防止这些环境被未授权或无关人员访问。这包括经典的前端和后端场景:特定后端网络或子网络中的虚拟机可能只允许根据 IP 地址白名单,让特定客户端或其他计算机连接到特定的端点。不论客户端应用程序是从 Internet、Azure 环境还是通过 VPN 连接从内部访问虚拟机应用程序服务器,这些场景都可以在 Windows Azure 中快速实施。

虚拟机隔离选项

本文将讨论 Windows Azure 平台上可以实施虚拟机隔离的三个基本选项:

1. 隔离部署到单一虚拟网络的虚拟机

2. 隔离部署到不同虚拟网络的虚拟机

3. 隔离部署到不同虚拟网络的虚拟机且这些虚拟网络都已经建立可以连接到企业内部的VPN

下文的段落中将详细叙述这些选项。

默认情况下,通过库创建的 Windows Server 虚拟机将有两个公共端点,即 RDP 和远程 PowerShell 连接。除了由管理员添加的额外端点,没有其他公共端点。在任何一台给定的 IaaS 虚拟机上,这些端点和其他由管理员创建的端点可以通过访问控制列表 (ACL) 进行保护。截止本文写作时,IaaS 虚拟机提供 ACL,但 PaaS web role 和 worker role 不提供 ACL。

网络 ACL 的工作方式

ACL 是一个包含了规则列表的对象。当您创建 ACL 并将其应用于虚拟机端点时,将在虚拟机的主机节点上进行数据包筛选。这意味着来自远程 IP 地址的流量将由主机节点而不是由虚拟机进行筛选,以匹配 ACL 规则。这就可以防止虚拟机将宝贵的 CPU 周期用在数据包筛选上。

虚拟机创建完成后,默认 ACL 将准备就绪,阻止所有传入流量。但是,如果创建了输入端点(例如,端口 3389),默认的 ACL 将被修改,以允许该端点的所有入站流量。如上文中所述,通过 Azure 库创建虚拟机时,系统将使用标准内部端口以及随机生成的公共端口来创建 PowerShell 端点和 RDP 端点,如以下门户所示。这之后,来自任何远程子网的入站流量将被限制在这些端点上,无需配置防火墙。所有用于入站流量的其他端口都将被阻止,除非为这些端口创建端点。默认情况下允许出站流量。

使用网络 ACL,您可以实现以下操作:

  • 根据远程子网 IPv4 地址范围,选择性允许或拒绝到虚拟机输入端点的传入流量。
  • 创建 IP 地址黑名单
  • 在每个虚拟机端点上创建多个规则
  • 在每个虚拟机端点指定多达 50 个 ACL 规则
  • 按顺序制定规则,确保将正确的规则集应用到给定的虚拟机端点上(从低到高)
  • 为特定的远程子网
    IPv4 地址指定
    ACL。

因此,网络 ACL 是保护虚拟机公共端点、控制此类访问的关键。当前,您可以为 IaaS 虚拟机输入端点指定网络 ACL,从而控制互联网对每个虚拟机的访问。除非您指定端点,否则虚拟网络中的虚拟机不会获得传入流量,这相当于在网络级别上默认设置了拒绝 访问的ACL,您可以对单独的虚拟机重写该规则。您现在还不能在虚拟机网络中的一个特定子网上指定 ACL,我们正在计划将来推出这一功能。

选项 1 :单一虚拟网络中的子网

当前,Windows Azure 可以提供单一虚拟网络中子网之间的路由功能,但无法提供与内部 DIP 地址相关的任何类型的网络 ACL 功能。因此,为了限制单一虚拟网络中对虚拟机的访问,这些虚拟机必须使用“高级安全 Windows 防火墙”,简单示意图如下。

为了保护服务器,可以将 Windows 防火墙配置为阻止所有入站连接,然后创建入站规则以确定:

1)  哪些本地端口将接受连接

2)  来自哪些远程端口的连接将被接受

3)  哪些远程 IP 地址将被接受

4)  哪些被授权的用户可以进行连接

5)  哪些被授权的计算机可以进行连接

在这种情况下,防火墙例外情况包括其自身子网内及为该虚拟网络配置的其他子网之间的本地动态 IP (DIP) 地址。任何公共端点将通过网络 ACL 进行保护。当然,防火墙例外情况应包括使用网络 ACL 建立的公共端点的内部端口。

选项 2 :不同虚拟网络中的子网

为了保护虚拟机,使其不受其他 Azure 虚拟网络中部署的其他虚拟机、与虚拟网络不相关的其他 Azure 云服务中的虚拟机以及非 Windows Azure 平台虚拟机的影响,将使用 Windows Azure 网络 ACL 功能为虚拟机提供访问控制。这是 Windows Azure 中最自然的应用程序隔离场景,因为默认情况下虚拟机上允许访问的只有默认提供的 RDP 和远程
PowerShell 公共端点。如果任何一台 Azure 虚拟机(PaaS 或 IaaS)想要访问不同虚拟网络中的另一台虚拟机,这台虚拟机的虚拟 IP (VIP) 地址 ( 而不是它在单一虚拟网络中的 DIP 地址 ) 将被用于比对。因此,如果在给定的虚拟机端点上设置了允许 ACL,该 ACL 将考虑使用那些需要进行连接的虚拟机的公共 VIP做比对。我们可以在下图中看到这种情况。

我们可以通过创建指定“permit”或“deny”的规则,选择性地允许或拒绝虚拟机输入端点的网络流量(通过管理门户或 PowerShell)。默认情况下,创建一个端点后,将允许所有流量访问该端点。正因为如此,必须明白如何创建允许/拒绝规则并按适当的优先顺序排列这些规则,以获得对允许连接该虚拟机端点的网络流量的精确控制。请注意,默认情况下,一旦您添加一个或多个“permit”范围,您将立即拒绝其他所有范围。从第一个允许范围传入的数据包中,只有来自允许的 IP 范围的数据包才能与虚拟机端点通信。

现在,让我们通过一个示例来看下这是如何工作的,这个示例中,有两台使用相同云服务的前端虚拟机和一台使用 SQL Server 的后端虚拟机。我们想要保护 SQL Server,所以只有这两台前端虚拟机可以获得访问权限。在下面的屏幕截图中,我们可以看到一个名为 canis-testvms 的云服务,公共 VIP 地址是 168.62.207.83,这个云服务包含了我们的两台前端虚拟机,名称分别为 canis-testvm1canis-testvm2

在下面的屏幕截图中,我们可以看到两台前端虚拟机 canis-testvm1canis-testvm2 加入了名为 testvirtualnetwork 的虚拟网络,位于 FrontEnd 子网中。

下面是一张后端 SQL Server 虚拟机 sql12-01 的屏幕截图,这个虚拟机加入了名为 waltervirtualnetwork 的虚拟网络,在其 BackEndSubnet 子网中。

现在我们需要配置 SQL Server 虚拟机的访问权限。从下图可以看到,我执行的第一个操作是将 14333 作为公共端口为内部端口 1433 建立公共端点。如上文中所述,默认 ACL 将允许任何远程地址访问该端点,因此我们需要用网络 ACL 对此进行修改。

接下来,我选择底部的 Manage ACL(管理 ACL)按钮,然后会看到 Manage Endpoint ACL(管理端点 ACL)对话框,如下图所示。我添加的第一个 ACL 是,用阻止所有远程地址的“Deny”操作替代默认 ACL。然后,我添加另一个优先顺序较高的 ACL,指定包含前端虚拟机的云服务的 VIP 地址。我用 /32 网络 (168.62.207.83/32) 以 CIDR 格式输入这个规则,它可以映射到前端虚拟机的云服务显示的单个 IP 地址。从 SQL Server 角度来看,两个前端客户端都有 168.62.207.83 这个 IP 地址,该地址会在云服务中进行 NAT。

以上就是使用公共 VIP 地址在不需要 VPN 连接的情况下跨虚拟网络对端点进行保护的方法。如果您有 VPN 连接,但不想通过本地路由器传送以利用 DIP 地址,也可以使用该方法。我们将在下一个添加了 VPN 的选项中讨论 DIP。

选项 3 :不同虚拟网络中的子网 + VPN

如果涉及到 VPN 连接,VPN 连接将不会更改虚拟网络的默认隔离情况,但可以为网络连接提供额外的选项。这里我们将看一个与此相关的具体示例。在该场景下,如果没有被防火墙规则阻止,参与多个虚拟网络的本地子网将通过 DIP 地址获得对两个虚拟网络中虚拟机的全部访问权限。因此在我们的这个场景中,我们有两个需要访问彼此地址空间的虚拟网络, 他们使用同一个本地终端位置。该目标的实现方法是,将本地路由器配置为“spoke-to-spoke”配置中的中心。路由器是中心,“spokes”是在 Azure 一侧终止站点到站点连接的 VPN 设备。

为了完成spoke-to-spoke的配置工作,我们首先需要配置本地网络并使其与 Azure 端网关的给定虚拟网络相对应,这样该虚拟网络即可访问任何其他虚拟网络的地址空间(当然,应该是另一个不同的地址空间)。请参见下图所示的管理门户的本地网络配置。我已经为每个本地网络配置了内部部署的 192.168.1.0/24 本地网络地址空间,每个虚拟网络均需访问本地网络地址空间,另外还为每个虚拟网络添加了一个额外的地址空间,并使其对应于需要访问的另一个虚拟网络。

接下来,我们需要配置内部部署 VPN 设备(我使用的是 Cisco ASA 5505),从根本上来说这是指将访问列表从一个虚拟网络添加到另一个虚拟网络的现有访问列表。例如,如果本地内部部署网络包含 192.168.1.0/24 地址空间,且其中一个虚拟网络具有 10.5.0.0/16 地址空间,那么我们将需要一个从本地网络到虚拟网络的访问列表条目(通常事先已经设置),另外还需要一个从 10.5.0.0/16 虚拟网络到 10.4.0.0/16 虚拟网络的访问列表条目,如下所示。

access-list AzureAccess extended permit ip
192.168.1.0 255.255.255.0 10.4.0.0 255.255.0.0

access-list AzureAccess extended permit ip
10.5.0.0 255.255.0.0 10.4.0.0 255.255.0.0

接着,我们将对 10.5.0.0/16 虚拟网络执行相同的操作(如下所示),创建一个从 10.4.0.0/16 虚拟网络到 10.5.0.0/16 网络的访问列表条目。

access-list AzureAccess2 extended permit ip 192.168.1.0 255.255.255.0 10.5.0.0 255.255.0.0

access-list AzureAccess2 extended permit ip
10.4.0.0 255.255.0.0 10.5.0.0 255.255.0.0

下一步是在这两个“外部”网络之间设置 NAT,如下所示。

object-group network VPN_OUT_AZ1

network-object 10.4.0.0 255.255.0.0

object-group network VPN_OUT_AZ2

 network-object 10.5.0.0 255.255.0.0

nat (outside,outside) 1 source static VPN_OUT_AZ1 VPN_OUT_AZ1 destination static VPN_OUT_AZ2 VPN_OUT_AZ2 no-proxy-arp route-lookup

如此一来,每个虚拟网络均可使用 DIP 地址通过 VPN 网关访问另一个网络(现在相当于前面的单一虚拟网络中的子网场景),前提是假设未设置任何防火墙规则加以阻止。这项方案对于某些场景而言可能并不理想,因为网络流量将通过中心来回传输,这会提高事务处理成本并额外增加延迟,但对于不希望暴露任何外部端点的组织来说,这不失为一种可接受的折中方式。其他组织可能更倾向于使用公共端点连接两个(或更多)虚拟网络,并且可能运用 IPsec 和组策略对象进一步保护公共端点的安全。

通过 Windows 防火墙 /IPsec 保护端到端网络通信安全

与 IPsec 集成后,高级安全 Windows 防火墙为开展通过身份验证的端到端网络通信创造了便利条件。它可以对受信任的网络资源实施可伸缩式分层访问,这不仅有助于保护数据完整性,而且还能有选择地帮助保护数据机密性。Internet 协议安全性 (IPsec) 运用加密安全服务保护通过 Internet 协议 (IP) 网络传输的通信。

 举例来说,下图中包含两个虚拟网络,我们可以看出 DIP 地址为 10.5.1.5 的计算机加入了内部部署域[DX1] ,它有一张IPsec证书, 可通过高级安全 Windows 防火墙或 PowerShell 配置 以保护该计算机。这意味着,如果计算机要访问受保护端口,还需要同时安装 IPsec 证书。另外,我们还有两个加入域的计算机 - 10.4.1.6 和 10.5.1.4,可将它们配置为需要通过 Windows 防火墙、PowerShell 脚本或组策略进行 IPsec 连接。这样一来,无论这些计算机是通过内部 DIP 地址还是通过公共 VIP 地址进行访问,都可以受到全面保护。对于公共 VIP 地址,我们将利用网络 ACL 功能来创建针对允许的外部 IP 地址的白名单,此时这些外部客户端计算机将需要具备 IPsec 证书。

对单个虚拟机手动应用 IPsec

为对虚拟网络中的虚拟机提供最佳保护,首先可以激活并配置 Windows 防火墙阻止所有入站连接。然后可以根据需要开放端口,同时添加 IPsec 以便执行安全连接并对这些连接进行加密。要在 Windows Server 2008 及更高版本中手动配置 IPsec,将需要启动 Windows 防火墙,选择 Inbound
Rules(入站规则)节点,然后创建新的规则,如下所示。

随即可以选择要通过 IPsec 实施保护的特定端口,如下所示。

 

接下来,您需要指定要保护所需端口的连接。

选择 Customize…(自定义…)按钮后,可以在出现的对话框中指定 IPsec 设置,如下所示。现在,您可以继续完成该向导并在最后为规则命名。

如果希望使用 PowerShell 编写 IPsec 配置脚本,请单击此处的链接了解详细信息。

使用域中的组策略为虚拟机设置 IPsec 策略

在虚拟网络通过 VPN 连接与内部部署网络相连的情况下,虚拟网络中的计算机可以加入内部部署域。如果已经加入内部部署域,那么可以通过 IPsec 策略应用组策略来配置多台计算机,从而确保基于组织策略保护这些计算机。您可以在此处了解有关使用组策略创建 IPsec 策略的详细信息,接下来我们将演示此过程。

在域控制器中,我希望对 Windows Azure 中已加入域的服务器应用特定策略,因此首先需要将这些计算机加入其各自的 OU(名为 Azure Servers),如下所示。在此演示中,我们将使用名为 canis-sql12-01 的虚拟机。

以下是虚拟机 canis-sql12-01 的当前防火墙状态。

返回至域控制器,从 Administrative Tools(管理工具)菜单中启动组策略管理控制台。这时展开域 canisnetworks.com,选择 Group Policy Objects(组策略对象)节点,然后右键单击该节点。接着选择 New(新建)菜单项,如下所示。

在 New GPO(新建 GPO)对话框中,为新 GPO 提供一个描述性名称,然后选择 OK(确定)按钮。

我的 GPO 现已添加到 GPO 对象列表,因此现在我需要对它进行配置,右键单击并选择 Edit(编辑)菜单项,如下所示。

这时将显示 Group Policy Management Editor(组策略管理编辑器)。

我将会添加两个 GPO,如下所示:

  1. 打开 Domain Profile(域配置文件)。
  2. 配置通过 IPsec 保护 SCOM 监控端口 5723。(这样我将能够监控计算机,并通过内部部署 SCOM 安装将此 GPO 安全地应用到外部 IP 地址。)

下面,我已经展开了 Computer Configuration(计算机配置)| Policies(策略)| Windows Settings(Windows 设置)树,并已导航到 Windows Firewall with Advanced Security(高级安全 Windows 防火墙)节点。然后,选择 Windows Firewall Properties(Windows 防火墙属性)链接。

在以下对话框中,我将域配置文件的防火墙状态从 Off(关)更改为 On (recommended)(开(推荐))。然后选择 OK(确定)按钮。

下面,我们看到域控制器现已开启 Windows 防火墙。

现在,展开左侧的 Windows Firewall(Windows 防火墙)节点,并选择 Inbound Rules(入站规则)节点,如下所示。当前没有任何规则,因此规则列表为空。

右键单击 Inbound Rules(入站规则)节点,从弹出菜单中选择 New Rule…(新建规则…),如下所示。

在 New Inbound Rule Wizard(新建入站规则向导)中执行与在各计算机上创建规则时相同的手动步骤,以便通过 IPsec 实施端口保护。因此,下面我选择了一项端口规则。

在 Protocol and Ports(协议和端口)向导页中,输入所需的端口。

在 Action(操作)向导页中,选择 Allow the connection if it is secure(只允许安全连接)选项,然后选择 Customize…(自定义…)按钮。

我在选择安全设置的对话框上保留了强制执行身份验证和完整性保护的选项,如下所示。然后选择 OK(确定)按钮。

现在选择 Next(下一步)按钮,继续接受 Users(用户)和 Computers(计算机)向导页的默认值。

在 Profile(配置文件)向导页上,选择 Domain(域)配置文件,如下所示。

最后,为新的入站规则命名,如下所示。

现在我已经完成 GPO 设置,我们会看到新的入站规则现已显示在组策略管理编辑器的入站规则列表中。接着,关闭该编辑器,系统将返回至初始的组策略管理控制台。

现在我们已经设置 GPO,需要将此 GPO 链接到 Azure 服务器 OU。右键单击 Azure Servers OU(Azure 服务器 OU),然后从弹出菜单中选择 Link an Existing GPO…(链接现有GPO…),如下所示。

在 Select GPO(选择 GPO)对话框,继续选择我的新 GPO,然后关闭该对话框。

我们的 GPO 现已与 Azure 服务器 OU 关联,如下所示。

我们将返回到虚拟机 (canis-sql12-01),应用该 GPO,并验证是否已应用 GPO。下面,在命令提示符中输入 gpupdate /force 命令。我们可以在下面看到,策略更新已成功完成。

为了验证是否已应用 GPO,输入 gpresult /r /scope computer 命令,如下所示。您可以看到,经我们验证已经应用 GPO。

下面我们打开 Windows 防火墙,验证两个 GPO 对象是否均在此处显示。从 Windows 防火墙顶级节点中,我们可以验证是否已开启域配置文件的 Windows 防火墙。另外,我们看到一则通知指示防火墙状态确实已经应用组策略设置(在本示例中,是指域配置文件)。

现在,如果我们选择 Inbound Rules(入站规则)站点,那么可以验证是否已对端口 5723 应用 IPSec 入站规则,如下所示。

限制虚拟机的出站
Internet 连接

出于某些显而易见的原因,企业客户通常会限制服务器的出站 Internet 访问,在公司外部共享时尤其要注意包含中高业务影响的敏感数据的后端服务器。在公有云中,由于企业客户对云提供商寄予厚望,甚至希望云平台的安全控制力度相较于内部部署技术不存在丝毫逊色,因此这个问题会更加突出。幸运的是,正如我们刚刚看到的,Windows Azure 虚拟机及 PaaS 计算机可以加入域并已应用组策略,企业客户不仅可以运用熟悉的技术保护其服务器,而且还能防止服务器本身共享敏感信息。在本演练中,我将会演示如何限制虚拟机的出站 Internet 连接。本例中我将不使用组策略,而是通过跟以上 IPsec 示例相同的方式进行应用。

首先,我们从上一部分使用的 SQL Server 虚拟机开始,如下所示。我们已经启动了高级安全 Windows 防火墙,与之前应用组策略后的场景相同。

此计算机当前可以访问 Internet,而且也可以通过 SQL Server Management Studio 访问另一个内部部署 SQL Server。我们希望对该虚拟机进行限制,使其只能访问内部部署子网
192.168.1.0/24(参见 VPN 配置的定义)。我右键单击顶级节点打开了属性页,发现默认情况下允许出站连接,如下所示。

将此设置更改为 Block(阻止),如下所示。

现在,我将无法访问内部部署 SQL Server 和 Internet,如下所示。

现在,单击 Windows 防火墙的 Outbound Rules(出站规则)节点,单击右键并从弹出菜单中选择 New Rule…(新建规则…)。在 New Outbound Rule Wizard(新建出站规则向导)的
Rule Type(规则类型)页面上我选择 Custom(自定义)规则,如下所示。

在 Program(程序)页面上,保留默认设置。

在 Protocol and Ports(协议和端口)页面上,出于我自己的目的,我选择了 TCP 协议,如下所示。

 

接下来,我们将进入 Scope(作用域)页面。将远程 IP 地址选项更改为 These IP addresses:(这些 IP 地址:),然后选择 Add…(添加…)按钮。

在显示的对话框中,我将内部部署子网指定为此虚拟机可以访问的唯一一组 IP 地址,如下所示。

因此,最终的 Scope(作用域)页面将如下所示。

在 Action(操作)页面上,选择 Allow the connection(允许连接)选项。

接下来,我们将进入 Profile(配置文件)页面,出于我自己的目的,在此页面中我仅选择 Domain(域)配置文件。

在最后的 Name(名称)页面中,我将新规则命名为“Outbound Connections to On-Premises Subnet”,如下所示。

出站规则向导完成,现在我看到我的新规则显示在下方。

现在,可以连接到我的内部部署 SQL Server 或者该内部部署子网中的任何其他服务器,但无法连接 Internet,这符合我的预期。

我们已经有效限制此虚拟机访问 Internet。但是,现在我们同样无法访问 Windows Azure 环境中的其他计算机。只需将另一个独立的 IP 地址或 IP 地址范围添加到我们刚刚创建的出站规则即可解决该问题。例如,假设我要在此虚拟机上使用 SQL Server Management Studio 访问 URL 为 pcv94pjwnj.database.windows.net 的 Azure SQL Database 服务器,如下所示。

那么,我只需对该服务器执行 Ping 操作,找到其 IP 地址,如下所示。

然后,我将这个独立 IP 地址添加到我的远程 IP 地址白名单,如下所示。

然后就可以访问该服务器了。

如果要从 Windows Azure 平台指定 IP 地址范围,可以从此处下载 Azure 数据中心 IP 范围列表。有很多范围可供选择,但最好仔细甄别,确保仅添加适用于您实际使用的数据中心的条目。我主要使用美国西部数据中心,但在美国北部还有一些旧数据库服务器,因此在我的示例中,我本已添加以下条目以允许该虚拟机访问整个美国北部。您可以看到,下方突出显示的范围包含我们刚刚添加到出站规则的数据库服务器。

现在一切都已准备妥当,可以锁定虚拟机出站访问。另外请注意,Azure 地址范围会定期更改,因此应该每隔数月检查一次这些范围,或在某个白名单 IP 地址的 Azure 资源突然不再可用时检查地址范围。

结论

在本文中,我们分析了大量 IaaS 虚拟机保护方法。事实上,由于可以将 Windows Azure IaaS 环境实际配置为内部部署网络扩展,您可以充分利用自身熟悉且在 Windows Azure 中增强的现有内部部署安全构造,从而通过运行企业应用程序有效保护部署到 Azure 的虚拟机安全。网络 ACL、虚拟网络和高级安全 Windows 防火墙将协同工作,确保构建出强大的安全方案。

参考

 Ashwin Palekar

Windows Azure 网络团队

 

本文翻译自:

https://blogs.msdn.com/b/windowsazure/archive/2014/03/28/network-isolation-options-for-machines-in-windows-azure-virtual-networks.aspx