Azure函数Python连接防火墙后Blob存储:寻求替代访问密钥的安全认证方式
更安全的Azure Blob存储认证方式替代Access Key
针对你的场景,推荐以下几种风险更低的认证方式,完全规避Access Key硬编码或泄露的问题:
1. 托管标识(Managed Identity)—— 最推荐的无密钥方案
这是Azure原生的无密钥认证方案,无需手动管理任何密钥,Azure会自动维护身份凭证,且只有你的Azure函数能使用该身份访问资源,安全性最高。
操作步骤:
- 在Azure函数应用的「身份」选项卡中,启用系统分配托管标识;
- 进入Blob存储账户的「访问控制(IAM)」页面,给该托管标识添加Storage Blob Data Contributor(或业务所需的最小权限角色);
Python代码示例:
无需硬编码任何凭证,DefaultAzureCredential会自动在Azure函数环境中获取托管标识的认证信息:
from azure.storage.blob import BlobClient from azure.identity import DefaultAzureCredential credential = DefaultAzureCredential() blob = BlobClient( account_url="https://xxxx.blob.core.windows.net", container_name="xxx", blob_name="download_file.csv", credential=credential )
2. Azure AD服务主体(Service Principal)—— 适配本地调试/跨场景
如果需要在本地调试代码,或者跨Azure租户访问资源,服务主体是合适的选择。你可以创建一个AD应用作为服务主体,通过环境变量管理凭证,避免硬编码。
操作步骤:
- 在Azure AD中注册应用,获取租户ID、客户端ID和客户端密钥;
- 在Blob存储的IAM页面,给该服务主体分配对应权限角色;
- 在Azure函数的「配置」中添加上述三个参数为环境变量;
Python代码示例:
from azure.storage.blob import BlobClient from azure.identity import ClientSecretCredential import os tenant_id = os.getenv("AZURE_TENANT_ID") client_id = os.getenv("AZURE_CLIENT_ID") client_secret = os.getenv("AZURE_CLIENT_SECRET") credential = ClientSecretCredential(tenant_id, client_id, client_secret) blob = BlobClient( account_url="https://xxxx.blob.core.windows.net", container_name="xxx", blob_name="download_file.csv", credential=credential )
3. SAS令牌(Shared Access Signature)—— 细粒度权限控制
SAS令牌可以针对特定Blob/容器、指定权限(只读/读写等)、有效期和允许的IP范围生成,即使泄露,影响范围也远小于Access Key。
操作步骤:
- 通过Azure门户、Azure CLI或代码生成SAS令牌,设置合理的有效期和最小必要权限;
Python代码示例:
from azure.storage.blob import BlobClient sas_token = "生成的SAS令牌内容" blob = BlobClient( account_url="https://xxxx.blob.core.windows.net", container_name="xxx", blob_name="download_file.csv", credential=sas_token )
内容的提问来源于stack exchange,提问作者Anshul Dubey
相关产品推荐
相关产品推荐

