Help us understand the problem. What is going on with this article?

Power BI 勉強帳:行レベルセキュリティ(RLS)

More than 1 year has passed since last update.

先日、初めて行レベルセキュリティ(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での作業

なんの店だか分かりませんが、次のようなデータセットがあったとして、
チャトラさんが駅前店の責任者、ハチワレさんが公園店の責任者とします。
image.png

役割(ロール)の作成

モデリング>ロールの管理」をクリックし、出てきた画面で「作成」クリックします。

image.png

ロール名を付けたら、中段でフィルターを掛けたいテーブルを選び、右段でフィルター条件をDAX式で記入します。
image.png

同じように、他のロールも設定し、保存します。
image.png
以上で次のような役割(ロール)を設定しました。

役割(ロール) 条件          
駅前店責任者  [店舗名] = "駅前店"   
公園店責任者  [店舗名] = "公園店"   
一般担当  [ID] = userprincipalname() 

userprincipalname()について

userprincipalname()」は、レポート閲覧時に、閲覧者のID(メールアドレス)を返します。したがって、上記の「一般担当」では、[ID]列が閲覧者のIDと一致する行だけにフィルタされます。

Desktopでのプレビュー

それぞれの役割・ユーザーに対して、どのような見かけになるかをプレビューすることができます。

モデリング>ロールとして表示」をクリックします。
image.png

「駅前店責任者」のプレビュー

image.png

「一般担当(ミケさん)」のプレビュー

userprincipalname()でフィルタした役割では、同時に「その他のユーザー」を選択してプレビューしたいメンバーのメールアドレスを入れます。
image.png
Desktopでの作業が終わったら、アプリのワークスペースに発行します。

サービスでの作業

役割にメンバーを追加する

データセット>3点(…)メニュー」をクリックし、「セキュリティ」を選択。
image.png

各役割のメンバー欄に、該当するメンバーのメールアドレスを記入し、「追加」をクリックします。
image.png

メンバーをグループで追加する場合

該当するメンバーの数が多いとき、1人1人で登録しているとメンテナンスも大変です。
そんな場合メンバーは、セキュリティグループでも追加できます。
image.png

サポートに確認していただいたところによると、現在、次のグループで指定できるそうです。

  • セキュリティーグループ (メール無)
  • セキュリティーグループ (メール有)
  • 配布リスト

参考:AD(オンプレ)の場合

オンプレミスのADをOffice365に同期させている環境で試したところ、セキュリティグループはRLSの役割にメンバー登録はできるのですが、閲覧したときにRLSが作動しませんでした(メンバーになっていない扱い)。
そこで、ExchangeOnlineの配布グループでラップして登録したところ、無事RLSが働きました。

サービスでのプレビュー方法

サービスでも、それぞれの役割・ユーザーに対して、どのような見かけになるかをプレビューすることができます。
RLS設定画面の3点メニューから、「ロールとしてテスト」をクリックします。
image.png

一度プレビュー画面になると、青い帯の部分で、プレビューしたいユーザーを変えることができます。
image.png

上記のように、サービスの方では役割にメンバーを追加済みのため、メールアドレスの指定のみで、そのユーザーのプレビューを見ることができます。

補足:役割と見え方

兼務の場合

複数の役割を兼務すると、和集合(OR)になります。
(A店責任者とB店責任者をかねると、両方のデータが閲覧できます)

役割を持たない場合

どの役割にもアサインされていない場合は、データを見ることができません。

編集権限を持つ場合

ワークスペースの編集権限を持つユーザーは、役割へのアサインにかかわらず、全てのデータを閲覧できます。

注意:メールの受信登録設定

Power BIサービスには、データが更新されるたびにレポート画面のキャプチャをメールで受信する機能があります。
通常、編集権限のあるユーザーは、自分以外のユーザーを送信先に設定できるのですが、RLS設定のあるデータセットを利用して作成されたレポートでは、本人しか送信先に設定できません。
image.png

公式リファレンス

下記に、詳しい説明と、上記以外の制限事項等も掲載されているので、ご参照ください。

補足:RLSを使わないで、自担当分だけを表示させる

元のデータセットにはフィルターをかけなくてもよい(隠したいわけではない)が、レポートの特定ビジュアルで「担当分だけ」を見せたいという場合があります。

たとえば、今回の例でいうと、店の責任者さんには、「店舗全体の情報」も見せたいが、同時に「自担当分だけ売上」のリストも提供したいということが考えられます。

そのような場合には、「userprincipalname()」を含むメジャーを作成し、そのメジャーをビジュアルフィルターに適用することで、実現できます。こちらの方法については、また別の機会に書いてみたいと思います。

(実は、本当はこちらを実現したかったのですが、当初やり方がわからずにRLSを実装することにしたのでした。。。)

当初、RLSの「編集権限があると全行見える」「RLSでフィルタをかける前の合計値と共存できない」という部分について「何だか不便だなー」と思っていたのですが、RLSは、名前のとおり「許可されたデータ以外を見せないようにする」というセキュリティの機能なので、これは当然の仕様なんですね。

最後になりましたが、まだまだ勉強し始めの身につき、内容についてご指摘・アドバイスなどありましたら、やさしく教えていただけますと大変うれしいです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away