SQLの監査を取得する（Azure Synapse Analytics SQLプール）

#SQLの監査
RDBMSはたくさんの機密情報が保存されると思います。なので、誰が、いつ機密情報にアクセスしたのか監査証跡を残しておくことが一般的です。
特にAzure Synapse Analytics SQLプールはデータウェアハウスシステムのデータベースとして利用されることが多く、このデータウェアハウスシステムはいろいろなシステムからデータを連携されることが多いので、各システムの機密情報が長期間にわたって保存されることになり、ことさら、監査は重要な課題となることが多いです。

#Azure Synapse Analyticsでの監査設定
Azure Synapse Analytics SQLプールではSQLを監査する機能があります。
この機能を使う事で、データベースで発生したイベントは以下の何れかの保存先に監査ログとして格納されます。
・Azure ストレージアカウント
・Log Analyticsワークスペース
・Event Hubs

今回はAzure ストレージアカウントへの監査ログの出力を試してみました。

#監査設定例(Azure ストレージアカウント)
Azure Portalから対象のAzure Synapse Analyticsを選択し、メニューから__「監査」__を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/dc07e3d8-95ee-123a-c4a2-655fd83a7950.png)|
|:-:|

__「Azure SQL 監査を有効にする」__で監査設定を有効にします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/faf044c8-25c9-5154-7564-8865fde449dd.png)|
|:-:|

監査ログの保存先で、AzureストレージかLog AnalyticsかEvent HUBを選択できるので、今回は__「ストレージ」__を選択し、監査ログの保存先として、Azureストレージアカウントを選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/2f788dc3-af25-7c6d-1241-9e976d1e149f.png)|
|:-:|

保存先のAzureストレージアカウントの情報を入力します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/df597558-550c-63e5-1ffa-d52b4432dca1.png)|
|:-:|

__「保存」__をして設定完了です。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/27ee3847-e470-257f-963f-731c1c4338bf.png)|
|:-:|

監査ログはこの画面の別タブからも確認可能です。__「監査ログの表示」__を押すと、データベース監査の中に監査ログが表示されるようになります。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/c33d99a2-7b9c-0a04-9dcd-fe954fa73a2f.png)|
|:-:|

監査ログの詳細も以下のようにAzure Potalから確認できます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/662e0ec0-559e-fedd-1552-97525b1d798f.png)|
|:-:|

Azureストレージアカウント上の監査ログの保存先ですが、
指定したストレージアカウント内に`sqldbauditlogs`と言うコンテナが作成され、その配下に以下のような形で保存されます。

```
sqldbauditlogs/<サーバー名>/<データベース名>/SqlDbAuditing_Audit/<YYYY-MM-DD>/<ファイル名>.xel
```

#監査ログの保存期間
監査ログの保存期間はAzure Portalより、Azure Synapse Analyticsを選択し、メニューから__「監査」__を選択、__「詳細プロパティ」__で変更可能です。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/a4fccc12-5bbf-3988-ddcd-867289d98c2a.png)|
|:-:|

#監査ログの確認方法
Azure Portalからも確認可能ですが、以下の方法でも確認可能です。

##SQLで確認
`sys.fn_get_audit_file`を利用することで確認する事が出来ます。
上記ステートメントの実行例は以下の通りです。

```SQL
select * from sys.fn_get_audit_file('https://<ストレージアカウント名>.blob.core.windows.net/sqldbauditlogs/<サーバー名>/<データベース名>/SqlDbAuditing_Audit',default,default);
```
また上記は対象のデータベースの監査ログすべてを確認する時に使用するもので、日付のファルダや、ファイルパスまで指定すれば読み込むファイルを少なくできます。
※以下は特定のファイル名まで指定した例です。

```SQL
select * from sys.fn_get_audit_file('https://<ストレージアカウント名>.blob.core.windows.net/sqldbauditlogs/<サーバー名>/<データベース名>/SqlDbAuditing_Audit/<YYYY-MM-DD>/<ファイル名>.xel',default,default);
```

__出力結果__

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/17a7c355-803f-6db0-d4ed-da3eab7589e2.png)|
|:-:|

##SSMSを使って確認
監査ログ（.xel）をSSMSへ取り込んで確認する事も可能です。
__「ファイル」__⇒__「開く」__⇒__「監査Fileの統合」__から取り込むことが可能です。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/99082fef-ae8d-70ea-4766-fbcfdfe24632.png)|
|:-:|

__「追加」__⇒__「接続」__にてAzure ストレージへの接続情報を入力すればOKです。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/2280b7da-6748-b7e4-1c3d-20ebd25a1f25.png)|
|:-:|

このように監査ログを確認する事が出来ます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/4fc4e549-dbf8-6cfa-7e8c-0a50269a0f89.png)|
|:-:|

#監査ログに分類や情報の種類の指定をする
監査ログは基本全てのアクションで取得されてしまいますので、何か起こった場合に、問題の監査ログを探しにくいです。また、監査レポートを作成する際なども重要なデータへのアクセスがあったのかなどの情報が監査ログ内にあった方がスムーズに作成できます。

Azure Synapse Analyticsでは、監査ログを分類し、ラベル付けを行う機能が実装されています。

##設定方法
Azure Portalより、Azure Synapse Analyticsを選択し、メニューから__「データの検出と分類」__を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/40a0a41b-d408-ae51-2554-8ad5c6a1598a.png)|
|:-:|

__「分類」__を選択します。Synapse Analyticsから分類設定に対して推奨事項が見つかれば、ここに出力されます。この推奨事項は、「情報の種類」と言うものでカラム名などのパターンを入れておくことで、この推奨事項に表示されるようになります。（例えば、個人情報である`Phone`や`Name`と言ったような情報がカラム名に指定されていれば推奨事項として表示されます。「情報の種類」や「分類」についてはカスタマイズ可能ですが今回の説明では割愛しています。）
今回はこの推奨事項を使わず、個別に設定を行うので__「分類の追加」__を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/2c16bea7-13fe-e49d-3160-6dacff6e4383.png)|
|:-:|

`dbo.CUSTOMER`というテーブルの`C_PHONE`（電話番号）列を分類対象とします。情報の種類は「`Contact Info`」、機密レベルを「`Confidential`」に設定しました。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/a0f2b4b2-fdc4-a8dd-35ee-1dd3d95e40a7.png)|
|:-:|

__「保存」__を押せば、設定完了です。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/ef081f39-b04a-cdb2-1942-5fc485bd3827.png)|
|:-:|

##監査ログにおける分類の確認
`dbo.CUSTOMER`テーブルの`C_PHONE`（電話番号）列に分類を設定したので、以下の２つのSQLを実行します。
１つは`C_PHONE`列を含んだSELECT文、もう１つは`C_PHONE`列を含まないSELECT文です。

```SQL
--C_PHONE列を含んだselect
select C_CUSTKEY,C_NAME,C_PHONE from CUSTOMER where C_CUSTKEY=12944433;

--C_PHONE列を含まないselect
select C_CUSTKEY,C_NAME,C_ADDRESS from CUSTOMER where C_CUSTKEY=12944433;
```

Azure Potalから監査ログを確認します。`C_PHONE`を含んだSELECT文の監査ログには分類分けしたラベルがついている事が分かります。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/8772509d-eb95-893a-7351-90f425c35e38.png)|
|:-:|

`sys.fn_get_audit_file`ステートメントで確認すると分類分けされたクエリには`data_sensitivity_information`列に情報が入ります。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/053d9dec-69de-0e79-2a54-fcbc1f392f95.png)|
|:-:|