Google 云:如何列出 GCP 中所有项目的所有服务帐户
Google cloud: How to list all service-accounts from all Projects in GCP
我需要在 google 云中获取服务帐户的所有属性。是否可以列出所有类似 Select *.
的属性
否则我需要以下信息:
- SA 帐户名称
- 电子邮件地址
- 我已分配角色
- 用户管理的密钥(如果有)
- 帐户创建日期
- 上次使用/认证时间
- 项目名称
- 账户状态(启用/禁用)
我可以获取所有项目,然后获取其中的所有服务帐户,但我不知道如何获取所有其他值。
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
-bashing ;-)
您的代码示例表明您需要 PowerShell 中的答案,而我没有,希望您不介意 pointers(以下内容不完整)在 bash:
是否:
- 项目编号
- 账户名
- 启用|禁用
- 电子邮件
- 键
- 创建(时间戳)
不会:
- 角色分配
- 上次使用(审计日志?)
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
编码表示歉意。这是为了避免过度急切地解析(大多数)包含空格的名称。可能有更好的方法。
我需要在 google 云中获取服务帐户的所有属性。是否可以列出所有类似 Select *.
的属性否则我需要以下信息:
- SA 帐户名称
- 电子邮件地址
- 我已分配角色
- 用户管理的密钥(如果有)
- 帐户创建日期
- 上次使用/认证时间
- 项目名称
- 账户状态(启用/禁用)
我可以获取所有项目,然后获取其中的所有服务帐户,但我不知道如何获取所有其他值。
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
-bashing ;-)
您的代码示例表明您需要 PowerShell 中的答案,而我没有,希望您不介意 pointers(以下内容不完整)在 bash:
是否:
- 项目编号
- 账户名
- 启用|禁用
- 电子邮件
- 键
- 创建(时间戳)
不会:
- 角色分配
- 上次使用(审计日志?)
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
编码表示歉意。这是为了避免过度急切地解析(大多数)包含空格的名称。可能有更好的方法。