Microsoft Fabric監査ログの長期保存

## はじめに
Fabricでは、各種方法で監査ログを表示し、ユーザーの操作を追跡することができます。

https://qiita.com/Hyodo_Katsuki/items/e3669b479b2105e9bb03

しかし、ログの保存期間や利用方法には制限があり、柔軟に使用することは難しいです。
そこで、パイプラインを使って、任意のデータベースにログを保存することで、
自由な監査に対応できる基盤としました。
以下要件の実現に活用いただければと思います。
- 既定の保存期間を超えて、監査ログを保持したい
- Fabric管理者や監査権限を持つユーザー以外にも、監査ログを共有したい
- 監査ログを独自のレポートにし、追跡を容易にしたい
- 危険な操作に対して、アラートを設定したい

## 開発物概要
監査ログ取得のAPIをパイプラインで呼び出すことで、取得を自動化しています。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/a92d4e15-0b66-cee0-79bb-1a7795ec1b09.png)

取得したログのサンプル

![画像9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/8735ad6b-2225-3883-c163-f3206619857b.png)


監査ログ取得のAPI

https://learn.microsoft.com/ja-jp/rest/api/power-bi/admin/get-activity-events

取得できる操作一覧

https://learn.microsoft.com/ja-jp/fabric/admin/operation-list

## 作成手順①　サービスプリンシパル認証の有効化
本手順は、APIの呼び出しにサービスプリンシパルを使用する場合に必要です。
サービスプリンシパル認証を用いることで、ユーザに過剰な権限の付与を避け、
ユーザに依存することなく、パイプラインの自動化を実現できます。

<br>
1.　サービスプリンシパルの作成

2.　セキュリティグループを作成し、サービスプリンシパルを追加

3.　管理ポータルのテナント設定で以下を特定のセキュリティグループに有効化
　　「サービスプリンシパルは読み取り専用管理APIにアクセスできます」

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/390e6818-10a1-5329-fb18-dbac031b51cd.png)

<br>

https://learn.microsoft.com/ja-jp/fabric/admin/metadata-scanning-enable-read-only-apis
  

  
## 作成手順②　APIへの接続を作成
API 「Get Activity Events」へのサービスプリンシパル接続を作成します。

<br>
1.　Fabricポータル上部の設定から「接続とゲートウェイの管理」を開く

2.　「新規」を選択

3.　各種情報を入力し、APIへの接続を作成
| 設定 | 値 |
|:-:|:-:|
| 接続  | クラウド接続  |
| 接続名  | 任意  |
|  接続の種類 | Web v2  |
| ベースURL  | https://api.powerbi.com/v1.0/myorg/admin/  |
| トークン対象ユーザーURI  | https://analysis.windows.net/powerbi/api  |
|  認証 | サービスプリンシパル  |

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/e57dc778-1139-3cf0-1e91-73eb97e32bc2.png)


## 作成手順③　ログの取得範囲の変数を設定
Get Activity Eventsではログを取得する時刻の範囲を設定する必要があります。
*startDateTime* と *endDateTime* は同じUTC日でなければなりません。

```サンプル.
https://api.powerbi.com/v1.0/myorg/admin/activityevents?
startDateTime='2024-12-20T00:00:00.000Z'&endDateTime='2024-12-20T23:59:59.999Z'
```

.../actiactivityevents?の ?以降を変数「DateTimeRange」とすることで、
パイプラインの実行日に合わせて取得範囲を変化させることができます。

本手順では、パイプラインを1日に1回スケジュール更新し、
前日の0:00~23:59の全てのログを取得できるように設定します。
<br>
1.　Fabricポータルから新しいパイプラインを作成

2.　アクティビティから「変数の設定」を追加

3.　設定に各種情報を入力
| 設定 | 値 |
|:-:|:-:|
|  種類 | パイプライン変数  |
| 名前  | DateTimeRange  |
|  値 | @{concat('startDateTime=', '''', formatDateTime(addDays(convertTimeZone(utcNow(),'UTC','Tokyo Standard Time'), -1), 'yyyy-MM-ddT00:00:00.000Z'), '''', '&endDateTime=', '''', formatDateTime(addDays(convertTimeZone(utcNow(),'UTC','Tokyo Standard Time'), -1), 'yyyy-MM-ddT23:59:59.999Z'), '''')}|

![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/faa0331a-62f7-40ee-6872-a662cd7fde8c.png)

更新頻度と変数を調整することで、ニアリアルタイムな取得も実現可能です。


## 作成手順④　APIを呼び出すコピーアクティビティの作成
ログ取得のための最後の手順になります。
APIを呼び出して、監査ログを取得し、任意の場所に保存します。
本手順ではレイクハウスのテーブルへ保存します。
<br>
1.　アクティビティから「データのコピー」を追加し、「変数の設定」と接続

2.　ソースに各種情報を入力
| 設定 | 値 |
|:-:|:-:|
|  接続 | 手順②で作成した接続を選択  |
| 相対URL  | activityevents?@{variables('DateTimeRange')} |
|  要求メソッド | Get  |
|  改ページの規則 | 名前：AbsoluteUrl<br>値：Body<br>ContinuationUri  |

![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/7c8dc5ba-a697-050c-c693-316e05ecedc2.png)

<br>

3.　宛先に各種情報を入力
| 設定 | 値 |
|:-:|:-:|
|  接続 | 作成済みまたは新規のレイクハウスを選択  |
|  ルートフォルダ | テーブル  |
|  テーブル | 作成済みまたは新規のテーブルを選択  |



4.　マップで「スキーマのインポート」を選択
　　作成済みの変数を使用すると失敗するので、一旦手動で入力
　　（データのプレビューも変数の使用が失敗する）

![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/74462416-c424-913f-ba89-d7a566974b74.png)

<br>
5.　必要な列でマッピングを作成

![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/1b816262-0a82-4585-2857-0d696caa1034.png)

<br>
6.　パイプラインを実行し、成功を確認

![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/1a89544d-e6ac-bbc7-2907-36c9ee48868e.png)

## さいごに
保存した監査ログでレポートやアラートを作成することで、
ユーザーの操作を追跡しやすくなり、不正な操作の発見に活用できます。
監査体制やガバナンスを整え、より安全にFabricを活用していきましょう！