最近我们发布了一份《Windows网络安全白皮书》(单击此处下载),文中深入说明了客户可以如何利用该平台的本地功能,为他们的信息资产提供最好的保护。
由首席顾问Walter
Myers撰写的这篇文章从这份白皮书展开,说明了如何在网络级别隔离虚拟网络中的虚拟机。
简介
应用程序隔离是企业环境中的一个重要问题,因为企业客户需要保护多种环境,防止这些环境被未授权或无关人员访问。这包括经典的前端和后端场景:特定后端网络或子网络中的虚拟机可能只允许根据
IP 地址白名单,让特定客户端或其他计算机连接到特定的端点。不论客户端应用程序是从 Internet、Azure环境还是通过
VPN连接从内部访问虚拟机应用程序服务器,这些场景都可以在 Windows Azure中快速实施。
虚拟机隔离选项
本文将讨论 Windows Azure平台上可以实施虚拟机隔离的三个基本选项:
1.隔离部署到单一虚拟网络的虚拟机
2.隔离部署到不同虚拟网络的虚拟机
3.隔离部署到不同虚拟网络的虚拟机且这些虚拟网络都已经建立可以连接到企业内部的VPN
下文的段落中将详细叙述这些选项。
默认情况下,通过库创建的 WindowsServer虚拟机将有两个公共端点,即
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-testvm1和canis-testvm2。
在下面的屏幕截图中,我们可以看到两台前端虚拟机canis-testvm1和canis-testvm2加入了名为testvirtualnetwork的虚拟网络,位于FrontEnd子网中。
下面是一张后端SQL Server虚拟机sql12-01的屏幕截图,这个虚拟机加入了名为waltervirtualnetwork的虚拟网络,在其BackEndSubnet子网中。
现在我们需要配置 SQLServer虚拟机的访问权限。从下图可以看到,我执行的第一个操作是将
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 ip192.168.1.0 255.255.255.0 10.4.0.0 255.255.0.0
access-list AzureAccess extended permit ip10.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 ip192.168.1.0 255.255.255.0 10.5.0.0 255.255.0.0
access-list AzureAccess2 extended permit ip10.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 staticVPN_OUT_AZ1 VPN_OUT_AZ1 destination static VPN_OUT_AZ2 VPN_OUT_AZ2 no-proxy-arproute-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
防火墙,选择 InboundRules(入站规则)节点,然后创建新的规则,如下所示。
随即可以选择要通过
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. 打开
DomainProfile(域配置文件)。
2. 配置通过
IPsec保护 SCOM监控端口
5723。(这样我将能够监控计算机,并通过内部部署 SCOM
安装将此 GPO安全地应用到外部
IP地址。)
下面,我已经展开了Computer Configuration(计算机配置)|Policies(策略)|Windows
Settings(Windows设置)树,并已导航到Windows
Firewall with Advanced Security(高级安全 Windows防火墙)节点。然后,选择
WindowsFirewall 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防火墙。另外,我们看到一则通知指示防火墙状态确实已经应用组策略设置(在本示例中,是指域配置文件)。
现在,如果我们选择 InboundRules(入站规则)站点,那么可以验证是否已对端口
5723 应用 IPSec入站规则,如下所示。
限制虚拟机的出站Internet连接
出于某些显而易见的原因,企业客户通常会限制服务器的出站
Internet访问,在公司外部共享时尤其要注意包含中高业务影响的敏感数据的后端服务器。在公有云中,由于企业客户对云提供商寄予厚望,甚至希望云平台的安全控制力度相较于内部部署技术不存在丝毫逊色,因此这个问题会更加突出。幸运的是,正如我们刚刚看到的,Windows
Azure 虚拟机及 PaaS计算机可以加入域并已应用组策略,企业客户不仅可以运用熟悉的技术保护其服务器,而且还能防止服务器本身共享敏感信息。在本演练中,我将会演示如何限制虚拟机的出站
Internet连接。本例中我将不使用组策略,而是通过跟以上 IPsec示例相同的方式进行应用。
首先,我们从上一部分使用的
SQLServer 虚拟机开始,如下所示。我们已经启动了高级安全 Windows防火墙,与之前应用组策略后的场景相同。
此计算机当前可以访问Internet,而且也可以通过SQL
Server Management Studio 访问另一个内部部署 SQL Server。我们希望对该虚拟机进行限制,使其只能访问内部部署子网192.168.1.0/24(参见VPN配置的定义)。我右键单击*节点打开了属性页,发现默认情况下允许出站连接,如下所示。
将此设置更改为Block(阻止),如下所示。
现在,我将无法访问内部部署SQL
Server 和Internet,如下所示。
现在,单击Windows防火墙的Outbound
Rules(出站规则)节点,单击右键并从弹出菜单中选择New Rule…(新建规则…)。在
NewOutbound 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(名称)页面中,我将新规则命名为“OutboundConnections
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 防火墙将协同工作,确保构建出强大的安全方案。
参考
Windows Azure网络安全白皮书:http://download.microsoft.com/download/4/3/9/43902EC9-410E-4875-8800-0788BE146A3D/Windows%20Azure%20Network%20Security%20Whitepaper%20-%20FINAL.docx
关于网络访问控制列表 (ACL):http://msdn.microsoft.com/en-us/library/windowsazure/dn376541.aspx
如何将端点设置为虚拟机:http://www.windowsazure.com/en-us/manage/windows/how-to-guides/setup-endpoints/
Windows Azure Powershell的网络访问控制列表功能:http://michaelwasham.com/windows-azure-powershell-reference-guide/network-access-control-list-capability-in-windows-azure-powershell/
在Windows Azure虚拟机上设置端点ACL:http://convective.wordpress.com/2013/06/08/setting-an-endpoint-acl-on-a-windows-azure-vm/
在Windows Server 2012中使用IKEv2保护端到端IPsec连接安全:http://technet.microsoft.com/en-us/library/hh831807.aspx#BKMK_Step2
循序渐进指南:部署Windows防火墙和IPsec策略:http://technet.microsoft.com/zh-cn/library/deploy-ipsec-firewall-policies-step-by-step(v=ws.10).aspx
具有Windows PowerShell高级安全管理功能的Windows防火墙:http://technet.microsoft.com/zh-cn/library/hh831755.aspx
Windows Azure数据中心IP范围:http://msdn.microsoft.com/en-us/library/windowsazure/dn175718.aspx
Ashwin Palekar
Windows Azure网络团队
本文翻译自: