metabase-permission-model

Metabaseの権限モデル入門

 
0
このエントリーをはてなブックマークに追加
Kazuki Moriyama
Kazuki Moriyama (森山 和樹)

Metabaseの権限モデル入門

Metabaseでは、閲覧者と分析者で必要な権限が違う。閲覧者には作成済みの表やグラフだけを見せたい。分析者には元データから新しい分析を作らせたい。Metabaseは、この2つを別の権限として扱う。

用語と権限の2軸

Metabaseの権限は、database、question、dashboard、collectionといった管理対象に紐づく。

用語 ここでの意味
database Metabaseが接続するデータベース。分析の元になるデータソース。
table / field databaseの中にある表と列。売上テーブル、顧客ID列のような単位。
question Metabaseで保存した1つの分析。クエリ、結果、グラフ設定を持つ。
dashboard 複数のquestionを並べた画面。利用者が日常的に見る分析画面。
collection questionやdashboardを置く層。誰に見せるか、誰が編集できるかもここで決まる。
model / metric よく使う分析の入口と、チームで使う数値の計算定義。

Metabaseの権限は次の2種類に分かれる。

視点 Metabaseの権限 決めること
見る collection権限 保存済みのquestionやdashboardを誰に見せるか。誰が編集できるか。
作る data permission(データ権限) databaseやtableを使って新しい分析を作れるか。

dashboardの表示は、保存済みのquestionやdashboardが置かれたcollectionへの権限で決まる。そのため、dashboardを共有するだけなら、元データを自由に調べるdata permissionまで渡す必要はない。

一方、新しいquestionを作る人は、画面で元データに対するqueryを組み立てる。そのため、参照先のdatabaseやtableへのdata permissionも必要になる。

ただし、「見る」と「作る」は権限の種類であり、権限を置く対象そのものではない。Metabaseの管理対象は4つの層に分けられる。元データ、意味付け、保存済み分析、整理と共有である。この層単位で、どこに「見る」権限と「作る」権限を置くかを特定できる。3つに絞ると、modelやmetricのような分析用の入口が、元データか保存済み分析かが曖昧になりやすい。

  • 元データ層
  • 意味付け層
  • 保存済み分析層
  • 整理と共有層

これはMetabase公式の分類名ではなく、権限の置き場所を整理するための区分である。

権限設計の対象を4つの層に分ける

4つの層は、dashboardを開いたときにどの管理対象を経由して元データへたどるかを示す構造である。

主な管理対象 権限設計で見ること
元データ層 database / schema / table / field どのデータソースを見せるか。どのtableやfieldを探索対象にするか。
意味付け層 metadata / semantic type / model / metric 分析用の入口や公式な集計定義をどこに置くか。
保存済み分析層 question / dashboard 利用者が開く保存済みの分析や画面はどれか。
整理と共有層 collection question、dashboard、modelをどの層に置き、誰に見せるか。
flowchart TD subgraph L4["整理と共有層"] COL["collection"] end subgraph L3["保存済み分析層"] DSH["dashboard"] Q["question"] end subgraph L2["意味付け層"] MM["model / metric"] end subgraph L1["元データ層"] TF["table / field"] end COL -.->|"誰に見せるか"| DSH DSH --> Q Q --> MM MM --> TF Q --> TF

元データ層のdatabase、table、fieldは、Metabaseが接続先データベースから同期する構造である。権限設計では、まずここで「そもそも見せてよいデータか」を見極める。

意味付け層は、元データを分析に使いやすくする層である。Metabaseのmodelsは、よく使う分析の入口に整えた派生テーブルとして扱える。新しいquestionの出発点にもなる。metricsは、チームで使う重要な数値の公式な計算方法である。

保存済み分析層では、questionとdashboardを区別する。questionはクエリ、結果、可視化を保存した分析単位で、dashboardは複数のquestionを並べる画面である。利用者に見えるのはdashboardでも、権限上はdashboard内のquestionと参照元tableまでたどる必要がある。

整理と共有層のcollectionは、単なるフォルダではない。Metabaseのcollection permissionsは、保存済みquestion、dashboard、modelを誰に見せるかを決める。編集や移動を誰に許すかもcollectionで決める。

