使用SAS密钥从Azure Blob Storage读取文件时SQL Server访问被拒
问题:Azure SQL访问受限网络下的Blob Storage时出现权限拒绝错误
我尝试从Azure Blob Storage读取CSV文件,但每次执行查询都会触发访问被拒错误,执行的SQL代码如下:
CREATE DATABASE SCOPED CREDENTIAL <myScopedCredential> WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = 'sv=2021-06-08&ss=b&srt=sco&sp=rl&se=2023-03-31T09:38:05Z&st=2022-09-01T02:38:05Z...'; CREATE EXTERNAL DATA SOURCE <myExternalDatasource> WITH ( TYPE = BLOB_STORAGE , LOCATION = 'https://<myResource>.blob.core.windows.net/<myContainer>' , CREDENTIAL= <myScopedCredential> ---> ); SELECT * FROM OPENROWSET ( BULK '<folderName>/<fileName>.csv' , DATA_SOURCE = '<myExternalDatasource>' , FORMAT ='CSV' , FORMATFILE='<formatFilesFolderName>/<formatfileName>.fmt' , FORMATFILE_DATA_SOURCE = '<myExternalDatasource>' , FIRSTROW = 2 ) AS test
相关配置细节:
- 存储账户类型为BlockBlobStorage;
- 防火墙和虚拟网络设置为仅允许选定虚拟网络和IP地址访问,已添加自身公网IP及从官方文档获取的Azure SQL Server网关IP;
- 若设置为允许所有网络访问则可正常运行,SQL Server与存储账户处于同一资源组;
- 已配置两者共用的虚拟网络;
- 参考过相关Stack Overflow问题但解决方案无效。
我查阅了SAS密钥、数据库范围凭据、外部数据源及VNet网络相关文档未发现限制,是否遗漏了某项配置?开放所有网络存在安全隐患,寻求合理解决办法。
排查与解决方案
1. 补全Azure SQL Server的出站IP到存储账户防火墙
Azure SQL Server访问外部存储时,会使用其全部出站IP地址,而非仅网关IP。你需要在Azure门户的SQL Server资源页,进入「网络」>「防火墙和虚拟网络」>「出站IP地址」,复制所有列出的IP地址,将它们逐一添加到存储账户的防火墙允许规则中。
2. 修正VNet集成的关键配置
如果通过虚拟网络访问,需确认以下几点:
- 在存储账户的防火墙设置中,启用「允许受信任的Microsoft服务访问此存储账户」选项;
- 确保SQL Server所在的子网,其网络安全组(NSG)未阻止到Blob Storage的443端口出站流量;
- 存储账户的VNet规则中,已正确添加SQL Server所在的子网。
3. 验证SAS令牌的权限与完整性
- 确认SAS令牌的
sp参数包含r(读取)和l(列出)权限,OPENROWSET需要这两项权限来读取文件和遍历目录; - 检查SAS令牌的
st(起始时间)和se(过期时间)是否覆盖当前时间,未过期; - 确保复制SAS令牌时没有截断,完整保留所有参数(注意URL编码的特殊字符如
&不要丢失)。
4. 核对外部数据源配置
- 确认外部数据源的
LOCATION路径格式正确,结尾不要添加斜杠,应为https://<storage-account>.blob.core.windows.net/<container>; - 验证数据库范围凭据的
SECRET与SAS令牌完全一致,无多余空格或错误字符。
内容的提问来源于stack exchange,提问作者Dustine Tolete
相关产品推荐
相关产品推荐

