Microsoft Fabric レイクハウスでのデータアクセス制御の方法メモ

## はじめに

レイクハウスにどのようにアクセス制御設定をする方法があるのかメモ

2024/07/03 時点の情報です。

### エンジンごとのアクセスポリシー

Fabric はすべてのテーブルデータを OneLake に共通フォーマットである Delta Parquetとして保存する一方で、現時点ではそれぞれのアイテムで処理を実行するエンジン個々のアクセスポリシーでアクセス可否を評価します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/fe8e8333-c9c8-4945-827f-0671f228ff26.png)


- レイクハウス(Spark、またはOneLake API): [データアクセスロール](https://learn.microsoft.com/ja-jp/fabric/onelake/security/get-started-data-access-roles)により設定。
- SQL分析エンドポイントまたはウェアハウス(T-SQL): [GRANT文など](https://learn.microsoft.com/ja-jp/fabric/data-warehouse/sql-granular-permissions)のT-SQLにより設定
- セマンティックモデル(Analysis Services): セマンティックモデル内の[行レベルセキュリティ](https://learn.microsoft.com/ja-jp/fabric/security/service-admin-row-level-security)、[オブジェクトレベルセキュリティ](https://learn.microsoft.com/ja-jp/fabric/security/service-admin-object-level-security?tabs=table)で設定

本記事では、レイクハウスおよび SQL 分析エンドポイントでのアクセス制御の実例を記載します

### キーワードの使い分けについて

以下のように用語を使い分けて説明します

**データ**：テーブルにおけるレコード、ファイルにおける内容を指します
**オブジェクト**：テーブル、スキーマなどのデータベースオブジェクトを指します
**フォルダ** または **ファイル**：テーブルを提供するDelta Lake フォーマットのファイルまたはそのファイルが格納されたフォルダ、レイクハウスで表示可能なフォルダ、ファイルを指します

## 1. 最小権限の付与状態と方法

セマンティックモデルを除き、アイテムとオブジェクトを表示する権限として、**読取** アクセスがあります。（セマンティックモデルではデータの表示権限も含まれます）

レイクハウスではアイテムレベルで読み取りアクセスを付与することが可能であり、この状態が最小権限として **「データベースとしてはオブジェクトの表示・接続が可能だが、データの表示ができない状態」** となります。

共有ボタンにて設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/24edab12-8a78-7c84-7af5-aa9d7c147e87.png)

追加のアクセス制御については後述しますが、これらを追加しない状態が読取アクセス状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5cca0375-b1c9-00f0-17af-bdbba3f02ba0.png)

アクセス許可の管理から状態を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1a815105-88d6-e47b-2e90-ac977a1e1c3c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f82d5932-17d0-ebb0-6272-66765dfe3e5f.png)

なお、レイクハウスにはSQL分析エンドポイントと、既定のセマンティックモデルが付随するため、それらについても読取アクセスが付与されます。

SQL分析エンドポイント（アイコンに注目）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0b8860df-f0e1-931c-db2a-b1afc843ac41.png)

既定のセマンティックモデル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/472c9d88-5a77-7fee-436a-e3a5c6ef5248.png)


この時点で、付与を受けたユーザーの OneLake データハブの検索にそれぞれのアイテムが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e8608b5b-2cac-3cde-7539-eec6311e6d05.png)

ただし、データの内容は確認できません。

フォルダへのアクセス権がないので、テーブル、ファイル自体の表示不可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7c5a1112-b8f0-3cbf-720d-106f8f2f2d6f.png)

ウェアハウスではオブジェクトが表示されていますがデータの表示はできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/608f6ff1-cab2-a60d-a77c-a5b9ca247e2b.png)
、
既定のセマンティックモデルも同様で、オブジェクトは表示されていますが、データを表示するためのボタンは無効化されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8072c4af-0558-de62-5321-d4eaf3f3cf3c.png)

既定のセマンティックモデルを使用したレポートにも読取アクセスを付与して確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a2058dfb-871c-1af0-ae5d-f27923c95aa4.png)

:::note warn
注意
この挙動については、現時点ではdocsと差異があります。既定で読み取り可能とされていますが、実際には既定のセマンティックモデルは SQL 分析エンドポイントでのデータ読取権限がないと動作しませんでした。（おそらく既定でない、[OAuth認証方式でのセマンティックモデルの仕様](https://qiita.com/ryoma-nagata/items/2af0fc0f6ab58cf764ac)が記載されています。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5fe99f7b-7501-9a9c-c7b6-41d8afead666.png)

https://learn.microsoft.com/en-us/fabric/onelake/security/data-access-control-model#onelake-rbac-and-default-lakehouse-semantic-model-permissions

:::


## 2. Spark によるデータ読み取りアクセスの付与

はじめに Spark または OneLake APIによるアクセスを許可します。
データアクセスロールにて制御します。

4つのフォルダ（テーブル2, ファイル2 ）で確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4c91baf1-2600-9395-9bb7-1682ef4d002c.png)



### 2-1. フォルダレベルの制御