権限モデルは2軸で重ねる

Metabaseの権限モデルは、collection権限とdata permissionの2軸で構成される。collection権限は、保存済みdashboardやquestionを開けるかを決める。data permissionは、元データにqueryを作れるかを決める。この対応を分けると、閲覧できない原因とqueryを作れない原因を別々に追える。

flowchart TD U["利用者の操作"] U --> A["保存済みdashboard / questionを見る"] U --> B["新しいquestionを作る"] A --> C{"collection権限"} B --> D{"data permission"} C -->|"View / Curate access"| E["保存済みコンテンツを表示"] C -->|"No access"| F["閲覧できない(403)"] D -->|"Create queries あり"| G["元データにqueryを作成"] D -->|"Create queries なし"| H["queryを作れない(403)"]
権限の軸 対象 決めること
collection権限 collection内のquestion / dashboard / model 保存済みコンテンツを閲覧、編集、移動できるか。
data permission database / schema / table 元データを見られるか。新しいqueryを作れるか。

この2軸は代替関係ではない。dashboardを見るには、そのdashboardと中のquestionが置かれたcollectionへのaccessが要る。新しいquestionを作るには、参照先databaseやtableへのdata permissionが要る。

group(権限をまとめるユーザー集合)も別に考える。Metabaseの権限はgroup単位で付けるため、ユーザーが複数groupに入ると権限は広い方へ寄る。あるgroupで広いdata permissionを持つユーザーは、別groupで閲覧専用に絞れない。

collection権限は保存済みコンテンツの入口を決める

collection権限にはCurate access、View access、No accessがある。

collection権限 許すこと
Curate access 閲覧に加えて、編集、移動、削除、保存先としての利用を許す。
View access collection内の保存済みitemの閲覧だけを許す。
No access collectionとその中のitemsを見せない。

collection権限は、Metabase内に保存されたdashboard、question、modelへの操作許可である。接続先tableに対して、新しいqueryを作る許可までは含まない。

Metabase公式のdata permissionsドキュメントによると、既存questionのquery変更にはdata permissionsが必要になる。data permissionsは、参照元データ(underlying data)へのアクセス許可を指す。新規question作成にも同じ権限が必要になる。

collectionにreadを持つviewerだけがdashboardを取得できる。grantのないuserは同じdashboardを取得できず、保存済みquestionの実行も403になる。

操作 collection grantあり collection grantなし
dashboardを取得する HTTP 200 HTTP 403
保存済みquestionを実行する HTTP 202 / completed HTTP 403

collection権限は、保存済みコンテンツの入口を制御する。dashboardを共有する場合は、dashboard自体のcollectionを確認する。あわせて、dashboard内のquestionが置かれているcollectionも確認する。

中のquestionが別collectionにあるなら、そのcollectionへのaccessも必要になる。

data permissionは元データの探索範囲を決める

data permissionは、database、schema、tableに対して、どのデータを見られるかを決める。あわせて、どの方法で新しいqueryを作れるかも決める。

Create queriesは新しいquery作成を制御する

API上は、data graphの項目としてview-dataとcreate-queriesが分かれる。create-queriesの値は3段階ある。query-builder-and-nativeは、画面操作(GUI)で組むquery builderと、SQLエディタに直接書くnative queryの両方を許す。query-builderはquery builderだけを許し、native queryによる生SQLは塞ぐ。noは新しいquery自体を作らせず、保存済みquestionの実行だけを残す。

保存済みquestionの閲覧と新しいquery作成は、権限上の対象が違う。Create queriesを外しても保存済みquestionの実行は通る。同じユーザーが同じtableへad-hoc queryを送ると403になる。

ユーザーの状態 保存済みquestion ad-hoc query
View accessあり、Create queriesなし HTTP 202 / completed HTTP 403
Curate accessあり、Create queriesあり HTTP 202 / completed HTTP 202 / completed

つまり、閲覧専用ユーザーにdashboardを見せるために、Create queriesまで渡す必要はない。逆に、分析者が自分で新しいquestionを作るなら、対象data sourceに対するCreate queriesが必要になる。

query-builderは中間の段階である。GUIでの新規探索は許しつつ、native queryによる生SQLは塞ぐ。SQLを直接書かせたくない分析者には、この段階が合う。

