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(追溯一年数据)
- 确保项目已启用Cloud Audit Logs中的
Data Access日志(针对IAM服务账号) - 使用日志查询定位未使用的服务账号:
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
相关产品推荐
相关产品推荐

