Snowflake列レベル・行レベルセキュリティ入門|ポリシーの作り方

Snowflake列レベル・行レベルセキュリティ入門|ポリシーの作り方 Snowflake

はじめに:なぜ列・行レベルでアクセス制御するの?

Snowflakeを業務で使い始めると、「営業部の人には自分の担当地域の売上だけ見せたい」「メールアドレスは管理者以外にはマスクしたい」といった細かいアクセス制御が必要になります。テーブル単位の権限(Snowflake RBAC)だけでは、こうした「同じテーブルでもユーザーによって見える範囲を変えたい」というニーズには対応できません。

そこで登場するのが、列レベルセキュリティ(Column-level Security)行レベルセキュリティ(Row-level Security)です。この記事では、それぞれのポリシーの作り方をやさしく解説します!

Snowflake列レベル・行レベルセキュリティ入門|ポリシーの作り方

2種類のポリシーの基本概念

列レベルセキュリティ(マスキングポリシー)

「特定のカラムの値を、ユーザーのロールに応じて隠す/伏せ字にする」仕組みです。例えばemail列を、管理者にはそのまま見せ、一般社員には***@example.comのように見せられます。これはSnowflake動的データマスキングとして実装されます。

行レベルセキュリティ(ROW ACCESS POLICY)

「特定の行そのものを、ユーザーに見せるかどうか制御する」仕組みです。例えば「東京支店のロールには東京支店の行だけ表示」のように、WHERE句が自動で付与されるようなイメージです。

列レベル:マスキングポリシーの作り方

まずはCREATE MASKING POLICYでポリシーを作り、テーブル列に適用します。

-- ① ポリシーを作成
CREATE MASKING POLICY email_mask AS (val STRING)
RETURNS STRING ->
  CASE
    WHEN CURRENT_ROLE() IN ('HR_ADMIN') THEN val
    ELSE REGEXP_REPLACE(val, '.+@', '***@')
  END;

-- ② 列に適用
ALTER TABLE employees
  MODIFY COLUMN email
  SET MASKING POLICY email_mask;

これでHR_ADMINロール以外がSELECTすると、メールアドレスが伏せ字で返されます。

行レベル:ROW ACCESS POLICYの作り方

行を絞り込みたい場合はCREATE ROW ACCESS POLICYを使います。ポリシーはBOOLEANを返す関数で、TRUEを返した行だけがユーザーに見えます。

-- ① ポリシーを作成(支店ごとに行をフィルタ)
CREATE ROW ACCESS POLICY branch_policy AS (branch STRING)
RETURNS BOOLEAN ->
  CURRENT_ROLE() = 'ACCOUNTADMIN'
  OR branch = CURRENT_ROLE();  -- ロール名と支店名を一致させる例

-- ② テーブルに適用
ALTER TABLE sales
  ADD ROW ACCESS POLICY branch_policy ON (branch);

こうすればTOKYOロールでログインしたユーザーは、branch='TOKYO'の行しか見えなくなります。ACCOUNTADMINはすべて見えるので、運用上も安心です。

行レベル:ROW ACCESS POLICYの作り方の解説図

使うときの注意点

  • 1テーブルにつきROW ACCESS POLICYは1つだけ適用可能です。複数の条件を組み合わせたい場合はポリシー本体のCASE式で表現します。
  • マスキングポリシーは同じデータ型同士でしか適用できません(STRING列にはSTRING用ポリシー)。
  • ポリシーを作るにはSECURITYADMINまたは専用のカスタムロールが推奨されます。詳しくはカスタムロールとGRANT/REVOKEの記事も参考にしてください。
  • ポリシーはALTER TABLE ... DROP ROW ACCESS POLICYで外せます。

まとめ

列レベル・行レベルセキュリティを使えば、同じテーブルでもユーザーごとに見える範囲をきめ細かく制御できます。RBACで「テーブルにアクセスできるか」を決め、ポリシーで「何が見えるか」を絞る、という二段構えで運用するのが王道です。個人情報や売上データを扱う現場では必須の機能なので、ぜひ手元で試してみてくださいね!

参考リンク

関連記事