
Omni のアクセスフィルターを使って列レベルのセキュリティを設定してみた
こんにちは、ikumiです。
以前、アクセスフィルターを使って行レベルのセキュリティを設定する方法を試してみました。
今回はその続きとして、「特定のフィールド(個人情報・単価など)は一部のユーザーにしか見せたくない」という列レベルのアクセス制御に挑戦します。
Omni の**アクセス権(Access Grants)**を使うと、ユーザー属性の値に基づいて特定のフィールドへのアクセスを制御できます。条件を満たさないユーザーにはフィールドそのものが非表示になります。今回は列(フィールド)レベルのセキュリティ設定を試してみました。
機能概要
アクセス権(Access Grants)は「どのユーザー属性のどの値を持つユーザーにアクセスを許可するか」をモデルレベルで定義し、それを個別のフィールドやトピックに適用する仕組みです。条件を満たさないユーザーには対象のフィールドが Explore のフィールド一覧から非表示になります。
事前準備
アクセス権もアクセスフィルターと同様に、ユーザー属性と組み合わせて動作します。まずユーザー属性を設定します。
ユーザー属性(User Attributes)を作成する
Settings → Attributes から New Attribute をクリックし、以下の内容でカスタム属性を作成します。今回は個人情報(PII)を閲覧できるかどうかを管理する can_see_pii 属性を作成します。
| 項目 | 設定値 |
|---|---|
| Name | Can See PII |
| Reference | can_see_pii |
| Type | string |
| Multiple values | OFF |
| Default value | (空白のまま) |

ユーザーに属性値を割り当てる
PII の閲覧を許可するユーザーには true、許可しないユーザーには値を設定しない(空白)状態にします。

試してみた
1. モデルファイルで access_grants を定義する
アクセスフィルターはトピック(またはモデル)ファイルに直接 access_filters を書くだけで設定が完結しましたが、アクセス権は少し異なります。まずモデルファイルでアクセス権を定義し、次にそのアクセス権を適用したいフィールドやトピックに紐付ける、という2段階の設定になります。
モデルファイル(model.yaml)に access_grants を追加します。
access_grants:
can_see_pii:
user_attribute: can_see_pii
allowed_values: [ "true" ]
can_see_pii:このアクセス権の名前です。後でフィールドに紐付けるときに使いますuser_attribute:参照するユーザー属性の reference 名allowed_values:アクセスを許可するユーザー属性の値。trueを持つユーザーだけがアクセス可能になります
2. フィールドに required_access_grants を付与する
PII に該当するフィールドに required_access_grants を追加します。今回は brand_ana__customer ビューの customer_name フィールドに適用します。
customer.view.yaml を以下のように編集します。
dimensions:
name:
sql: '"customer_name"'
label: 顧客名
required_access_grants: [ can_see_pii ]
3. アクセス権があるユーザーにはフィールドが表示されることを確認する
can_see_pii = true のユーザーで対象のトピックを開きます。フィールド一覧に 顧客名 が表示されていれば問題ありません。

4. アクセス権がないユーザーにはフィールドが非表示になることを確認する
can_see_pii が未設定のユーザーで同じトピックを開きます。フィールド一覧に 顧客名 が表示されていなければ問題ありません。

5. required_access_grants の注意点とマスキングによる代替アプローチ
required_access_grants はフィールドをフィールド一覧から非表示にしますが、注意点があります。すでにそのフィールドを使っているクエリやダッシュボードをアクセス権のないユーザーが開いた場合、ビュー全体が権限エラーで表示されなくなります。「フィールドを非表示にしたいが、既存のクエリは引き続き動かしたい」という場合には別のアプローチが有効です。
ユーザー属性を使ったSQL側でのマスキング
フィールドの SQL 定義にCASE 文を書くことで、ユーザー属性の値に応じて表示する値を切り替えられます。
dimensions:
customer_name:
sql: |-
CASE
WHEN {{ omni_attributes.can_see_pii }} = 'true'
THEN ${customer_name}
ELSE 'No Access'
END
label: 顧客名
この方法ではフィールド自体は全ユーザーに表示されたままで、値だけが切り替わります。
▼権限を持っているユーザー

▼権限を持っていないユーザー

最後に
Omni のアクセス権(Access Grants)を使って、特定のフィールドへのアクセスをユーザー属性の値に基づいて制御してみました。
列レベルのアクセス制御には2つのアプローチがあります。required_access_grants はフィールドの存在ごと隠したい場合に有効ですが、例えば既存ダッシュボードの構成を壊さずに値だけを隠したい場合は SQL 定義に {{omni_attributes.xxx}} のCASE文を使ったマスキングが適しています。要件に合わせて使い分けてみてください。






