先日、初めて**行レベルセキュリティ(RLS:Row Level Security)**を使ってみました。
MS社のサポートの方にも色々教えていただきながらどうにか実装できたので、備忘として書いておきたいと思います。
なお、RLSは、有料版ライセンスを使用し、PowerBI Service上で複数人のメンバーにレポートを共有している場面に活用できる機能です。(「アプリのワークスペース」を使用します。)
##RLSでできること
組織のメンバーに「各自の担当の分のデータだけを見せたい」というときに便利な機能です。
たとえば、次のような見せ方をしたいとき。
役割 | 見せたいもの |
---|---|
A店の責任者 | A店の売上だけ |
B店の責任者 | B店の売上だけ |
一般担当 | 自分の売上だけ |
##RLSの動作
RLSは、データセット自体にフィルタを掛ける仕組みです。
各ユーザーがレポートからExcelにデータを抽出したり、データセットをダウンロードしても、自分の役割分以外のデータは含まれないようになります。
つまり、「各自担当分以外を見せたくない」という場合に適します。
##RLSの実装の流れ
Power BI Desktop側の作業と、Power BI Service側の作業があります。
###1. Power BI Desktop側
「役割(ロール)」と「その役割に見せるデータの条件(フィルタ)」を指定します。
###2. Power BI Service側
1で作成した役割にひもづけるメンバーを指定します
##Power BI Desktopでの作業
なんの店だか分かりませんが、次のようなデータセットがあったとして、
チャトラさんが駅前店の責任者、ハチワレさんが公園店の責任者とします。
###役割(ロール)の作成
「モデリング>ロールの管理」をクリックし、出てきた画面で「作成」クリックします。
ロール名を付けたら、中段でフィルターを掛けたいテーブルを選び、右段でフィルター条件をDAX式で記入します。
同じように、他のロールも設定し、保存します。
以上で次のような役割(ロール)を設定しました。
役割(ロール) | 条件 |
---|---|
駅前店責任者 | [店舗名] = "駅前店" |
公園店責任者 | [店舗名] = "公園店" |
一般担当 | [ID] = userprincipalname() |
####userprincipalname()について
「userprincipalname()」は、レポート閲覧時に、**閲覧者のID(メールアドレス)**を返します。したがって、上記の「一般担当」では、[ID]列が閲覧者のIDと一致する行だけにフィルタされます。
###Desktopでのプレビュー
それぞれの役割・ユーザーに対して、どのような見かけになるかをプレビューすることができます。
「モデリング>ロールとして表示」をクリックします。
####「駅前店責任者」のプレビュー
####「一般担当(ミケさん)」のプレビュー
userprincipalname()でフィルタした役割では、同時に「その他のユーザー」を選択してプレビューしたいメンバーのメールアドレスを入れます。
Desktopでの作業が終わったら、アプリのワークスペースに発行します。
##サービスでの作業
###役割にメンバーを追加する
「データセット>3点(…)メニュー」をクリックし、「セキュリティ」を選択。
各役割のメンバー欄に、該当するメンバーのメールアドレスを記入し、「追加」をクリックします。
###メンバーをグループで追加する場合
該当するメンバーの数が多いとき、1人1人で登録しているとメンテナンスも大変です。
そんな場合メンバーは、セキュリティグループでも追加できます。
サポートに確認していただいたところによると、現在、次のグループで指定できるそうです。
- セキュリティーグループ (メール無)
- セキュリティーグループ (メール有)
- 配布リスト
####参考:AD(オンプレ)の場合
オンプレミスのADをOffice365に同期させている環境で試したところ、セキュリティグループはRLSの役割にメンバー登録はできるのですが、閲覧したときにRLSが作動しませんでした(メンバーになっていない扱い)。
そこで、ExchangeOnlineの配布グループでラップして登録したところ、無事RLSが働きました。
###サービスでのプレビュー方法
サービスでも、それぞれの役割・ユーザーに対して、どのような見かけになるかをプレビューすることができます。
RLS設定画面の3点メニューから、「ロールとしてテスト」をクリックします。
一度プレビュー画面になると、青い帯の部分で、プレビューしたいユーザーを変えることができます。
上記のように、サービスの方では役割にメンバーを追加済みのため、メールアドレスの指定のみで、そのユーザーのプレビューを見ることができます。
##補足:役割と見え方
#####兼務の場合
複数の役割を兼務すると、和集合(OR)になります。
(A店責任者とB店責任者をかねると、両方のデータが閲覧できます)
#####役割を持たない場合
どの役割にもアサインされていない場合は、データを見ることができません。
#####編集権限を持つ場合
ワークスペースの編集権限を持つユーザーは、役割へのアサインにかかわらず、全てのデータを閲覧できます。
##注意:メールの受信登録設定
Power BIサービスには、データが更新されるたびにレポート画面のキャプチャをメールで受信する機能があります。
通常、編集権限のあるユーザーは、自分以外のユーザーを送信先に設定できるのですが、RLS設定のあるデータセットを利用して作成されたレポートでは、本人しか送信先に設定できません。
##公式リファレンス
下記に、詳しい説明と、上記以外の制限事項等も掲載されているので、ご参照ください。
##補足:RLSを使わないで、自担当分だけを表示させる
元のデータセットにはフィルターをかけなくてもよい(隠したいわけではない)が、レポートの特定ビジュアルで「担当分だけ」を見せたいという場合があります。
たとえば、今回の例でいうと、店の責任者さんには、「店舗全体の情報」も見せたいが、同時に「自担当分だけ売上」のリストも提供したいということが考えられます。
そのような場合には、「userprincipalname()」を含むメジャーを作成し、そのメジャーをビジュアルフィルターに適用することで、実現できます。こちらの方法については、また別の機会に書いてみたいと思います。
(実は、本当はこちらを実現したかったのですが、当初やり方がわからずにRLSを実装することにしたのでした。。。)
当初、RLSの「編集権限があると全行見える」「RLSでフィルタをかける前の合計値と共存できない」という部分について「何だか不便だなー」と思っていたのですが、RLSは、名前のとおり「許可されたデータ以外を見せないようにする」というセキュリティの機能なので、これは当然の仕様なんですね。
最後になりましたが、まだまだ勉強し始めの身につき、内容についてご指摘・アドバイスなどありましたら、やさしく教えていただけますと大変うれしいです。