PowerShell 技能连载 - Azure Key Vault 密钥管理
适用于 PowerShell 7.0 及以上版本
在现代 DevOps 和云原生环境中,密钥管理是安全体系的重要基石。数据库连接字符串、API 密钥、存储账户凭据等敏感信息如果以明文形式散落在脚本、配置文件或环境变量中,一旦代码仓库泄露,攻击者就能直接获取这些凭据,进而访问生产环境的各类服务。这种安全隐患在自动化程度越高的团队中,影响面越大。
Azure Key Vault 是微软 Azure 提供的集中式密钥管理服务,支持存储机密(Secrets)、加密密钥(Keys)和证书(Certificates)。它不仅提供了硬件安全模块(HSM)保护的加密存储,还支持基于 Azure Active Directory 的细粒度访问控制、完整的访问日志审计以及自动化的密钥轮换策略。通过 PowerShell 的 Az.KeyVault 模块,我们可以将密钥的创建、读取、轮换和审计全部纳入自动化流水线。
本文将从三个实战场景出发,演示如何使用 PowerShell 完成密钥的创建与存储、在自动化脚本中安全引用密钥,以及建立密钥轮换与合规审计机制,帮助团队彻底消除脚本中的硬编码凭据。
创建 Key Vault 并存储密钥
第一步是创建 Key Vault 并将常用的敏感信息存储进去。以下脚本展示了完整的初始化流程,包括资源组创建、Key Vault 实例创建以及多种类型机密的写入。
1 | # 定义变量 |
执行结果示例:
1 | ResourceGroupName : rg-security-demo |
在自动化脚本中安全引用密钥
密钥存入 Key Vault 后,自动化脚本不再需要硬编码任何凭据。以下示例展示了如何使用托管标识(Managed Identity)或服务主体来读取密钥,并直接应用到数据库连接、API 调用等场景中。
1 | # 方式一:使用服务主体进行非交互式认证(适用于 CI/CD 流水线) |
执行结果示例:
1 | 数据库连接成功,服务器版本:Microsoft SQL Server 2019 (RTM) |
密钥轮换策略与合规审计
密钥的定期轮换是安全合规的基本要求。以下脚本演示了如何实现自动化的密钥轮换流程,并通过 Key Vault 的诊断日志功能进行访问审计,确保所有密钥操作可追溯。
1 | $VaultName = 'kv-pstip-demo-2025' |
执行结果示例:
1 | 发现 2 个即将过期的机密: |
注意事项
使用托管标识代替服务主体:在 Azure VM、App Service 或 Azure Functions 中运行脚本时,优先使用系统分配的托管标识(
Connect-AzAccount -Identity),避免在环境中再存储服务主体的凭据,从根本上消除凭据泄露风险。启用软删除和清除保护:创建 Key Vault 时务必启用
EnableSoftDelete和EnablePurgeProtection。软删除保留了 90 天的恢复窗口,清除保护则防止恶意删除后立即清空,两者配合可以有效防御勒索类攻击。遵循最小权限原则:为不同的应用和服务主体分配最小必要的权限。只读工作负载只需
Get和List权限,轮换脚本需要Set和Delete权限。避免为所有主体授予完全控制权限。密钥轮换后同步下游服务:轮换密钥后,所有使用该密钥的下游应用需要及时获取新版本。建议在应用层实现自动重试逻辑,或者在轮换后触发一次服务重启或配置热加载,确保不会出现认证失败。
定期审计访问日志:通过 Key Vault 的诊断设置,将访问日志导出到 Log Analytics 工作区或存储账户。定期检查异常访问模式(如非工作时间的频繁读取、未知主体的访问尝试),及时发现潜在的安全威胁。
不要将密钥输出到日志或控制台:在调试时避免使用
Write-Host输出机密明文。如果必须记录操作,只记录机密名称和操作结果,永远不要记录SecretValue的内容。CI/CD 流水线中也应屏蔽包含密钥值的变量输出。