【问题标题】:Google cloud: How to list all service-accounts from all Projects in GCP谷歌云:如何列出 GCP 中所有项目的所有服务帐户
【发布时间】:2021-09-20 06:44:10
【问题描述】:

我需要在谷歌云中获取服务帐户的所有属性。是否可以列出所有属性,例如 Select *.

否则我需要以下信息:

  • SA 帐户名称
  • 电子邮件地址
  • 已分配 Iam 角色
  • 用户管理的密钥(如果有)
  • 帐户创建日期
  • 上次使用/身份验证时间。
  • 项目名称
  • 帐户状态(启用/禁用)

我可以获取所有项目,然后是其中的所有服务帐户,但我不知道如何获取所有其他值。

foreach ($project in gcloud projects list --format="value(projectId)")
{
  Write-Host "ProjectId: $project"
  foreach ($robot in  gcloud iam service-accounts list --project $project --format="value(email)")
  {
     Write-Host "    -> Robot $robot"
   
  }
}

【问题讨论】:

  • gcloud iam service-accounts describegcloud iam service-accounts keys list 会给你一些细节。 上次使用之类的信息需要解析 Cloud Logging。日志保留默认为 30 天,因此您需要延长保留时间,以便可以扫描超过过去 30 天的日志。
  • 该命令只提供 7 个属性,我注意到如果我运行另一个 gcloud iam service-accounts get-iam-policy ,它会提供成员和角色...是他们的任何可用脚本,它将列出所有服务帐户的属性。
  • 您是否通过 API 调用找到了所有需要的信息?有些似乎无法获得(上次使用??)您必须执行多个请求才能获取每条信息
  • 我没有 API 调用的经验,所以没有。看起来我必须为服务帐户运行所有可用的 gcloud 命令才能获得最大的信息。你是对的,上次使用几乎不可能得到。
  • 您可以使用list method 单独获取有关每个项目的服务帐户的信息。 response 不包含您要查找的某些字段。

标签: google-cloud-platform gcloud service-accounts google-iam


【解决方案1】:

正如评论者所指出的,这并非小事。

但是,我总是喜欢gcloud-bashing ;-)

您的代码示例表明您希望在 PowerShell 中得到我没有的答案,并希望您不介意 bash 中的 pointers(以下内容不完整):

做:

  • 项目 ID
  • 帐户名称
  • 启用|禁用
  • 电子邮件
  • 钥匙
  • 创建(时间戳)

没有:

  • 角色分配
  • 上次使用(审核日志?)
PROJECTS=$(gcloud projects list --format="value(projectId)")

for PROJECT in ${PROJECTS}
do
  echo "Project: ${PROJECT}"
  # Extracts ACCOUNT_ID, EMAIL (==ACCOUNT_ID@...), DISABLED
  ROBOTS=$(\
    gcloud iam service-accounts list \
    --project=${PROJECT} \
    --format="csv[no-heading](displayName.encode(\"base64\"),email,email.split(\"@\").slice(0),disabled)")
  for ROBOT in ${ROBOTS}
  do
    # Parse results
    IFS=, read ENCODED_NAME EMAIL ACCOUNT_ID DISABLED <<< ${ROBOT}
    NAME=$(echo -e ${ENCODED_NAME} | base64 --decode)
    echo "  Service Account: ${NAME}"
    echo "    Disabled: ${DISABLED}"
    echo "    Email: ${EMAIL}"
    # Keys
    KEYS=$(\
        gcloud iam service-accounts keys list \
        --iam-account=${EMAIL} \
        --project=${PROJECT} \
        --format="value(name.scope(keys))")
    for KEY in ${KEYS}
    do
      echo "    Key: ${KEY}"
    done
    # Creation (Only searches back 30-days!)
    FILTER=""\
"logName=\"projects/${PROJECT}/logs/cloudaudit.googleapis.com%2Factivity\" "\
"resource.type=\"service_account\" "\
"protoPayload.methodName=\"google.iam.admin.v1.CreateServiceAccount\" "\
"protoPayload.request.account_id=\"${ACCOUNT_ID}\" "

    LOG=$(\
        gcloud logging read "${FILTER}" \
        --project=${PROJECT} \
        --format=json \
        --freshness=30d \
        --format="value(timestamp)")
    echo "    Created: ${LOG}"
  done
done

备注

  • 服务帐户创建时间 -- IIUC -- 只能通过审计日志 (CreateServiceAccount[Key]) 获得。一个挑战是必须回溯项目的(整个)历史才能找到这些。
  • 仅创建用户创建的服务帐户(在项目的生命周期内)。 Google 维护的帐户,例如将找不到 App Engine。
  • 脚本搜索每个帐户的日志。这是低效的,最好为所有帐户搜索一次日志,然后合并结果。
  • 由于继承,角色分配很困难。一个简单的解决方案会为每个项目获取 IAM 策略,但这还不够,因为它不涵盖组织|文件夹权限,也不包括特定于资源的绑定。
  • 我实际上不知道如何 grep 上次身份验证时间的日志,并假设这可以通过审核日志获得
  • 对于帐户 displayName 的粗糙 base64 编码表示歉意。这是为了避免过度解析(大多数)包含空格的名称。可能有更好的方法。

【讨论】:

  • 你现在是云脚本大师
  • 谢谢@DazWilkin,我会在这里尝试更新...再次感谢您的努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多