是否可在Azure SQL Database中访问Azure Key Vault存储的机密?
可行实现方案
方案1:优先推荐:使用托管身份代替SAS Token(无需管理密钥/凭据)
该方案完全规避了从Key Vault拉取SAS Token的需求,安全性和可维护性更高,无需处理SAS过期问题:
- 为你的Azure SQL资源启用系统分配托管身份或用户分配托管身份
- 为该托管身份分配目标ADLS Gen2存储账户的
存储Blob数据读者权限(若需要写入操作可按需调整对应权限) - 直接在Azure SQL中执行如下T-SQL创建凭据和外部数据源,不需要传入SAS Token:
-- 创建数据库范围凭据(使用托管身份,无需指定SECRET) CREATE DATABASE SCOPED CREDENTIAL [ADLS_ManagedId_Cred] WITH IDENTITY = 'Managed Identity'; -- 针对每个ADLS Gen2容器创建对应外部数据源 CREATE EXTERNAL DATA SOURCE [ADLS_DataSource_Container1] WITH ( LOCATION = 'abfss://<容器名>@<存储账户名>.dfs.core.windows.net', CREDENTIAL = [ADLS_ManagedId_Cred] );
所有不同的ADLS Gen2容器/存储账户只要给同一个SQL托管身份完成授权,都可以复用同一个凭据,不需要为每个数据源单独维护SAS Token。
方案2:若必须使用SAS Token,可通过自动化工作流从Key Vault拉取后动态创建资源
该方案无技术障碍可直接落地,核心流程如下:
- 步骤1:为你的自动化运行环境(Azure Function、Azure自动化账户等)分配Azure Key Vault的
密钥保管库机密用户角色,确保其有权限读取存储在Key Vault中的各SAS Token机密 - 步骤2:编写自动化脚本执行如下逻辑:
- 从Key Vault批量读取所有提前存储的ADLS Gen2 SAS Token机密
- 使用AAD身份验证连接到目标Azure SQL数据库
- 动态生成T-SQL语句,为每个ADLS Gen2资源创建/更新对应的数据库范围凭据和外部数据源,示例动态生成的T-SQL如下:
-- 针对单个ADLS Gen2资源创建带SAS的凭据 CREATE DATABASE SCOPED CREDENTIAL [ADLS_Cred_<存储账户名>_<容器名>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<从Key Vault读取到的SAS Token值>'; -- 创建对应外部数据源 CREATE EXTERNAL DATA SOURCE [ADLS_DataSource_<存储账户名>_<容器名>] WITH ( LOCATION = 'abfss://<容器名>@<存储账户名>.dfs.core.windows.net', CREDENTIAL = [ADLS_Cred_<存储账户名>_<容器名>] );
- 步骤3:可配置定时触发该自动化脚本,自动更新即将过期的SAS Token对应的凭据,避免业务中断。
内容的提问来源于stack exchange,提问作者Vinay SPal
相关产品推荐
相关产品推荐

