如何在 Azure SQL 数据库中将 Function 应用列入白名单
How to whitelist the Function app in Azure SQL Database
我需要配置 Azure SQL Database
防火墙设置,以便它只能被我的 Azure Function
应用程序访问。问题是我是 运行 消费计划中的应用程序,据我所知,即使我不采取任何行动,出站 IP 地址也会发生变化。
有没有办法将应用程序列入白名单,以便保护数据库免受不必要的连接?
我想到了 Azure 区域的白名单,因为所有内容都托管在同一区域,但我如何防范同一区域的其他应用程序?这就是为什么我在考虑使用特定的 IP 地址。我对这种方法唯一担心的是,我不知道其他功能应用程序是否可以与我自己共享相同的出站 IP 地址。
P.S。目前,我的防火墙设置拒绝 public 网络访问并仅允许 Azure 服务连接。
您可以做的一件事是为您的函数分配托管标识。它将从 Azure AD 检索令牌,并将用于连接到 Azure SQL:
if (accessToken != null) {
string connectionString = "Data Source=<AZURE-SQL-SERVERNAME>; Initial Catalog=<DATABASE>;";
SqlConnection conn = new SqlConnection(connectionString);
conn.AccessToken = accessToken;
conn.Open();
}
您可以通过在 SQL Server -INbound Networking 端为函数应用程序和白名单分配静态 IP 并拒绝所有请求来完成此操作。但是您必须将消费计划更改为Appservice才能分配静态IP。
https://docs.microsoft.com/en-us/azure/azure-functions/ip-addresses#dedicated-ip-addresses
此外,您可以尝试为这些服务创建 Vnet 对等互连并阻止其他请求。
虚拟网络在 Azure 上的工作方式与在本地工作的方式不同
如果您创建一个 vnet,将您的 Azure 函数添加到一个子网中,并且在您允许该子网访问的 sql 服务器中,不幸的是无法工作。
如果您可以允许 "public access" and/or "azure resources access" 那么事情就简单了。您使用 sql 凭据登录并具有访问权限。
如果您阻止 public 访问,我不确定您的资源是否能够访问您的数据库,因为您的所有连接都从互联网而不是从您的内部网络转到 SQL 服务器。
对我有用的解决方案是
- 创建虚拟网络
- 为此 vnet 中的 Sql 服务器创建专用终结点(自定义 DNS 记录由 IT-OPS 人员创建)。
- Azure 函数使用此 vnet 的子网。
现在,您可以关闭 public 和数据库中的 azure 资源访问。
您的所有呼叫都将通过您的虚拟网络(不再通过互联网),并且只有使用此 vnet 子网的应用程序才能连接到数据库。
有几种方法可以实现这一点。
您可能想要集成 VNet 或为您的 Azure Functions 获取静态 IP 地址
图片来自:https://docs.microsoft.com/en-us/azure/azure-functions/functions-networking-options
但是,我从您的评论中看到您不想使用高级计划。
我可以建议您实施托管服务身份的最后一件事。
这背后的想法,不是使用连接字符串连接数据库,而是使用您授予的访问令牌连接到数据库。如果您不在同一身份中,则无法获得访问令牌。
本教程介绍了应用服务的总体思路:
https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-connect-msi
本教程几乎涵盖了您真正想要实现的目标。
祝你好运!
我找不到我从哪里得到的答案(所以不是我的答案,而是在这里分享),你的 Azure Functions 有一个 outboundIpAddresses
和 possibleoutboundIpAddresses
的列表,你可以将它们添加到你的Azure SQL 防火墙规则(我的有大约 10 个)。
您可以通过...找到它们
- 转到https://resources.azure.com
- 扩展订阅 -> [扩展您的订阅] -> 提供商 -> Microsoft.Web -> 站点
- 在 JSON 中找到您的 Azure 函数站点,然后找到
outboundIpAddresses
和 possibleoutboundIpAddresses
,它们将包含一个 IP 地址列表。
- 将它们全部添加到您的 SQL 服务器的防火墙中。
虽然我不确定这些是否会改变,但到目前为止它们对我来说还没有,最初发布此解决方案的人也指出他们 运行 没有解决这个问题。
我遇到了同样的问题,但托管身份并没有太大区别。
在 SQL 服务器的防火墙设置中,有一个选项允许 azure 资源访问服务器。对我来说这是设置为否,但需要设置为是。
我需要配置 Azure SQL Database
防火墙设置,以便它只能被我的 Azure Function
应用程序访问。问题是我是 运行 消费计划中的应用程序,据我所知,即使我不采取任何行动,出站 IP 地址也会发生变化。
有没有办法将应用程序列入白名单,以便保护数据库免受不必要的连接?
我想到了 Azure 区域的白名单,因为所有内容都托管在同一区域,但我如何防范同一区域的其他应用程序?这就是为什么我在考虑使用特定的 IP 地址。我对这种方法唯一担心的是,我不知道其他功能应用程序是否可以与我自己共享相同的出站 IP 地址。
P.S。目前,我的防火墙设置拒绝 public 网络访问并仅允许 Azure 服务连接。
您可以做的一件事是为您的函数分配托管标识。它将从 Azure AD 检索令牌,并将用于连接到 Azure SQL:
if (accessToken != null) {
string connectionString = "Data Source=<AZURE-SQL-SERVERNAME>; Initial Catalog=<DATABASE>;";
SqlConnection conn = new SqlConnection(connectionString);
conn.AccessToken = accessToken;
conn.Open();
}
您可以通过在 SQL Server -INbound Networking 端为函数应用程序和白名单分配静态 IP 并拒绝所有请求来完成此操作。但是您必须将消费计划更改为Appservice才能分配静态IP。
https://docs.microsoft.com/en-us/azure/azure-functions/ip-addresses#dedicated-ip-addresses
此外,您可以尝试为这些服务创建 Vnet 对等互连并阻止其他请求。
虚拟网络在 Azure 上的工作方式与在本地工作的方式不同
如果您创建一个 vnet,将您的 Azure 函数添加到一个子网中,并且在您允许该子网访问的 sql 服务器中,不幸的是无法工作。
如果您可以允许 "public access" and/or "azure resources access" 那么事情就简单了。您使用 sql 凭据登录并具有访问权限。
如果您阻止 public 访问,我不确定您的资源是否能够访问您的数据库,因为您的所有连接都从互联网而不是从您的内部网络转到 SQL 服务器。
对我有用的解决方案是
- 创建虚拟网络
- 为此 vnet 中的 Sql 服务器创建专用终结点(自定义 DNS 记录由 IT-OPS 人员创建)。
- Azure 函数使用此 vnet 的子网。
现在,您可以关闭 public 和数据库中的 azure 资源访问。
您的所有呼叫都将通过您的虚拟网络(不再通过互联网),并且只有使用此 vnet 子网的应用程序才能连接到数据库。
有几种方法可以实现这一点。
您可能想要集成 VNet 或为您的 Azure Functions 获取静态 IP 地址
图片来自:https://docs.microsoft.com/en-us/azure/azure-functions/functions-networking-options
但是,我从您的评论中看到您不想使用高级计划。
我可以建议您实施托管服务身份的最后一件事。
这背后的想法,不是使用连接字符串连接数据库,而是使用您授予的访问令牌连接到数据库。如果您不在同一身份中,则无法获得访问令牌。
本教程介绍了应用服务的总体思路: https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-connect-msi
本教程几乎涵盖了您真正想要实现的目标。
祝你好运!
我找不到我从哪里得到的答案(所以不是我的答案,而是在这里分享),你的 Azure Functions 有一个 outboundIpAddresses
和 possibleoutboundIpAddresses
的列表,你可以将它们添加到你的Azure SQL 防火墙规则(我的有大约 10 个)。
您可以通过...找到它们
- 转到https://resources.azure.com
- 扩展订阅 -> [扩展您的订阅] -> 提供商 -> Microsoft.Web -> 站点
- 在 JSON 中找到您的 Azure 函数站点,然后找到
outboundIpAddresses
和possibleoutboundIpAddresses
,它们将包含一个 IP 地址列表。 - 将它们全部添加到您的 SQL 服务器的防火墙中。
虽然我不确定这些是否会改变,但到目前为止它们对我来说还没有,最初发布此解决方案的人也指出他们 运行 没有解决这个问题。
我遇到了同样的问题,但托管身份并没有太大区别。
在 SQL 服务器的防火墙设置中,有一个选项允许 azure 资源访问服务器。对我来说这是设置为否,但需要设置为是。