SQL Server on Azure VMでSQLの監査ログ(Audit)をストレージアカウントに保存する方法

# はじめに

#### やりたいこと
Azure Virtual Machines 上の SQL Serverの監査ログ(Audit)の保存先をストレージアカウントに設定したい。

#### 躓いたところ
PaaSのAzure SQL DatabaseやAzure SQL Managed Instanceではストレージアカウントを直接指定ができたので、SQL Server on Azure VMでも設定しようとしたらできなかった。

Azure SQL Databaseの設定と確認方法は以下を参照

https://qiita.com/shingo_kawahara/items/646d27510788001a3ff5

#### 原因
SQL Serverのネットワークドライブへのアクセス権限不足

#### 結論
SQL Server on Azure VMでは監査ログの保存先をストレージアカウントに設定できるが、ストレージアカウントのファイル共有を使用する必要がある。
ただしVM上にファイル共有のストレージアカウントを単純にマウントしただけでは保存先に指定ができない。
xp_cmdshellを使用して一時的にSQL Serverの権限を強化して、マウントしたディレクトリを保存先に設定する。

xp_cmdshellについては[こちら](https://learn.microsoft.com/ja-jp/sql/relational-databases/system-stored-procedures/xp-cmdshell-transact-sql?view=sql-server-ver16#remarks)

https://learn.microsoft.com/ja-jp/sql/relational-databases/system-stored-procedures/xp-cmdshell-transact-sql?view=sql-server-ver16#remarks

#### 概要詳細
Azure SQL Managed InstanceやAzure SQL DatabaseではSQL Server監査ログ(SQL Server Audit)をAzureストレージアカウント上のBLOBを保存先として設定がSSMSやポータルから指定できるのですが、Azure Virtual Machines 上の SQL ServerではBLOBへの保存設定は標準ではサポートされていないとのことです。
代替手段としてストレージアカウントのファイル共有を利用し、VMにマウントすることでSQL Server監査ログの保存先をAzureストレージアカウントに指定が可能です。
しかしVM上にストレージアカウントをマウントしただけでは、SQL Serverにマウントしたディレクトリを指定することができなかったため手順を記載します。


# 事前準備
ストレージアカウントの作成とファイル共有を作成し、対象のVMに対してAzure ファイル共有をマウントしておく必要があります。

https://learn.microsoft.com/ja-jp/azure/storage/files/storage-how-to-use-files-windows#using-an-azure-file-share-with-windows

# 手順
ここではSSMSを利用した手順を記載します。

### 手順概要
1. SSMS にて対象の Azure Virtual Machines 上の SQL Server インスタンスに接続
1. [新しいクエリ] でエディタを起動
1. xp_cmdshellを実行しSQL Serverのサービスアカウントの権限を付与します。
1. ファイルメニューの[オブジェクトエクスプローラー] > [監査] > [新しい監査] もしくは作成済みの監査を開く
1. [全般]から[監査の出力先]でマウントしたディレクトリのパスを指定する
1. xp_cmdshellを再度実行し、設定を元に戻す


#### 1,SSMS にて対象の Azure Virtual Machines 上の SQL Server インスタンスに接続

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293404/d1e9fb8b-7c42-bb80-230f-a446d9c6fa44.png)


#### 2,[新しいクエリ] でエディタを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293404/3e40fc1c-a498-0778-e5d2-c38789ecf8eb.png)



#### 3,xp_cmdshellを実行しSQL Serverのサービスアカウントの権限を付与します。
以下のクエリを実行します。
```sql
EXECUTE sp_configure 'show advanced options', 1; 
GO 

RECONFIGURE; 
GO 

--  'xp_cmdshell' の機能を有効にします
EXECUTE sp_configure 'xp_cmdshell', 1; 
GO 
RECONFIGURE; 
GO
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293404/34845368-3d06-239a-20b6-df0ed0c73c10.png)

実行後、以下のクエリを実行します。
```sql
xp_cmdshell 'net use Z: \\[ファイル共有名.file.core.windows.net]\[ファイル共有名] /u:localhost\[ファイル共有ユーザー名] [ファイル共有パスワード]'
```
上記クエリが成功すると以下のような結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293404/736ef5a0-61a4-c5fd-fe0b-e9dec86818fd.png)


[ファイル共有ユーザー名]、[ファイル共有パスワード]については以下のファイル共有の接続から確認ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293404/03da306f-0a1b-3b87-c5a6-488af996b5e3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293404/1bf6cb0c-16e3-d64d-b4f9-153cf0432a02.png)






#### 4,ファイルメニューの[オブジェクトエクスプローラー] > [監査] > [新しい監査] もしくは作成済みの監査を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293404/17648a1d-9611-d5b9-7306-39bcfc9836c2.png)



#### 5,[全般]から[監査の出力先]でマウントしたディレクトリのパスを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293404/b0db06e6-885a-c147-55d6-e7128c7429e7.png)


#### 6,xp_cmdshellを再度実行し、設定を元に戻す

以下のクエリを実行して、設定を戻します。
```sql
EXECUTE sp_configure 'xp_cmdshell', 0; 
GO
RECONFIGURE; 
GO

```


# 補足

上記手順の「3,xp_cmdshellを実行しSQL Serverのサービスアカウントの権限を付与します。」を実行せずにマウントしたディレクトリを指定すると以下のようなエラーが発生し失敗します。

>TITLEMicrosoft SQL Server Management Studio
>------------------------------
>
>監査 'Audit-20230208-191705' の作成に失敗しました。  (Microsoft.SqlServer.Smo)
>
>ヘルプを表示するには https://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=16.100.47021.0&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=作成+Audit&LinkId=20476 をクリック
>
>------------------------------
>ADDITIONAL INFORMATION:
>
>Transact-SQL ステートメントまたはバッチの実行中に例外が発生しました。 (Microsoft.SqlServer.ConnectionInfo)
>
>------------------------------
>
>監査ログ ファイルのパスが無効です。 (Microsoft SQL Server、エラー: 33072)
>
>ヘルプを表示するには https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver-33072-database-engine-error をクリック