阻止用户删除 BigQuery 表

Posted

技术标签:

【中文标题】阻止用户删除 BigQuery 表【英文标题】:Prevent a user from deleting BigQuery tables 【发布时间】:2020-02-20 18:29:11 【问题描述】:

我们正在尝试创建一个非常基本的角色,允许用户查询 BigQuery 表,但不能删除它们。我们正在试验的自定义角色现在具有以下权限:

- bigquery.jobs.create
- bigquery.jobs.get
- bigquery.jobs.list
- bigquery.jobs.listAll
- bigquery.readsessions.create
- bigquery.routines.get
- bigquery.routines.list
- bigquery.savedqueries.get
- bigquery.savedqueries.list
- bigquery.tables.export
- bigquery.tables.getData
- bigquery.tables.list
- bigquery.transfers.get
- resourcemanager.projects.get

我们目前只关注删除,因此权限列表正在进行中。只有一个自定义角色分配给我们的测试用户具有上述权限。但是,用户可以从我们的 BigQuery 数据集中删除表。关于实现我们目标的正确权限组合的任何想法。

提前致谢!

【问题讨论】:

您的用户如何删除表?是通过客户端库吗?是通过用户界面吗? 通过 BigQuery UI 【参考方案1】:

您列出了 14 个权限,并且似乎假设这些权限允许删除 BQ 表。

这个假设看起来很奇怪(因为显然权限bigquery.tables.delete 不在列表中)实际上是不正确的。这意味着分配了由这 14 个权限组成的角色的 GCP IAM 身份(用户或服务帐户)将无法删除 BQ 表。这反过来意味着您正在测试的身份被分配了额外的角色和/或未考虑的权限。

要证明假设不正确,请以项目管理员身份打开 BQ Console,然后单击 Cloud Shell 图标以启动 Cloud Shell VM。然后在命令提示符处执行以下命令替换<project-name>

# Prove the current user is BQ admin by creating 'ds_test1' dataset,
# 'tbl_test1' table, then deleting and recreating the table
bq mk ds_test1
bq mk -t ds_test1.tbl_test1
bq rm -f -t ds_test1.tbl_test1
bq mk -t ds_test1.tbl_test1

# Create role `role_test1`
gcloud iam roles create role_test1 --project <project-name> --title "Role role_test1" --description "My custom role role_test1" --permissions bigquery.jobs.create,bigquery.jobs.get,bigquery.jobs.list,bigquery.jobs.listAll,bigquery.readsessions.create,bigquery.routines.get,bigquery.routines.list,bigquery.savedqueries.get,bigquery.saved
queries.list,bigquery.tables.export,bigquery.tables.getData,bigquery.tables.list,bigquery.transfers.get,resourcemanager.projects.get --stage GA

# Create service account 'sa-test1'
# It is a good security practice to dispose of it when testing is finished
gcloud iam service-accounts create sa-test1 --display-name "sa-test1" --description "Test SA sa-test1, delete it when not needed anymore" --project <project-name>

# Grant the role (and its permissions) to the service account
gcloud projects add-iam-policy-binding <project-name> --member=serviceAccount:sa-test1@<project-name>.iam.gserviceaccount.com --role projects/<project-name>/roles/role_test1

# Save the credential of the service account (including the security sensitive
# private key) to a disk file
gcloud iam service-accounts keys create ~/key-sa-test1.json --iam-account sa-test1@<project-name>.iam.gserviceaccount.com

# Impersonate the service account. This replaces the current permissions with
# that of the service account
gcloud auth activate-service-account sa-test1@<project-name>.iam.gserviceaccount.com --key-file=./key-sa-test1.json

# Confirm the ability to list tables
bq ls ds_test1

# Confirm inability to delete tables
# The command fails with error: BigQuery error in rm operation: Access Denied: Table <project-name>:ds_test1.tbl_test1: User does not have bigquery.tables.delete permission for table <project-name>:ds_test1.tbl_test1.
bq rm -f -t ds_test1.tbl_test1

# Close SSH connection to the VM and logoff
exit

要查看授予上面创建的服务帐号“sa-test1”的角色,请打开 Cloud Shell 并执行:

gcloud projects get-iam-policy <project-name> --flatten="bindings[].members" --filter="bindings.members:serviceAccount:sa-test1@<project-name>.
iam.gserviceaccount.com"

它应该列出我们的角色projects/&lt;project-name&gt;/roles/role_test1。 要查看授予可以删除表的用户的角色,请执行:

gcloud projects get-iam-policy <project-name> --flatten="bindings[].members" --filter="bindings.members:user:<email-of-the-user>"

【讨论】:

【参考方案2】:

我做了一些测试。

当用户拥有列出的 14 项权限时,他们甚至无法在 UI 上看到 BigQuery 数据集。为此,必须将bigquery.datasets.get 权限添加到自定义角色。

即使拥有 15 个权限,他们也无法删除 BigQuery 表,因此您走在正确的道路上。

能够删除表表示用户没有分配创建的自定义角色或具有来自其他角色的更多权限。请:

检查角色是否设置正确(我的场景有 15 个权限)。为您的自定义角色分配权限时,请务必保存更改。

在您的IAM Dashboard 中,请仔细检查用户是否将此角色链接到他们的帐户。

还要检查用户是否没有其他角色,如所有者、编辑者、BigQuery 管理员、BigQuery 数据编辑者等。如果他们有任何这些额外角色,他们的权限使他们能够删除 BigQuery 表。

最后,仔细检查谁登录了用户界面,您可以通过单击 GCP 用户界面右上角的照片进行检查。用户不应看到与myUser@emaildomain.com 不同的帐户,如下图所示

希望这有帮助!

【讨论】:

非常感谢您的额外努力。我们现在正在尝试,会让大家知道结果。

以上是关于阻止用户删除 BigQuery 表的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery - 根据时差删除行

使用 scala 从 spark 中删除 bigquery 表

BigQuery - 使用更改/删除的记录更新表

有没有办法在 bigquery 中删除表列?

如果表在保留期内被删除,Bigquery 是不是收费?

BigQuery 标准 SQL - 删除多个表