Power BI における 行レベルセキュリティ (Row Level Security)

Power BI で行レベル セキュリティ (RLS) を使用すると、特定のユーザーのデータ アクセスを制限できます。

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

上記リンクにやり方が紹介されていますが、少しわかりずらい所もあったので、この記事ではもう少し詳細を付けて説明します。機能の概要については上記のリンクを参照してください。

##### 環境
今回は検証のために powerbirls.onmicrosoft.com ドメインでの検証を行います。

# Azure SQL サーバーの作成と構成
今回は検証のため、Azure SQL サーバーを利用します。

1\. [Azure ポータル](https://portal.azure.com) より Azure SQL Database を作成します。
<img width="546" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/08460a1e-2a3e-02c0-c5fc-23be2ac85d67.png">

2\. 必要な情報を入力して作成を行います。
<img width="521" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/4cf651a3-bebb-68e8-d62a-60f74dd5d492.png">

3\. 作成完了後、SQL データベースに移動して、「サーバー ファイアウォールの設定」をクリック。
<img width="449" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/88e46915-827f-317f-5de1-d3f198798f55.png">

4\. 「クライアント IP の追加」をクリックして保存。これでローカル PC からデータベースに接続できるようになります。
<img width="324" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/6cd73a88-4553-0155-a671-d701e6320d0d.png">

5\. 「クエリ エディター」メニューより「ログイン」をクリック。作成時に指定したユーザー名をパスワードでログイン。
<img width="461" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/1d393ab5-a6d5-3c22-c765-3416320a5c5d.png">

6\. クエリ画面で以下のクエリを実行して、Users テーブルと Customers テーブルを作成し、サンプルデータを追加。ユーザーのメールアドレスは実際の環境の Azure AD ユーザーのアドレスに変更してください。

```sql
CREATE TABLE Users (
    UserId int PRIMARY KEY,
    Name nvarchar(50),
    Email nvarchar(50)
)

CREATE TABLE Customers (
    CustomerId int PRIMARY KEY,
    Name nvarchar(50),
    Email nvarchar(50),
    UserId int
)

INSERT INTO Users VALUES (1, 'user1', 'user1@powerbirls.onmicrosoft.com')
INSERT INTO Users VALUES (2, 'user2', 'user2@powerbirls.onmicrosoft.com')
INSERT INTO Users VALUES (3, 'user3', 'user3@powerbirls.onmicrosoft.com')
INSERT INTO Customers VALUES (1, 'customer1','customer1@dummy.local', 1)
INSERT INTO Customers VALUES (2, 'customer2','customer2@dummy.local', 2)
INSERT INTO Customers VALUES (3, 'customer3','customer3@dummy.local', 3)
```

# Power BI Desktop よりデータベースへの接続

1\. Power BI Desktop を起動して、「データを取得」をクリック。
<img width="825" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/a35aa7fa-8ea1-f462-780a-5f6897fb577b.png">

2\. Azure SQL Database を選択して接続。
<img width="455" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/327acb27-bd91-6eb6-4ded-cb76d1cf1507.png">

3\. サーバー名を入力し、「DirectQuery」にチェックをいれて、「OK」をクリック。データを Power BI にインポートした場合は、インポートを選択。
<img width="526" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/269483b5-1408-7ab7-d4c1-021504def379.png">

4\. 「データベース」を選択して、ユーザー名、パスワードを指定して「接続」を実行。

5\. 作成した 2 つのテーブルを指定して、読み込みを実行。
<img width="599" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/f6c1565d-930c-998d-93a8-f34bc7b7ab39.png">

6\. 「リレーションシップの管理」をクリック。新規にリレーションシップを作成。
<img width="609" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/c0a52821-e821-2005-a457-1d03f18dcb0b.png">

7\. Users と Customers の関連を指定するとともに、「両方向にセキュリティフィルターを適用する」にチェックを入れて、OK をクリック。画面を閉じる。
<img width="530" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/b0372cae-c42c-11ad-0bb1-1dd839217e7d.png">

8\. テーブルのビジュアルを追加し、Customers の Name と Users の Name をそれぞれ追加。
<img width="463" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/f9619eb9-b9ee-a2b2-fd23-08111015d07e.png">

# 行レベルセキュリティの設定
次に行レベルのセキュリティを指定していきます。

1\. 「モデリング」タブより「ロールの管理」をクリック。
<img width="532" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/ae7465ee-e0f2-1f4d-fa2f-0510abab45a2.png">

2\. 「作成」をクリックして、ロール名を入力。テーブルより Users を選択。今回は「全てのユーザー」というロールを作成。
<img width="578" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/c957951e-093d-6923-9cfe-f1cc8a6ccce6.png">

3\. 「テーブル フィルターの DAX 式」に以下の式を追加して、「保存」をクリック。

```
[Email] = userprincipalname()
```

4\. 期待した通りに動くか確認するため、「ロールとして表示」をクリック。
<img width="432" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/8c50ca43-63c4-d938-fb10-e259f4cd9c5d.png">

5\. 「その他のユーザー」にログインするユーザー名を指定、「全てのユーザー」ロールもチェック。ここではユーザーとして user1@test.onmicrosoft.com を指定。
<img width="289" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/bc35412f-ab16-deee-9201-2de2e76e8401.png">

6\. 黄色バーに現在の状況が示され、データセットが意図した通りにフィルターされていることを確認。
<img width="430" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/dceb97ce-77fe-2e7b-5994-eed1eff7ad0d.png">

7\. レポートを保存。

# PowerBI.com での利用
レポートの作成が行えたので、PowerBI.com での利用について見ていきます。

1\. まず発行先となる App ワークスペースを作成するため、https://app.powerbi.com にアクセス。

2\. ワークプレースより「アプリのワークスペースの作成」をクリック。
<img width="244" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/4ec2c378-fdc0-9797-78f7-f44e647ca1ad.png">

3\. メンバーの権限を読み取りにして、ワークスペースを作成。
<img width="267" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/2eb4579b-49ba-6998-71cd-55925589bec3.png">

4\. Power BI Desktop に戻って「発行」をクリック。
<img width="407" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/6211604d-287c-6024-ecbd-eff9485e48ce.png">

5\. サインイン画面が出るので、サインインを実施し、発行先として作成した App ワークスペースを選択。
<img width="427" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/2452f53e-de1b-5a26-0032-83adf98da96c.png">

6\. 発行後、データソースの資格情報を設定。https://app.powerbi.com/ に戻り、発行されたデータソースのメニューより「データセットの設定」をクリック。
<img width="265" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/c37aec76-891b-6d1c-8381-efac37440056.png">

7\. 「資格情報を編集」をクリックして、情報を入力。

8\. 再度データソースのメニューより「セキュリティ」をクリック。

9\. 行レベルのセキュリティより、ユーザーを追加して、保存。

10\. App ワークスペースを選択して、「アプリの発行」をクリック。
<img width="619" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/18b6bff8-67af-a7c5-430e-87a89eca3d10.png">

11\. 説明を入力してから、「コンテンツ」でランディングページを指定、最後に「Access」から共有範囲を選択して、「完了」をクリック。
<img width="522" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/20348f42-32d6-a360-be79-34ecd15a9bae.png">

12\. 発行が完了したら、アプリのアドレスをコピーしておき、「アプリへ移動」をクリック。
<img width="294" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/f545291d-eac2-7a8f-418e-769f6110c4ec.png">

13\. レポートが表示されることを確認。この場合ユーザーが編集権限を持っているので、行レベルセキュリティは無効になっており、すべてのデータが表示される。
<img width="285" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/32b258e9-7f37-f46c-45dc-d99253f56732.png">

# テスト
1\. アプリを共有されている一般ユーザーで https://app.powerbi.com にログイン。ここでは user1@powerbirls.onmicrosoft.com でログインしました。

2\. 先ほどのアプリのアドレスをブラウザに入力するとアプリが取得可能。レポートで自分のデータだけが表示されていることを確認。
<img width="318" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/e971e8d8-f624-d16e-52b0-7e9a5c860e23.png">

# まとめ
今回の記事では、ログインユーザーのアドレスを使ったフィルターを紹介しましたが、ロール事に地域など決まった文字列でデータをフィルタすることも可能です。また複数のロールを 1 ユーザーに付与することも出来るため、柔軟な運用ができます。

但し制限事項もあるため、公式ドキュメントを参照してください。

### 参考
[行レベルセキュリティ: 制限事項](https://learn.microsoft.com/ja-jp/power-bi/enterprise/service-admin-rls#considerations-and-limitations)
[行レベルセキュリティ: QA](https://docs.microsoft.com/ja-jp/power-bi/service-admin-rls#faq)
[Row-Level Security in Power BI - Revisited (英語の動画)](https://www.youtube.com/watch?v=67fK0GoVQ80)
[![Row-Level Security in Power BI - Revisited](http://img.youtube.com/vi/67fK0GoVQ80/0.jpg)](http://www.youtube.com/watch?v=67fK0GoVQ80)