【问题标题】:GCP Command to Read All User's Permissions读取所有用户权限的 GCP 命令
【发布时间】:2020-04-09 03:14:30
【问题描述】:

有没有办法在 GCP 中列出用户的所有权限?

我知道有这个命令:

gcloud 项目 get-iam-policy "project-ID"

但我只能看到我在 IAM 控制台中设置的 IAM 角色。例如,我没有看到 IAM 角色

BigQuery 数据查看器

我已在 BigQuery 页面的数据集上为用户设置。

【问题讨论】:

    标签: google-cloud-platform google-iam google-cloud-iam


    【解决方案1】:

    在 GCP 中有没有办法列出用户的所有权限?

    在 Google Cloud Platform 中,没有一个命令可以做到这一点。通过角色的权限分配给资源。可以为组织、文件夹、项目、数据库、存储对象、KMS 密钥等分配 IAM 权限。您必须扫描(检查 IAM 权限)每个资源,以确定 IAM 成员账户拥有的总权限集。

    这些功能在 Google Cloud 授权、安全性和审计方面既是优势也是劣势。如果理解得当,这些功能非常强大。

    【讨论】:

    • 好的,我知道我们只能读取角色而不能读取权限。但是你的意思是我必须为 IAM 扫描资源,每个资源的 IAM 命令是什么?
    • @toto' 命令取决于资源。每个支持 IAM 的资源都有自己的命令集。例如,使用 Cloud Storage 查看命令 gsutil iam。对于 Cloud KMS,gcloud kms keys get-iam-policy。每种支持的资源类型都有相应的命令。
    • @toto' 在 BigQuery 中查看 IAM 权限的命令是 bq showcloud.google.com/bigquery/docs/dataset-access-controls
    • @toto' 您可能想知道为什么所有单独的命令。多年前,当大多数 Google 服务发布时,Google IAM 并不存在。由服务控制的权限。如今,Google 正在通过集成更多通用系统并在某些情况下添加新类型的身份和访问控制来迅速提升授权和安全性。
    • @toto' - 有时您必须将服务角色名称转换为 IAM 角色名称。 Data Viewer 不是 BigQuery 角色名称 - 它是 IAM 角色名称。
    【解决方案2】:

    您可以通过使用标志“--flatten”、“--format”和“--filter”调整gcloud projects get-iam-policy 的输出来列出与用户或服务帐户关联的角色:

    gcloud projects get-iam-policy <YOUR GCP PROJECT>  \
    --flatten="bindings[].members" \
    --format="table(bindings.role)" \
    --filter="bindings.members:<THE USER OR SERVICE ACCOUNT>"
    

    在我的测试场景中输出如下:

    ROLE
    roles/bigquery.dataViewer
    roles/owner
    

    【讨论】:

    • 我收到一个错误:错误:(gcloud.projects.get-iam-policy) 预期名称 [默认 HERE 'table(bindings.role)']。跨度>
    • @toto' 这很奇怪。使用 Cloud Shell 对我来说效果很好。不管怎样,在指定--format 的值时,尝试用双引号(") 替换单引号('),这样行看起来像这样:--format="table(bindings.role)"。还要确保您使用 gcloud components update 运行最新的 Cloud SDK。
    • 是的,问题是 (") 引号。但这并不能解决我的问题,因为我只能获得项目的级别角色,而不是例如我在 BigQuery 上设置的角色。
    【解决方案3】:

    您可以使用它在组织下的 IAM 策略中搜索“foo@bar.com”:

    gcloud beta asset search-all-iam-policies --scope=organizations/123 --query="policy:foo@bar.com" | egrep "resource:|role:|user:foo"
    

    您可以将范围更改为项目或文件夹。

    文档:https://cloud.google.com/asset-inventory/docs/searching-iam-policies

    但它并不涵盖所有政策:https://cloud.google.com/asset-inventory/docs/supported-asset-types#searchable_asset_types

    更多细节可以在另一篇文章中找到:How to list, find, or search iam policies across services (APIs), resource types, and projects in google cloud platform (GCP)?

    【讨论】:

      【解决方案4】:

      当我们考虑用户的权限时,认为有某种主表显示“用户 X 拥有所有这些权限”是错误的。相反,我们需要重新定位我们的思维,以沿着不同的维度思考。想一想您想要保护的事物(资源),然后我们可以说“此资源 (Z) 允许用户 X 执行 Y”。

      在 GCP 中,我们也不分配权限,而是分配作为权限集合的角色。

      回到您的问题,这意味着我们无法列出用户的所有权限,因为用户没有“拥有”权限,而是用户拥有与资源相关的角色。

      想象一下你的文件系统上有一个名为“A”的文件,用户 X 可以读取但不能写入。现在想象一下你的文件系统上有一个名为“B”的文件,用户 X 可以写但不能读。我们不能正确地说用户 X 具有“读取”和“写入”权限。虽然有些文件是用户可以读取的,有些是用户可以写入的,但并不是说用户可以读取和写入所有文件。

      为了得出结论......对于任何给定的资源集,您可以询问该资源哪些用户在该资源上具有哪些角色。

      我们有一个 API,可用于确定用户是否可以对给定资源执行命名操作...请参阅:Testing permissions

      【讨论】:

      • 好的,谢谢。但是看起来并不能很好地扩展,因为扫描“基于每个用户的所有资源”以了解“谁可以访问什么”变得相当复杂。..
      • @toto' ... Yuppers ...我也没有看到一种干净的方式来请求用户拥有某些权限的所有资源,而是将其翻转并询问所有用户拥有命名资源权限的人变得微不足道。我们也不要忘记,组也可以与资源相关联,并且特定用户可能是也可能不是组的成员。了解特定用户的所有功能可能会变得更加复杂。
      【解决方案5】:

      我创建了这个小脚本。它提供了详细信息,例如成员 ID、分配给它的角色和项目名称

      for list in `gcloud projects list | awk 'NR>1 {print $1}'`; do gcloud projects get-iam-policy $list --flatten="bindings[].members" --format="table(bindings.members,bindings.role,$list)"; done;
      

      【讨论】:

        猜你喜欢
        • 2019-03-11
        • 2018-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-24
        • 1970-01-01
        • 2021-01-11
        相关资源
        最近更新 更多