求多订阅多Azure KeyVault即将过期密钥/机密的PS脚本及报错解决
Azure多订阅Key Vault密钥/机密过期检测脚本
完整可用脚本
下面的脚本会遍历你所有的Azure订阅,检查每个Key Vault里7天内即将过期的Secret和Key,同时返回对应的资源组名称,直接就能用来做后续的邮件通知。如果需要改成5天,修改$expiryThreshold的值即可。
# 自动化账户用系统托管身份连接Azure,本地测试替换为Connect-AzAccount Connect-AzAccount -Identity # 设置过期阈值,这里是7天,要改5天就把7换成5 $expiryThreshold = (Get-Date).AddDays(7) # 存储检测结果的数组 $expiringItems = @() # 遍历所有Azure订阅 Get-AzSubscription | ForEach-Object { # 切换到当前订阅 Set-AzContext -Subscription $_.Id | Out-Null Write-Host "正在处理订阅: $($_.Name)" # 获取当前订阅下的所有Key Vault $keyVaults = Get-AzKeyVault if (-not $keyVaults) { Write-Host "该订阅下无Key Vault,跳过" return } # 逐个检测Key Vault foreach ($kv in $keyVaults) { Write-Host "正在检测Key Vault: $($kv.VaultName) (资源组: $($kv.ResourceGroupName))" # 筛选即将过期的Secret $expiringSecrets = Get-AzKeyVaultSecret -VaultName $kv.VaultName | Where-Object { $_.Expires -ne $null -and $_.Expires -le $expiryThreshold } | Select-Object @{Name='ResourceGroupName'; Expression={$kv.ResourceGroupName}}, @{Name='KeyVaultName'; Expression={$kv.VaultName}}, @{Name='Type'; Expression={'Secret'}}, Name, @{Name='ExpiryDate'; Expression={$_.Expires.ToString('yyyy-MM-dd HH:mm:ss')}} # 筛选即将过期的Key $expiringKeys = Get-AzKeyVaultKey -VaultName $kv.VaultName | Where-Object { $_.Expires -ne $null -and $_.Expires -le $expiryThreshold } | Select-Object @{Name='ResourceGroupName'; Expression={$kv.ResourceGroupName}}, @{Name='KeyVaultName'; Expression={$kv.VaultName}}, @{Name='Type'; Expression={'Key'}}, Name, @{Name='ExpiryDate'; Expression={$_.Expires.ToString('yyyy-MM-dd HH:mm:ss')}} # 将结果存入数组 if ($expiringSecrets) { $expiringItems += $expiringSecrets } if ($expiringKeys) { $expiringItems += $expiringKeys } } } # 输出结果,可替换为邮件发送逻辑 if ($expiringItems) { Write-Host "检测到即将过期的密钥/机密:" $expiringItems | Format-Table -AutoSize # 示例:转换为HTML格式,方便嵌入邮件 $htmlBody = $expiringItems | ConvertTo-Html -Fragment # 此处可添加Send-MailMessage或Azure Logic Apps的邮件发送代码 } else { Write-Host "未检测到即将过期的密钥/机密" }
自动化账户Runbook配置要点
- 模块导入:确保自动化账户中已导入
Az.Accounts和Az.KeyVault模块,建议使用最新稳定版本。- 操作路径:自动化账户 → 模块 → 浏览库,搜索并导入上述模块。
- 权限配置:
- 给自动化账户的系统托管身份分配订阅级别Reader角色,用于遍历所有订阅和Key Vault资源。
- 给每个目标Key Vault分配Key Vault Secrets User和Key Vault Crypto User角色(或自定义角色,需包含
Microsoft.KeyVault/vaults/secrets/list/action和Microsoft.KeyVault/vaults/keys/list/action权限)。
- 身份验证设置:脚本中使用
Connect-AzAccount -Identity,需确保自动化账户已启用系统托管身份。
常见报错排查
- "未找到订阅"或权限不足:检查系统托管身份的订阅Reader权限是否覆盖所有需要检测的订阅,确认权限分配无误。
- 模块缺失报错:确认
Az.Accounts和Az.KeyVault模块已成功导入,版本不兼容时可更换匹配版本。 - Key Vault访问被拒绝:检查Key Vault的访问策略或RBAC权限,确保自动化身份拥有读取密钥/机密的权限。
内容的提问来源于stack exchange,提问作者Manju S
相关产品推荐
相关产品推荐

