You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Bash脚本检测Azure Key Vault中60天内到期密钥并触发续期

问题与解决方案:Azure Key Vault密钥到期检测及流水线触发脚本修复

由于Azure Runbook与本地部署的Azure DevOps Server流水线集成存在限制,需编写Bash脚本实现以下功能:

  • 遍历指定的Azure Key Vault列表
  • 找出其中60天内即将到期的密钥
  • 触发发布流水线将该密钥的有效期延长2年并完成发布审批

目前在获取密钥到期时间、计算剩余天数以及遍历Key Vault的过程中遇到问题,相关代码片段及修复方案如下:


1. 获取密钥到期时间与剩余天数计算问题

原错误代码

az keyvault secret list  --vault-name kv-01  --query "[?attributes.expires  ].{Id:id, expires:attributes.expires}" | jq '.[].expires' '+%s'

问题分析

无法将Azure返回的ISO格式时间(YYYY-MM-DDTHH:MM:SSZ)正确转换为Unix时间戳,导致无法计算剩余天数。

修复代码

# 获取当前UTC时间戳(秒)
current_ts=$(date -u +%s)
# 遍历指定Key Vault,筛选60天内到期的密钥并计算剩余天数
az keyvault secret list --vault-name kv-01 --query "[?attributes.expires].{Id:id, Expires:attributes.expires}" | jq --arg current_ts "$current_ts" '
    .[] | 
    .expire_ts = (.Expires | fromdateiso8601) | 
    .days_remaining = (.expire_ts - $current_ts | tonumber / 86400 | floor) | 
    select(.days_remaining <= 60) | 
    {SecretId: .Id, DaysRemaining: .days_remaining}
'

关键说明

  • fromdateiso8601:将Azure返回的标准时间格式转为Unix时间戳
  • 剩余天数计算:用过期时间戳减去当前时间戳,除以86400(一天的秒数)后取整
  • select(.days_remaining <=60):精准筛选出60天内到期的密钥

2. 遍历Key Vault失败问题

原错误代码

inlineScript: |
    #Azure Key Vault details
    keyvaults=$(az keyvault list --query "[].{Name:name}")
    echo "keyvaults are as below $keyvaults"
    #Iterate through the kvs
    for row in $(echo "${keyvaults}" | jq -c '.[]'); do
        keyVaultName=$(echo "$row" | jq -r '.Name') 
    done             
    #Get the current date in UTC
    currentDate=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
    echo "currentDate is $currentDate".....

问题分析

  1. 时间计算逻辑放在循环外,无法为每个Key Vault单独处理
  2. 用for row in $(...)遍历JSON数组,易因名称含空格/特殊字符导致遍历异常
  3. 循环内未执行密钥检测的核心逻辑

修复代码

inlineScript: |
    # 获取当前UTC时间戳(秒)
    current_ts=$(date -u +%s)
    # 获取所有Key Vault名称并安全遍历
    az keyvault list --query "[].name" -o tsv | while read -r keyVaultName; do
        echo "正在处理Key Vault: $keyVaultName"
        # 筛选该Vault中60天内到期的密钥ID
        expiring_secrets=$(az keyvault secret list --vault-name "$keyVaultName" --query "[?attributes.expires].{Id:id, Expires:attributes.expires}" | jq --arg current_ts "$current_ts" '
            .[] | 
            .expire_ts = (.Expires | fromdateiso8601) | 
            .days_remaining = (.expire_ts - $current_ts | tonumber / 86400 | floor) | 
            select(.days_remaining <= 60) | 
            .Id
        ')
        # 遍历到期密钥,触发流水线延长有效期
        echo "$expiring_secrets" | jq -r '.[]' | while read -r secret_id; do
            echo "触发流水线延长密钥有效期: $secret_id"
            # 替换为你的Azure DevOps Server流水线触发命令
            # az pipelines run --name "你的发布流水线名称" --variables secretId="$secret_id" expireDays=730
        done
    done

关键说明

  • az keyvault list --query "[].name" -o tsv:直接输出纯文本格式的Key Vault名称,避免JSON解析问题
  • while read -r keyVaultName:安全遍历列表,支持名称含特殊字符的场景
  • 将密钥检测、流水线触发逻辑嵌入Key Vault遍历循环,确保每个Vault都被处理

内容的提问来源于stack exchange,提问作者Vowneee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:40:20