はじめに、参照可能なテーブルフォルダを指定したロールを作成して、ユーザーをそのロールに割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/adbf9d3f-a65e-a1f4-1ecd-ae297dc1607c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f8d78cbd-5082-55ec-cc4c-c8d512a4c8eb.png)

ユーザーからの表示は以下のようになります。

レイクハウス上での表示では、該当のテーブルフォルダのみがデータ表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/42213faf-4568-badb-5801-74bff95009c3.png)

基になっているDelta Parquetファイルも確認可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1ac23773-0677-d6dc-6d53-e8d6c0c21a1b.png)


ウェアハウス上での表示は変化なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0a22a9b6-905c-943d-21b5-a2aa9ca4c0af.png)


既定のセマンティックモデル上での表示は変化なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9de2561d-765f-ba2d-5894-d1263d9a1bf8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a2058dfb-871c-1af0-ae5d-f27923c95aa4.png)

ファイルフォルダへの権限も付与してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/810e4ea6-4b81-1804-ee63-6b45bc5266b1.png)

該当フォルダのみがデータ表示可能となります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/97d47efa-f68a-25d4-8537-62f46b104d32.png)


このようにファイル、フォルダにアクセス可能な状態だと、ユーザーが管理しているレイクハウスへのショートカットの作成も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/88b71180-44dc-1f43-f975-ed31f448e54e.png)


### 2-2. レイクハウス全体の制御

レイクハウス全体の制御は ReadAll アクセスを付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9c1a77d1-bfc4-64e2-2124-7599fb5348c9.png)

ReadAll 権限を持つユーザーはそのレイクハウスのすべてのファイル、フォルダにアクセスでき、Spark エンジンを介してのデータ表示も可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/da536057-c515-30d6-797f-58758777493b.png)

※データアクセスロールが有効な場合は、ReadAll権限を持つユーザーは既定でDefault Reader (すべてのフォルダを閲覧可能なロール)ロールに自動追加されるようになっています。 この自動設定は無効化することも可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8decbfd9-080a-e177-463b-961d6650520f.png)

ただし、T-SQL , Analysis Service エンジン上でのアクセスポリシーとは関連しないため、引き続き両者のエンジンによるアクセスではデータ表示はできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2f914603-e169-ccc3-1099-43781f0499b9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a0d24118-8d53-5c98-86e0-0857fb998af4.png)

## 3. T-SQL によるSQL 分析エンドポイント上でのテーブルへの読み取りアクセスの付与

### 3-1. オブジェクトアクセス制御 - テーブル

GRANT文で付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f9ec1447-4c03-8e1f-abd0-e73909d58303.png)

クエリによりデータ表示可能となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b9f25136-98ad-7881-f42d-073cfe83edb8.png)

この時点で Direct Lake で動作する既定のセマンティックモデルを使用したレポートが表示可能となります。他のエンジンと異なり、セマンティックモデルはポリシー設定がない場合は既定で表示となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/eb67df2b-f64c-5342-54a3-6dbb9cb8182e.png)

### 3-2 オブジェクトアクセス制御 - スキーマ

スキーマを作成し、Viewを介してアクセスさせるようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bd6ce6f2-c485-ae01-920b-7778adcae32f.png)


クエリによりデータ表示可能となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0b8e0cf8-4794-1c56-2ae4-89322af81b5a.png)

:::note warn

Viewを使用する場合、 Direct Lake の対象として動作しない点にご注意ください（常にDirect Query にフォールバックされます）

:::


### 3-3 SQL 分析エンドポイント全体での制御

一度双方のアクセス権を外しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2939ea87-6655-78f5-5550-e54827f46537.png)

クエリ不可となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/edd812da-ab88-dc44-6c3b-36016627f4cc.png)

SQL 分析エンドポイント上で ReadData アクセスを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a6bdd338-181a-de60-89ca-a8f264e41f1e.png)

クエリによりデータ表示可能となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/fa06478b-ef4c-9c40-cd6f-34adaf00b039.png)

注意。ビューアーロールを割当られたユーザーは自動的にこのReadDataが付与されます

## 参考

ベストプラクティスや、データエンジニアなどのロールを想定したシナリオ例など

- https://learn.microsoft.com/ja-jp/fabric/onelake/security/best-practices-secure-data-in-onelake
- https://learn.microsoft.com/ja-jp/fabric/onelake/security/how-to-common-data-architectures

## 問題の共有 オブジェクトアクセス制御 - スキーマ移動

:::note alert

スキーマを移動するこの方式では、Spark エンジンでの CRUD 操作が同期されない問題を確認しているので、注意ください。

:::


まずレイクハウスのテーブルはdboスキーマで作成されるため、これを移動し、qiita schema にアクセス権を付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/fbe0d1b0-a150-2466-603a-f2943928f650.png)

クエリによりデータ表示可能となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9ea570f2-3978-be69-b779-d411bd62f554.png)

ただし、この状態だと Spark での操作が同期されないため現時点では採用が難しい方式となります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e71a746f-c56c-31cd-7376-91c951c779ae.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5ef0c9d6-0f7d-afbb-6733-fea69864ee71.png)