BigQuery指定项目授权、跨项目访问限制与查询审计问题
针对BigQuery跨项目查询审计与访问范围限制的解答
问题1:是否支持查看所有项目下访问BigQuery指定表/数据集的全部查询记录?
默认不支持直接在数据集所属项目下查看跨项目运行的查询记录——BigQuery查询作业的元数据、操作日志默认仅归属到作业实际运行的项目,这就是审计缺口出现的根因。
可以通过组织级日志聚合实现全量查询记录的追溯,操作路径如下:
- 由组织管理员开启组织级别的Cloud Audit Logs,勾选BigQuery服务的全部数据访问类日志(包括作业提交、数据读取事件),这个配置会强制覆盖组织下所有项目,不需要单个项目单独操作。
- 配置组织级日志聚合接收器,将组织下所有项目的BigQuery审计日志统一投递到你持有的集中日志存储项目的BigQuery数据集中,实现全量日志的中心化存储。
- 日志投递完成后,直接在集中日志数据集上执行SQL筛选即可定位所有访问目标数据集的查询,参考查询语句:
SELECT protoPayload.authenticationInfo.principal_email AS operator_account, resource.labels.project_id AS query_run_project_id, protoPayload.serviceData.jobQueryRequest.query AS executed_sql, protoPayload.metadata.tableDataRead.referencedTables AS referenced_table_list, timestamp AS query_execute_time FROM `central_log_project_id.audit_logs.cloudaudit_googleapis_com_data_access_*` WHERE protoPayload.serviceName = 'bigquery.googleapis.com' AND protoPayload.methodName LIKE '%JobQuery%' AND EXISTS ( SELECT 1 FROM UNNEST(protoPayload.metadata.tableDataRead.referencedTables) AS t WHERE STARTS_WITH(t, 'projects/dataset_owner_project_id/datasets/target_dataset_name/') )
注意:如果查询作业运行在你组织管辖范围外的项目(比如外部顾问的个人云账号下的项目),组织级日志无法抓取这部分作业信息,这类审计缺口需要配合下面的访问限制方案封堵。
问题2:是否存在可行方案,限制可访问指定BigQuery数据集的项目范围?
存在成熟的落地方案,按隔离可靠性从高到低排序如下:
- 首选方案:VPC Service Controls服务边界硬隔离
这是GCP官方推荐的生产级隔离方案:- 将存放目标数据集的项目加入专属服务边界,为BigQuery服务开启边界防护
- 配置边界入站规则,仅允许你授权范围内的项目(比如内部统一作业运行项目、给外部顾问单独开通的专用访问项目)内的身份跨项目访问边界内的BigQuery资源
- 规则生效后,即使用户持有目标数据集的合法IAM权限,只要提交查询的项目不在允许列表中,BigQuery会直接拒绝请求,从根源上阻断未授权项目的访问路径。
- 轻量方案:IAM条件访问软限制
如果暂时不具备启用VPC SC的条件,可以通过IAM条件做临时限制:- 给用户/用户组授予数据集访问权限时,在IAM绑定关系上添加条件表达式,仅当查询作业的发起项目在你指定的允许列表内时,对应的访问权限才生效
- 参考条件表达式:
bigquery.job.projectId in ['allowed_project_id_1', 'allowed_project_id_2'] - 该方案的隔离能力依赖IAM配置的准确性,存在配置疏漏导致的绕过风险,仅适合小规模非核心场景使用。
- 针对外部顾问这类外部身份场景,额外建议:不要直接给外部身份授予生产数据集的原生读取权限,统一为其分配组织内专用项目的作业提交权限,所有访问生产数据集的路径通过VPC SC锁死,配合集中审计日志做日常巡检,就可以彻底解决跨项目查询无法追溯的问题。
内容的提问来源于stack exchange,提问作者Sabri Karagönen
相关产品推荐
相关产品推荐

