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

GCP项目一年未用服务账号检索及LastAuthenticatedTime值疑问

关于GCP服务账号未使用检索与认证时间字段的问题解答

1. 检索GCP项目中过去一年未使用的所有服务账号

可以通过IAM Recommender结合脚本批量获取,也可以结合Cloud Audit Logs实现更精准的一年期追溯:

方法一:完善现有脚本(基于Recommender)

你的脚本已获取Insight数据,但缺少结果写入CSV的步骤,同时可添加时间筛选逻辑,定位过去一年未认证的账号:

PROJECT="你的项目ID"
LOCATION="global"
OUTPUT_CSV="unused_service_account.csv"

# 初始化CSV表头
echo "projectId,email,lastAuthenticatedTime,description,lastRefreshTime" > $OUTPUT_CSV

# 获取所有服务账号Insight的ID列表
INSIGHTS=$(gcloud recommender insights list \
    --insight-type=google.iam.serviceAccount.Insight \
    --project=$PROJECT \
    --location=$LOCATION --format=json | jq -r '.[].name')

# 遍历每个Insight
for INSIGHT_FULL in $INSIGHTS
do
    INSIGHT=${INSIGHT_FULL##*/}
    DETAILS=$(gcloud recommender insights describe $INSIGHT \
        --insight-type=google.iam.serviceAccount.Insight \
        --project=$PROJECT \
        --location=$LOCATION --format=json)
    
    EMAIL=$(echo $DETAILS | jq -r '.content.email')
    LAST_AUTH_TIME=$(echo $DETAILS | jq -r '.content.lastAuthenticatedTime')
    DESCRIPTION=$(echo $DETAILS | jq -r '.description')
    LAST_REFRESH_TIME=$(echo $DETAILS | jq -r '.lastRefreshTime')

    # 筛选过去一年未认证的账号:时间为空,或早于365天前
    if [ "$LAST_AUTH_TIME" = "null" ] || [ $(date -d "$LAST_AUTH_TIME" +%s) -lt $(date -d "-365 days" +%s) ]; then
        echo "$PROJECT,$EMAIL,$LAST_AUTH_TIME,$DESCRIPTION,$LAST_REFRESH_TIME" >> $OUTPUT_CSV
    fi
done

注意:Recommender的Insight数据默认覆盖过去90天活动,若需追溯完整一年的历史,需结合Cloud Audit Logs。

方法二:结合Cloud Audit Logs(追溯一年数据)

  1. 确保项目已启用Cloud Audit Logs中的Data Access日志(针对IAM服务账号)
  2. 使用日志查询定位未使用的服务账号:
PROJECT="你的项目ID"
# 获取所有服务账号列表
SA_LIST=$(gcloud iam service-accounts list --project=$PROJECT --format="value(email)")

# 遍历每个服务账号,检查过去一年是否有认证日志
for SA in $SA_LIST
do
    LOG_COUNT=$(gcloud logging read "protoPayload.authenticationInfo.principalEmail=$SA AND timestamp>=$(date -d "-365 days" --iso-8601=seconds)" \
        --project=$PROJECT --limit=1 --format="value(count)")
    if [ "$LOG_COUNT" = "" ]; then
        echo "未使用的服务账号:$SA"
    fi
done

2. LastAuthenticatedTime字段为null是否意味着从未认证?

不一定,分两种情况:

  • 从未使用过:如果服务账号创建后,从未通过密钥、工作负载身份等方式完成身份验证,该字段会显示为null。
  • 认证记录超出保留期限:GCP用于生成LastAuthenticatedTime的服务账号认证数据默认保留180天,若最后一次认证时间早于180天前,Recommender无法获取历史记录,字段也会显示为null。

若需确认超过180天的历史使用情况,可查询Cloud Audit Logs(前提是日志已启用且保留期足够长,默认Cloud Audit Logs保留365天)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:05:31