View dataのBlockはPro/Enterprise側の機能

View dataは別の論点である。Metabaseのdata permissionsによると、View dataの細かな制御はPro/Enterprise planの機能である。OSSではCan view相当が既定になる。

Metabase OSS版(v0.62.3.2)では、View dataをBlockする要求はplan制限としてHTTP 402で拒否される。

ユースケース1: 社内分析者には探索権限と作業用collectionを渡す

社内分析者は、自分でquestionを作る役割である。必要ならdashboardへ整理する。この場合は、対象databaseにCreate queriesを付ける。

SQLを直接書く必要があるroleだけnative queryを許可する。

対象 設定の考え方
data permission 対象databaseにCreate queriesを付ける。SQLが必要なroleだけnative queryを許可する。
作業用collection Curate accessを付け、questionの保存とdashboardへの配置を許す。

collection側では、作業用collectionにCurate accessを付ける。分析者はquestionを保存し、説明を直してdashboardへ配置できる。

このユースケースでは、分析者向けの広いdata permissionを閲覧者groupと共有しない。group権限は足し算になる。あるgroupで広い権限を持つと、別groupで絞っても広い方が勝つ。

ユースケース2: 閲覧専用ユーザーにはView accessと保存済みquestionだけを渡す

閲覧専用ユーザーは、作成済みdashboardを見るだけの役割である。新しい分析を作らないなら、Create queriesを付けず、閲覧用collectionへのView accessを中心に設計する。

対象 設定の考え方
閲覧用collection dashboardと構成questionを同じcollectionに置き、View accessを付ける。
data permission 新規探索が不要ならCreate queriesを付けない。
作業用collection 試作中のquestionや内部dashboardはNo accessにする。

この組み合わせでは、保存済みquestionの結果は見られるが、新しいad-hoc queryは作れない。保存済みquestionはcompletedになる。同じtableへのad-hoc queryはmissing-required-permissionsで失敗する。

運用上は、dashboardとそれを構成するquestionを閲覧専用collectionへまとめる。questionだけが別collectionにあると、dashboardを開けても一部のカードで権限エラーになる。Metabaseのdocsも同じ条件を説明している。dashboardが他collectionのquestionを含む場合、そのcollectionへのviewまたはcurate accessが必要になる。

ユースケース3: 外部共有ではcollectionと行と列の分離を分ける

共有用collectionは専用にする

外部共有の相手は、顧客や取引先のように社外からMetabaseを参照する人である。見せる対象は共有用dashboardとquestionだけに絞る。専用collectionをView accessにし、Create queriesは付けない。作業用collectionや内部向けdashboardはNo accessにする。

対象 設定の考え方
共有用collection 共有用dashboardとquestionだけを置き、View accessを付ける。
内部向けcollection 作業用collectionや内部dashboardはNo accessにする。
行と列の分離 Metabase Pro/Enterpriseのrow and column security、またはdatabase側のviewやrow-level securityで分ける。

行と列は別層で分ける

collectionを分けても、同じtable内の行は自動では分かれない。たとえば共有先Aと共有先Bの行が同じtableにある場合、dashboardだけを分けても足りない。questionがtable全体を集計すれば、数字は混ざる。

この場合に検討するのがrow and column securityである。Row and column securityはPro/Enterprise planの機能で、同じtableをユーザー属性に応じて違う見え方にする。たとえば共有先IDのuser attributeで、ログインユーザーに対応する行だけを見せる。

制約もある。SQL questionの結果とpublic linkには、row and column securityを後から重ねられない。制限対象の列を含むSQL questionは、admin-only collectionに置く必要がある。public linkはログインユーザーを前提にしないため、user attributeによる行制御の材料がない。

OSSで同じ要件を扱うなら、Metabaseの外側で分ける。共有先ごとのdatabase、schema、viewを作る。もしくは接続先database側のrow-level securityを使う。Metabaseのcollectionは、その分けた後の保存済みコンテンツを見せる層として使う。

info-outline

お知らせ

K.DEVは株式会社KDOTにより運営されています。記事の内容や会社でのITに関わる一般的なご相談に専門の社員がお答えしております。ぜひお気軽にご連絡ください。