Azure AD服务主体过期查询命令无输出,寻求自动化预警方案
解决服务主体过期日期识别与通知的问题
先排查命令无输出的问题
你的az ad sp credential list命令没有输出,大概率是以下几种原因:
- 服务主体无有效凭证:如果该服务主体从未设置过密码或证书凭证,命令会返回空数组,自然提取不到
endDate。先执行不带过滤的命令验证:
如果返回az ad sp credential list --id "xxxxxxxxxxxxxxxxxxx"[],说明没有凭证,需要先给服务主体创建凭证才能获取过期日期。 - 权限不足:执行命令的身份(比如Azure DevOps流水线使用的服务连接身份)需要拥有Azure AD的Directory Readers或Application Administrator权限,才能读取服务主体的凭证信息。检查该身份的Azure AD角色分配。
- 服务主体ID错误:确认
--id参数使用的是服务主体的应用ID(Client ID)或对象ID,可以通过以下命令获取正确ID:az ad sp list --display-name "你的服务主体显示名称" --query "[].{id:id, appId:appId}" -o table
实现自动化识别与通知的方案
当命令能正常返回过期日期后,可通过以下脚本实现60天内过期的服务主体识别,并集成到Azure DevOps流水线中:
示例Bash脚本
#!/bin/bash # 设置阈值:60天后的日期(格式与az cli返回的endDate一致:YYYY-MM-DD) THRESHOLD_DATE=$(date -d "+60 days" +%Y-%m-%d) # 获取所有服务主体的凭证过期信息(过滤有endDate的条目) az ad sp list --query "[?credentials[*].endDate].{displayName:displayName, appId:appId, endDates:credentials[*].endDate}" -o json | jq -r '.[] | .endDates[] | select(. <= "'"$THRESHOLD_DATE"'") | "\(.displayName) (\(.appId)): \(.endDates[])"' > expiring_sps.txt # 如果有即将过期的服务主体,发送通知(示例:输出到流水线日志,可替换为邮件/Teams通知) if [ -s expiring_sps.txt ]; then echo "以下服务主体凭证将在60天内过期:" cat expiring_sps.txt # 这里可以添加通知逻辑,比如调用Azure DevOps通知API、发送邮件或Teams消息 else echo "没有即将过期的服务主体凭证" fi
Azure DevOps流水线配置要点
- 添加Azure CLI任务,选择有权限的Azure AD服务连接。
- 确保流水线代理安装了
jq(用于JSON解析,可通过任务提前安装:apt-get install jq或brew install jq)。 - 根据需求配置通知方式:比如使用PowerShell任务发送Teams webhook,或调用邮件服务发送通知。
内容的提问来源于stack exchange,提问作者Vowneee
相关产品推荐
相关产品推荐

