こんにちは、Power BI サポート チームのチャンです。
Power BI でレポートを共有するにあたり、同じレポートで閲覧する場合でも、ユーザーごとで閲覧可能なデータの範囲を設定したい業務要件がよく見られます。今回はユーザーごとで表示されるデータの制御を実施できる Power BI の行レベルのセキュリティという機能を詳しく案内していきます。
重要
本記事は弊社公式ドキュメントの公開情報を元に構成しておりますが、
本記事編集時点と実際の機能に相違がある場合がございます。
最新情報につきましては、参考情報として記載しておりますドキュメントをご確認ください。
目次
前提条件
行レベルのセキュリティ (RLS: Row-level Security) は、すべての権限のユーザーに対して適用する機能ではございません。ワークスペースに対して、コンテンツの作成、編集、削除ができない権限を有しているユーザーにのみ適用可能です。
また、RLSが適用されないユーザーは、セキュリティフィルターが適用されず、すべてのデータ行が見られます。
〇 RLS が適用されるユーザーの権限
- ワークスペースのビューアー
- レポートの読み取り
- 組織アプリの読み取り
× RLS が適用されないユーザーの権限
- ワークスペースの管理者
- ワークスペースのメンバー
- ワークスペースの共同作成者
もしユーザーが同時に RLS が適用されない権限(例:ワークスペースのメンバー)のグループと、 RLS が適用される権限(例:ワークスペースのビューアー)のグループに所属している場合、上位の権限であるメンバーが適用されるため、 RLS によって閲覧可能なデータ範囲の制御は機能しません。
■ 上位から下位のワークスペース権限
管理者 > メンバー > 共同作成者 > ビューアー
参考情報
Power BI での行レベルのセキュリティ (RLS) - Power BI | Microsoft Learn
使用例
行レベルセキュリティー (RLS) は、主にデータのフィルター条件を直接に記載するシンプルな方法と、ユーザーのユーザープリンシパル名 (UPN) を検知してデータテーブルのリレーションシップによって動的に制御する方法がございます。
以下にてそれぞれ使用例をご紹介いたします。
■ 前提条件
二つの例ともに、ユーザーのアクセス権限の追加手順を省略していますが、レポートを発行したワークスペースに対して、事前に対象のRLS適用ユーザーを「ビューアー」として追加していることを前提としています。
■ 使用例①:フィルター条件を直接に記載する方法
フィルター条件を直接に記載する方法の手順についてご紹介いたします。
Power BI Desktop でレポートを開き、[モデリング] > [ロールの管理] の順で選択すると、ロールの管理のウィザードが表示されます。
[新規] をクリックし、ロールの名前を入力いただき、フィルター条件をかけたいテーブルを選択し、フィルター条件の設定を実施します。
以下の例では、Country が「 Canada 」のデータのみを閲覧できるように、RLS のロールを作成します。[DAX エディターに切り替えるボタン] をクリックいただくと、直接 DAX のフィルター条件を記載いただくことも可能です。
保存すれば、これで Power BI Desktop での設定は完了ですが、こちらの設定で正しくフィルターかけているかを確認するために、[モデリング] > [表示方法] を選択し、先ほど作成したロールを選択して、[OK] で確定させれば、そのロールで表示した場合の画面をご確認いただけます。
問題なく設定できていることを確認できたら、レポートを Power BI サービスへ発行します。
発行後に、こちらのロールを適用したいユーザーを追加する必要があるため、データセットに対して […] > [セキュリティ]を選択します。
次の画面で、適用したいユーザーを追加します。
追加後に、ロールに対して[…] > [ロールとしてテスト] を実施し、想定通りの表示ができるかテストします。
[次のユーザーとして表示] を選択すると、特定のユーザーの観点でどうデータが見られるかのテストが可能です。
以下 User01 の例では、想定通りのフィルターがかかった状態のレポートが表示されることを確認できました。
また、セキュリティのロールに追加されていない User02 の例では、適切なロールが適用されないため、ビジュアルの部分にエラーが表示されます。
ヒント
本記事では、Power BI Desktop で RLS ロールを作成する方法を紹介していますが、現在 Power BI サービスでRLS ロールを作成する、及びセキュリティで対象のユーザーを割り当てることができるようになっていますので、詳細に関しては以下のブログ記事をご参考ください。
■ 使用例②:ユーザーのユーザープリンシパル名を検知してデータテーブルのリレーションシップによって動的に制御する方法
RLS の適用対象ユーザーが少ない場合には、各ユーザーに対して、適用するフィルターを Power BI 内のロール管理で実施いただけますが、大量なユーザーに対してそれぞれ異なるフィルター条件を設定する場合には、画面上の操作では相当な労力や時間がかかることが想定されます。
以下にて、その際の代替案をご案内します。こちらの方法では、事前にフィルター条件が含まれているデータテーブルを用意いただく必要がございますが、ユーザーのユーザープリンシパル名 (UPN) を検知して動的に閲覧可能なデータを制御できます。
- 以下の例では、ユーザーが所属しているセグメントの情報を利用して、該当セグメントによって閲覧可能なデータを制御します。
実際の運用シナリオにおいて、セグメントを、各会社の部署、事業部などに置き換えて想像いただければと思います。
まず、以下のような3つのテーブルを用意します。
- 所属部署の一覧のマスターテーブル
例:Segmentテーブル
- 所属部署とユーザープリンシパル名が紐づいたマスターテーブル
例:UPN_Segmentテーブル
- 売上情報といったファクトテーブル
例:Salesテーブル
Power BI のレポートにインポートし、以下画像のようにリレーションシップを設定します。
• Segmentテーブルから、Salesテーブルに対して、1対多の単一方向のリレーションシップ
• UPN_Segmentテーブルから、Segmentテーブルに対して、1対多の双方向リレーションシップ、かつ両方向にセキュリティーフィルターを適用する
[モデリング] > [ロールの管理] にて、新規のロールを作成し、UPN情報が入っているテーブルで、[DAX エディターに切り替えるボタン] をクリックいただき、以下の関数を入力します。
※ [UPN] は列名なので、適宜UPN情報の列名を置き換えてください。
1 | [UPN] = USERPRINCIPALNAME() |
問題なく設定できていることを確認できたら、レポートを Power BI サービスへ発行します。
発行後に、こちらのロールを適用したいユーザーを追加する必要があるため、データセットに対して […] > [セキュリティ]を選択します。
次の画面で、適用したいユーザーやユーザーをメンバーとして追加したセキュリティグループを追加します。
参考情報
Microsoft 365 管理センターでセキュリティ グループを作成、編集、削除する | Microsoft Learn
追加後に、ロールに対して[…] > [ロールとしてテスト] を実施し、想定通りの表示ができるかテストします。
[次のユーザーとして表示] を選択すると、特定のユーザーの観点でどうデータが見られるかのテストが可能です。
以下 User01 の例では、想定通りのフィルターがかかった状態のレポートが表示されることを確認できました。
ヒント
本記事では、Power BI Desktop で RLS ロールを作成する方法を紹介していますが、現在 Power BI サービスでRLS ロールを作成する、及びセキュリティで対象のユーザーを割り当てることができるようになっていますので、詳細に関しては以下のブログ記事をご参考ください。
注意点
ゲストユーザーに対する RLS
ゲストユーザーに対しても、RLSを適用することが可能ですが、Microsoft Entra(旧 Azure Active Directory)上では、ゲストユーザーのユーザープリンシパル名 (UPN) に #EXT# 識別子が含まれています。
参考情報
Microsoft Entra B2B コラボレーション ユーザーのプロパティ | Microsoft Learn
しかしながら、Power BI で USERPRINCIPALNAME() でユーザーの UPN を取得する場合は、Power BI サービスへサインインしているユーザー名を取得します。ユーザー名は、プロファイルアイコンをクリックして、ご確認いただけます。こちらのユーザー名は、ほとんどの場合は、 #EXT# 識別子を含まない本来のメールアドレスとなります。
もし前セッションで紹介した使用例②の方を採用する場合、ユーザープリンシパル名 (UPN) はゲストユーザーが Power BI サービスへサインインする際のユーザー名に準じます。
参考情報
以上、本ブログが少しでも皆様のお役に立てますと幸いでございます。
※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。