练习 - 限制网络访问
用户连接到你的应用服务器以输入订单、更新帐户并执行类似活动。 应用服务器反过来用这些更改来更新数据库。 用户的个人数据存储在数据库中,所以务必确保只允许来自可信和必要资源的访问。 有多种方法来控制通过网络访问 SQL 数据库。
防火墙规则
Azure SQL 数据库具有内置防火墙,用于允许和拒绝对数据库服务器本身以及各个数据库的网络访问。 最初,SQL 数据库防火墙会阻止对 Azure SQL 数据库的所有公共访问。 必须指定一个或多个允许访问 Azure SQL 数据库的服务器级别 IP 防火墙规则,才能访问数据库服务器。 使用 IP 防火墙规则可以指定允许的 Internet IP 地址范围,以及 Azure 应用程序能否尝试连接到 Azure SQL 数据库。
在服务器或数据库级别配置防火墙规则。 这些规则具体说明了允许哪些网络资源与数据库建立连接。 可以根据级别应用规则,如下所示:
- 服务器级防火墙规则
- 允许访问 Azure 服务
- IP 地址规则
- 虚拟网络规则
- 数据库级防火墙规则
- IP 地址规则
注意
SQL 数据仓库仅支持服务器级别 IP 防火墙规则,不支持数据库级别 IP 防火墙规则。
下面将更详细地介绍这些的规则的工作原理。
服务器级防火墙规则
这些规则允许客户端访问整个 Azure SQL Server,即同一逻辑服务器内的所有数据库。 可在服务器级别应用三类规则。
允许访问 Azure 服务规则:允许 Azure 中的服务连接到 Azure SQL 数据库。 启用后,此设置允许来自所有 Azure 公共 IP 地址的通信。 此通信包括所有 Azure 平台即服务 (PaaS) 服务(例如 Azure 应用服务和 Azure 容器服务)以及具有出站 Internet 访问权限的 Azure VM。 此规则可以通过门户防火墙窗格中的“启用/禁用”选项配置,也可以通过将 0.0.0.0 作为起始和结束 IP 地址的 IP 规则配置。
Azure 中具有在 PaaS 服务(例如 Azure 逻辑应用或 Azure Functions)中运行、需要访问 Azure SQL 数据库的应用程序时,使用此规则。 许多这样的服务没有静态 IP 地址,因此此规则可确保它们能够连接到数据库。
重要
该选项将防火墙配置为允许来自 Azure 的所有连接,包括来自其他客户的订阅的连接。 选择该选项时,请确保登录名和用户权限将访问限制为仅允许授权用户访问。
IP 地址规则是基于特定公共 IP 地址范围的规则。 允许从受允许的公共 IP 地址范围进行 IP 地址连接,以便连接到数据库。
具有需要连接到数据库的静态公共 IP 地址时可以使用此规则。
虚拟网络规则使你能够显式允许来自一个或多个 Azure 虚拟网络内指定子网的连接。 虚拟网络规则可以提供对数据库更大的访问控制,可以是首选的规则。 Azure 虚拟网络地址空间是专用空间,因此你可以有效地避免公开公共 IP 地址,并确保与控制的地址的安全连接。
有需要访问数据库的 Azure VM 时使用虚拟网络规则。
对于服务器级规则,可以通过门户、PowerShell、CLI 和 Transact-SQL (T-SQL) 创建和操作上述所有规则。
数据库级防火墙规则
这些规则允许访问逻辑服务器上的各个数据库,它们存储在数据库中。 对于数据库级规则,仅可配置 IP 地址规则。 它们的作用与在服务器级别应用时相同,但仅限于数据库。
数据库级规则的优点在于其可移植性。 将数据库复制到另一个服务器时,将复制数据库级规则,因为它们存储在数据库中。
数据库级规则的缺点是,只能使用 IP 地址规则。 这些规则可能会限制灵活性并增加管理开销。
只能通过 T-SQL 创建和操作数据库级防火墙规则。
在实践中限制网络访问
最佳做法是使用数据库级别 IP 防火墙规则来增强安全性,并提高数据库的可移植性。 若有多个数据库具有相同的访问要求,且不希望花时间来分别配置每个数据库,请使用面向管理员的服务器级别 IP 防火墙规则。
让我们来看看这些规则的实际工作情况,以及如何将网络访问限制为只允许访问必要内容,从而确保安全性。 回想一下,你创建了一个 Azure SQL 数据库逻辑服务器、一个数据库以及充当应用程序服务器的 appServer Linux VM。 数据库迁移到 Azure SQL 数据库并且虚拟网络内的资源需要访问它时,通常会出现这种情况。 可以在许多情况下使用 Azure SQL 数据库的防火墙功能,但此示例具有实际的适应性,演示了每个规则的工作原理。
看一看防火墙设置,了解它们的工作原理。 在这些练习中将同时用到门户和 Cloud Shell。
你创建的数据库当前不允许来自任何连接的访问。 这种受限的访问权限是根据你为创建逻辑服务器和数据库运行的命令而设计的。 确认没有访问权限。
在 Cloud Shell 中,如果尚未连接,请通过 SSH 连接到 Linux VM。 将
nnn.nnn.nnn.nnn
替换为上一单元中publicIpAddress
中的值。ssh nnn.nnn.nnn.nnn
重新运行之前检索到的
sqlcmd
命令以尝试连接到数据库。 将[server-name]
替换为服务器的名称。 使用你在上一个单元中指定的ADMINUSER
凭据替换[username]
和[password]
。 保留用户名和密码周围的单引号,使 shell 不会错误地解释特殊字符。sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
尝试连接时,应会看到类似于以下输出的错误。 禁止对数据库的任何访问,所以此输出是意料之中的。
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired. Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2AF9. Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible.Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.
授予访问权限,以便可以连接。
使用服务器级别的允许访问 Azure 服务规则
你的 VM 具有出站 Internet 访问权限,因此可以使用“允许访问 Azure 服务”规则允许从 VM 进行访问。
使用激活沙盒时所用的同一帐户登录到 Azure 门户。
在顶部的“搜索资源、服务和文档”框中,搜索数据库服务器名称
server-name
。 选择 SQL Server。在 SQL Server 窗格中,从左侧菜单窗格的“安全”下,选择“网络”。
向下滚动到“例外”,选择“允许 Azure 服务和资源访问此服务器”复选框,然后选择“保存”。 等待系统确认此更改。
回到 SSH 会话中,再次尝试连接到数据库。
sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
此时,应该能够连接。 如果成功,会看到 sqlcmd 提示符。
1>
你打开了连接,但此设置目前允许从任何 Azure 资源访问,包括我们订阅范围之外的资源。 进一步限制此访问权限,将网络访问限制到我们控制范围内的资源。
使用数据库级别的 IP 地址规则
回想一下,数据库级 IP 地址规则只允许访问逻辑服务器上的一个数据库。 将在此处使用一个规则,来授予对 appServer VM 的静态 IP 的访问权限。
创建数据库级 IP 规则需要运行一些 T-SQL 命令。 使用以下约定创建数据库规则,并在其中传入规则名称、起始 IP 地址和结束 IP 地址。 将起始和结束 IP 地址指定为同一个地址,可以限制访问一个 IP。 如果有更多地址需要访问,则可以扩展范围。
EXECUTE sp_set_database_firewall_rule N'My Firewall Rule', '40.112.128.214', '40.112.128.214'
当还在 sqlcmd 提示中,运行以下命令。 替换两个位置中 appServer 的公共 IP 地址。
提示
运行如下所示的 T-SQL 命令时,第二行上的
GO
可能不会复制到sqlcmd
提示符。 可能需要键入这个部件。没有它,T-SQL 命令不会运行,因此请确保运行GO
命令。EXECUTE sp_set_database_firewall_rule N'My Firewall Rule', '[From IP Address]', '[To IP Address]'; GO
该命令完成后,输入
exit
退出 sqlcmd。 通过 SSH 重命名连接。在 Azure 门户中 SQL Server 的“网络”窗格上,取消选中“允许 Azure 服务和资源访问此服务器”,然后选择“保存”。 此更改将禁止来自所有 Azure 服务的访问,但因为你拥有数据库级 IP 规则,所以可以连接。
回到 Cloud Shell,在通过 SSH 连接的 VM 中,再次尝试连接到数据库。
sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
此时,应该能够连接。 如果成功,会看到 sqlcmd 提示符。
1>
使用数据库级规则允许将访问特别隔离为访问数据库。 如果你想保持每个数据库的网络访问配置,此规则将非常有用。 如果多个数据库共享相同级别的网络访问,则可以使用服务器级规则将相同的访问权限应用于服务器上的所有数据库,从而简化管理。
使用服务器级 IP 地址规则
数据库级规则是一个不错的选择,但如果 appServer VM 需要在同一个服务器上连接多个数据库,该怎么办? 可以为每个数据库添加一个数据库级规则,但随着我们添加更多的数据库,这可能需要更大的工作量。 允许使用服务器级规则进行访问(该规则将应用于服务器上的所有数据库)可减少你的管理工作。
使用服务器级 IP 规则来限制可以连接的系统。
仍然在 sqlcmd 提示符中运行以下命令,以删除数据库级 IP 地址规则。
EXECUTE sp_delete_database_firewall_rule N'My Firewall Rule'; GO
该命令完成后,输入
exit
退出 sqlcmd。 通过 SSH 重命名连接。返回 Azure 门户,在 SQL Server 的“网络”窗格的“防火墙规则”下,选择“添加防火墙规则”。 将规则命名为“允许 appServer”,为“开始 IP”和“结束 IP”输入 appServer VM 的公共 IP 地址,然后选择“确定”。
选择“保存” 。
回到 Cloud Shell 中,在 appServer VM 上再次尝试连接到数据库。
sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
此时,应该能够连接。 服务器级规则允许基于 appServer VM 的公共 IP 地址进行访问。 如果成功,会看到 sqlcmd 提示符。
1>
输入
exit
退出 sqlcmd。 通过 SSH 重命名连接。
你将连接隔离为仅规则中指定的 IP 地址。 这种隔离很有效,但当你添加更多需要连接的系统时,这仍然难以管理。 此外,还需要来自定义的 IP 地址范围的静态 IP 或 IP。
如果 IP 地址是动态的,并且发生了更改,则必须更新规则才能确保连接。 appServer VM 当前配置了动态 IP 地址。 此 IP 地址可能会在某些时候发生更改,一旦发生,访问就会中断。 现在,看一看虚拟网络规则对配置的益处。
使用服务器级虚拟网络规则
在这种情况下,VM 在 Azure 中运行,可以使用服务器级虚拟网络规则来隔离访问,并使未来的服务能够轻松访问数据库。
返回 Azure 门户,仍在“网络”窗格上,在“虚拟网络”下选择“添加虚拟网络规则”。
将显示“创建/更新虚拟网络规则”对话框。 设置以下值:
设置 值 名称 保留默认值 订阅 Concierge 订阅 虚拟网络 appServerVNET 子网名称/地址前缀 appServerSubnet / 10.0.0.0/24 选择“启用”以启用子网上的服务终结点,然后在启用了终结点后选择“确定”以创建规则。
删除 IP 地址规则。 选择“允许 appServer”规则旁边的“...”,再选择“删除”,然后选择“保存”。
回到 Cloud Shell 中,在 appServer VM 上再次尝试连接到数据库。
sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
此时,应该能够连接。 如果成功,会看到 sqlcmd 提示符。
1>
此处执行的操作有效地删除了对 SQL Server 的任何公共访问权限。 它仅允许从定义的 Azure 虚拟网络中的特定子网进行访问。 如果在该子网中添加更多应用服务器,则无需进行额外的配置。 该子网中的任何服务器都能够连接到 SQL Server。
这种配置限制了你对控制范围以外的服务的接触,如果要增加更多的服务器,也便于管理。 这种方法在保护对 Azure SQL 数据库的网络访问方面非常有效。