Power BI 勉強帳：行レベルセキュリティ（RLS）

先日、初めて**行レベルセキュリティ（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側
１で作成した役割にひもづけるメンバーを指定します

##Power BI Desktopでの作業
なんの店だか分かりませんが、次のようなデータセットがあったとして、
チャトラさんが駅前店の責任者、ハチワレさんが公園店の責任者とします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221646/5a1c6f9e-8560-6e49-cfbb-fb43bd2e9ed0.png)


###役割（ロール）の作成

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221646/1fc8ccfa-9825-97e9-f5fa-a1586df70fa1.png)

ロール名を付けたら、中段で**フィルターを掛けたいテーブルを選び**、右段で**フィルター条件をDAX式で記入**します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221646/aee2fdf5-7267-4f43-bd87-d850383502cc.png)

同じように、他のロールも設定し、保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221646/09db745b-6e95-a171-bbe7-b8d671ffc820.png)
以上で次のような役割（ロール）を設定しました。

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

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

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

「**モデリング>ロールとして表示**」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221646/8e1263c5-3782-a5c0-2b54-14310c9e7aae.png)
####「駅前店責任者」のプレビュー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221646/fdcbf3fe-685b-506b-6932-29503e4c3a10.png)

####「一般担当（ミケさん）」のプレビュー
**userprincipalname()**でフィルタした役割では、同時に**「その他のユーザー」を選択してプレビューしたいメンバーのメールアドレス**を入れます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221646/11dcdfa3-432f-42fb-6db9-8ecc5372cb15.png)
Desktopでの作業が終わったら、アプリのワークスペースに発行します。

##サービスでの作業
###役割にメンバーを追加する
「**データセット＞3点（…）メニュー**」をクリックし、「**セキュリティ**」を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221646/600dacf6-4204-f1c0-1c4a-dc720932bb3e.png)

各役割のメンバー欄に、**該当するメンバーのメールアドレスを記入**し、「**追加**」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221646/c547832b-0861-a56e-4db4-9bb74c6418a8.png)


###メンバーをグループで追加する場合
該当するメンバーの数が多いとき、1人1人で登録しているとメンテナンスも大変です。
そんな場合メンバーは、**セキュリティグループ**でも追加できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221646/10378f57-6070-3486-d39f-f1884e61884a.png)


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

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

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

###サービスでのプレビュー方法
サービスでも、それぞれの役割・ユーザーに対して、どのような見かけになるかをプレビューすることができます。
RLS設定画面の３点メニューから、「ロールとしてテスト」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221646/652721e4-e689-8a07-153b-fdf40c175464.png)

一度プレビュー画面になると、青い帯の部分で、プレビューしたいユーザーを変えることができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221646/38d11fc9-b6c2-84f3-4ebb-a9198cb751e3.png)

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

##補足：役割と見え方
#####兼務の場合
複数の役割を兼務すると、和集合（OR）になります。
（A店責任者とB店責任者をかねると、両方のデータが閲覧できます）

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

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

##注意：メールの受信登録設定
Power BIサービスには、データが更新されるたびにレポート画面のキャプチャをメールで受信する機能があります。
通常、編集権限のあるユーザーは、自分以外のユーザーを送信先に設定できるのですが、RLS設定のあるデータセットを利用して作成されたレポートでは、本人しか送信先に設定できません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221646/795f7dff-4395-bd73-8a61-ba81059474bd.png)

##公式リファレンス
下記に、詳しい説明と、上記以外の制限事項等も掲載されているので、ご参照ください。

- [Power BI での行レベルのセキュリティ (RLS)](https://docs.microsoft.com/ja-jp/power-bi/service-admin-rls)
- [Power BI Desktop での行レベルのセキュリティ (RLS)](https://docs.microsoft.com/ja-jp/power-bi/desktop-rls)

##補足：RLSを使わないで、自担当分だけを表示させる
元のデータセットにはフィルターをかけなくてもよい（**隠したいわけではない**）が、レポートの**特定ビジュアルで「担当分だけ」を見せたい**という場合があります。

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

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

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

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

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