[第5回] Tableauでの行レベル/列レベルセキュリティの実現方法あれこれ
miyabiiです。
Tableauサイト管理者 兼 DATA Saber挑戦中のApprenticeとして、考えたことや学んだことをシェアしていきます。
第5回は、Tableauとデータベース(DB)の権限制御の機能分担について、前回の続き。Tableauでの行レベル/列レベルセキュリティの実現方法をまとめます。
自分の管理するサイトでは、TableauではなくDBで権限制御を実装することにしたのですが、要件によってはTableauの機能を使うケースがあるので、Tableauでどこまでできるのかを調べてみました。
行レベルセキュリティと列レベルセキュリティ Tableauでできる?
Tableauでできることサマリ
行レベルセキュリティを実現する方法は Tableau の内部と外部で複数あり、それぞれに長所と短所があります。
列レベルセキュリティを適用するTableauの機能はありませんが、回避策はいくつか方法があります。
行レベルセキュリティ
行レベルセキュリティ(Row Level Security, RLS)とは
行レベルセキュリティは、データベース内の個々の行に対してアクセス制御を行うことを指します。これにより、特定のユーザーが特定の行のみにアクセスできるように制限することができます。例えば、カスタマーの個人情報を保持するデータベースにおいて、各ユーザーが自分の担当するカスタマー情報のみを閲覧できるようにすることが行レベルセキュリティの一例です。
行レベルセキュリティを使うシーン
BIツールなどを使用する際に、所属の部署に関連するデータにしかアクセスできないようにする。
マルチテナントのシステムにおいて、顧客のデータへのアクセスをその顧客に関連するデータだけに制限する。
アクセス制御のロジックがデータベースで行われるため、アプリケーションでセキュリティの設計やコーディングを簡素化でき、データベースそのものでアクセス制御を行うため、外部からのアクセスの観点からシステム全体のセキュリティに対する信頼性と堅牢性が向上するとされています。
Tableauでの行レベルセキュリティの実装方法
Tableau で行レベルのデータセキュリティを実現するにはいくつかの方法があります。簡単にそれぞれの概要をまとめます。
(1)手動ユーザフィルタ
(2)動的ユーザフィルタ
(3)データソースフィルタで(2)を実装する
(4) データ ポリシーを使用した動的フィルタ
(5)DBへのアクセス時の偽装 ※SQL Server等の一部DBのみ
(6)DBの行レベル セキュリティを利用
(1)手動ユーザフィルタ
データを Tableauにパブリッシュする時に手動でマッピングする方法。最も簡単なのでテストで使うには良いが、メンテが大変なため、セキュリティや継続性に配慮が求められるビジネスでの実利用には向かない。
「ユーザフィルタの作成」でフィルタ項目を選択して、フィルタ項目がどの値の場合にどのユーザに表示するかを指定できます。
詳細はTableauヘルプ「手動でユーザ フィルタを作成し、ユーザを値にマッピングする」を参照。
(2)動的ユーザフィルタ
ユーザーをデータ値へマッピングするプロセスを自動化する計算フィールドを作成します。
例えば、計算フィールドで、USERNAME() 関数で取得したログインユーザと、データソースの[User]が一致する場合、フィルタを使ってその行を表示することができます。
詳細はTableauヘルプ「データのセキュリティ フィールドを使用して動的フィルタを作成する」を参照。
(3)データソースフィルタで(2)動的ユーザフィルタを実装する
(2)をデータソースフィルタで行うことで、データが Tableau でインポートされる前にユーザーフィルタを有効にすることができます。(2)よりパフォーマンスに優れます。
個人的には、Tableauで実装する(1)~(5)のなかでは、ビジネスでの実利用シーンに最も適用しやすそうだと感じました。
(4) データ ポリシーを使用した動的フィルタ
ユーザーは仮想接続のデータ ポリシーを通じて行レベルのセキュリティを実装できます。一元化でき安全でメンテナンスも容易だが、データ管理オプションの購入が必要(なので私のサイトでは選択肢に挙がらないかな・・・)。
詳細はTableauヘルプ「仮想接続とデータ ポリシーについて」を参照。
(5)DBへのアクセス時の偽装 ※SQL Server等の一部DBのみ
一部のDB (Microsoft SQL Server など) では、行レベルセキュリティフィルタが組む込まれたビューのみにデータベースのユーザーがアクセスできるように設定することができます。Tableau では、"偽装" と呼ばれる概念を使用してこれを活用できます。
利用できるDBが限られるのが難点です。
(6)DBの行レベル セキュリティを利用
Tableauの外で行レベルセキュリティを実装し、Tableauにはフィルタ済のデータが連携されます。
すでにDB側にこの機能がある場合は、(6)が第一選択。ただし、ライブ接続を前提とするため、パフォーマンス観点で抽出を利用したい場合にはフィルタリングされない点に注意が必要です。
列レベルセキュリティ
列レベルセキュリティとは
列レベルセキュリティは、データベース内の個々の列に対してアクセス制御を行うことを指します。これにより、特定のユーザーが特定の列のみにアクセスできるように制限することができます。例えば、所属と給与のデータを含むデータベースにおいて、一般従業員は所属の列にアクセスできるが給与支給額の列にはアクセスできないようにすることが列レベルセキュリティの一例です。
列レベルセキュリティを使うシーン
Tableauでの列レベルセキュリティの実装
Tableauでは列レベルセキュリティを適用する機能はありませんが、回避策はいくつか方法があります。簡単にそれぞれの概要をまとめます。
(1)データソースで列のフィルタを作成する
(2)複数のデータセットとその連携するダッシュボードの作成
(3)データベースへのアクセス時の偽装 ※SQL Server等の一部DBのみ
(4)DBの列レベル セキュリティを利用
(1)データソースで列のフィルタを作成する
計算フィールドで、ユーザー関数 ismemberof() を使用し、グループのメンバである場合に、特定の列を表示する と設定します。次に、その列を非表示にしてパブリッシュすると、指定したグループのメンバ以外は、その列が見えなくなります。
フィルタする列の数だけ計算フィールドを作成したり、グループを作成する手間がかかるので、メンテ負荷が高い方法といえます。
(2)複数のデータセットとその連携するダッシュボードの作成
保有する列の異なるソースデータを複数作成する方法です。ETL ツールの利用によりソースデータ作成は自動化できるため、複数のソースデータ作成・管理は容易ですが、それぞれのソースデータに接続するコンテンツの作成に手間がかかります。これもメンテ負荷が高い方法です。
(3)データベースへのアクセス時の偽装 ※SQL Server等の一部DBのみ
行レベルセキュリティと同様。利用できるDBが限られるのが難点です。
(4)DBの列レベル セキュリティを利用
行レベルセキュリティと同様。(1)~(3)が現実的な選択肢とならない場合、DBの機能を利用できるのであれば、これが最善ではないでしょうか。
まとめ
行レベルセキュリティは、実装方法が複数あり、メリデメを考えて選択できることが分かりました。一方、列レベルセキュリティは、Tableauでできることは限られています。ケースバイケースとはいえ総じて、Tableauでやるよりデータ処理はDBに任せたほうがよいと感じました。
【backnumber】
[第1回]TableauのExplorerライセンスは、どういう時に使うのか?
[第2回] Tableauのパーミッションはベストプラクティスを死守すべし!
[第3回] 新しい運用ルールの決め方 ~パーミッション続編
[第4回] 権限制御はどこに実装する? ~Tableauとデータベースの機能分担について
[第5回] Tableauでの行レベル/列レベルセキュリティの実現方法あれこれ
[第6回] Tableauからデータベースへのアクセス時の認証について
[第7回] 失敗例から学んでほしいダメなTableauの使い方
[第8回] クリーニングから始まるTableau Cloud移行
[第9回] Vizが遅い?! ~TableauCloud移行で性能に悩んだ話