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

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

Power BI での行レベルのセキュリティ (RLS)

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

環境

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

Azure SQL サーバーの作成と構成

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

1. Azure ポータル より Azure SQL Database を作成します。
Capture.PNG

2. 必要な情報を入力して作成を行います。
Capture.PNG

3. 作成完了後、SQL データベースに移動して、「サーバー ファイアウォールの設定」をクリック。
Capture.PNG

4. 「クライアント IP の追加」をクリックして保存。これでローカル PC からデータベースに接続できるようになります。
Capture.PNG

5. 「クエリ エディター」メニューより「ログイン」をクリック。作成時に指定したユーザー名をパスワードでログイン。
Capture.PNG

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

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 を起動して、「データを取得」をクリック。
Capture.PNG

2. Azure SQL Database を選択して接続。
Capture.PNG

3. サーバー名を入力し、「DirectQuery」にチェックをいれて、「OK」をクリック。データを Power BI にインポートした場合は、インポートを選択。
Capture.PNG

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

5. 作成した 2 つのテーブルを指定して、読み込みを実行。
Capture.PNG

6. 「リレーションシップの管理」をクリック。新規にリレーションシップを作成。
Capture.PNG

7. Users と Customers の関連を指定するとともに、「両方向にセキュリティフィルターを適用する」にチェックを入れて、OK をクリック。画面を閉じる。
Capture.PNG

8. テーブルのビジュアルを追加し、Customers の Name と Users の Name をそれぞれ追加。
Capture.PNG

行レベルセキュリティの設定

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

1. 「モデリング」タブより「ロールの管理」をクリック。
Capture.PNG

2. 「作成」をクリックして、ロール名を入力。テーブルより Users を選択。今回は「全てのユーザー」というロールを作成。
Capture.PNG

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

[Email] = userprincipalname()

4. 期待した通りに動くか確認するため、「ロールとして表示」をクリック。
Capture.PNG

5. 「その他のユーザー」にログインするユーザー名を指定、「全てのユーザー」ロールもチェック。ここではユーザーとして user1@test.onmicrosoft.com を指定。
Capture.PNG

6. 黄色バーに現在の状況が示され、データセットが意図した通りにフィルターされていることを確認。
Capture.PNG

7. レポートを保存。

PowerBI.com での利用

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

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

2. ワークプレースより「アプリのワークスペースの作成」をクリック。
Capture.PNG

3. メンバーの権限を読み取りにして、ワークスペースを作成。
Capture.PNG

4. Power BI Desktop に戻って「発行」をクリック。
Capture.PNG

5. サインイン画面が出るので、サインインを実施し、発行先として作成した App ワークスペースを選択。
Capture.PNG

6. 発行後、データソースの資格情報を設定。https://app.powerbi.com/ に戻り、発行されたデータソースのメニューより「データセットの設定」をクリック。
Capture.PNG

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

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

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

10. App ワークスペースを選択して、「アプリの発行」をクリック。
Capture.PNG

11. 説明を入力してから、「コンテンツ」でランディングページを指定、最後に「Access」から共有範囲を選択して、「完了」をクリック。
Capture.PNG

12. 発行が完了したら、アプリのアドレスをコピーしておき、「アプリへ移動」をクリック。
Capture.PNG

13. レポートが表示されることを確認。この場合ユーザーが編集権限を持っているので、行レベルセキュリティは無効になっており、すべてのデータが表示される。
Capture.PNG

テスト

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

2. 先ほどのアプリのアドレスをブラウザに入力するとアプリが取得可能。レポートで自分のデータだけが表示されていることを確認。
Capture.PNG

まとめ

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

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

参考

行レベルセキュリティ: 制限事項
行レベルセキュリティ: QA
Row-Level Security in Power BI - Revisited (英語の動画)
Row-Level Security in Power BI - Revisited

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.