{GCP BigQuery}行レベルのセキュリティを使用する

https://cloud.google.com/bigquery/docs/managing-row-level-security?hl=ja
https://cloud.google.com/bigquery/docs/using-row-level-security-with-features?hl=ja#the_true_filter

-- 1. 前作業

gcloud init
gcloud auth list

gcloud --version

gcloud projects create project01-9999999 \
--name="project01"

gcloud config list
gcloud config set project project01-9999999
gcloud config set compute/region asia-southeast1 --quiet
gcloud config set compute/zone asia-southeast1-a --quiet

gcloud beta billing accounts list
gcloud beta billing projects link project01-9999999 --billing-account=111111-111111-111111

gcloud services enable compute.googleapis.com --project project01-9999999

gcloud components update

 

-- 2. BigQuery API有効化

gcloud services list --enabled


gcloud services enable bigquery.googleapis.com \
--project project01-9999999

 

-- 3. BigQueryデータセットを作成する

CREATE SCHEMA ds01;

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
order by schema_name
;

 


-- 4. テストテーブルの作成

CREATE TABLE ds01.tab1
(
  col1 NUMERIC
, col2 STRING
, col3 TIMESTAMP
)
;

 

select * from ds01.INFORMATION_SCHEMA.TABLES
order by table_name
;

SELECT * FROM ds01.INFORMATION_SCHEMA.COLUMNS
order by table_name,column_name
;


insert into ds01.tab1 values(100,'A',current_timestamp());
insert into ds01.tab1 values(200,'B',current_timestamp());


select * from ds01.tab1;


-- 5. 行レベルのアクセス ポリシーを作成する

col2 = 'A'の行だけ「hoge@example.com」に許可する場合


CREATE ROW ACCESS POLICY rap01
ON ds01.tab1
GRANT TO ('user:hoge@example.com')
FILTER USING (col2 = 'A');


bq ls --row_access_policies ds01.tab1


-- 6. 動作確認
select * from ds01.tab1;

select * from ds01.tab1 where col2 = 'A';

select * from ds01.tab1 where col2 = 'B';


※ 行アクセスポリシーを設定するとプロジェクトオーナーであっても、すべて下記となり参照できなくなる。
TRUE フィルタを作成する必要がある。

表示するデータはありません。


hoge@example.com」でログインすると
col2 = 'A' のデータだけ表示される。

SQLにcol2 = 'A'の条件が追加されているような挙動となる

 

 


-- 7. クリーンアップ

 

gcloud projects list

gcloud projects delete project01-9999999 \
--quiet