Microsoft SQL Server で SQL サーバー監査イベントを Windows セキュリティイベントログに書き込む

# 1. はじめに
Microsoft SQL サーバーは全くの初心者ながら、MSSQL 監査ログを監視する相談が有りましたので、設定手順を以下残しておきたいと思います。ドキュメントは以下になるのですが、初心者には分かり難いところがあったので、その部分を補足しておきたいと思います。
**なお、本設定の反映のために Microsoft SQL サーバーの OS 再起動が必要になります。**
基幹系データベースの場合はメンテナンスタイミングなども考慮しておきましょう。

# 2. MSSQL サーバーの監査ログの書き出し先
データベースの監査要件として、Microsoft SQL サーバーには監査ログ機能が備わっています。
設定では以下の三つの方法が提供されていますが、セキュリティや外部へのログ書き出しの要件を考慮すると Windows セキュリティイベントログへの書き出し用途が一番多いのではないかと思います。

| 出力先 | 内容 |
| ---- | ---- |
| ファイル | 指定したディレクトリに監査ファイルとして書き込む方法。監査ログを確認するためには、ファイルそのものを読み込む必要があり、可読性が低い。とりあえず貯めておく程度であれば、ファイルサーバなどに置いておくなどが良い。 |
| アプリケーションログ | Windows イベントのアプリケーションログとして監査ログが書き込まれる。但し、誰でも見れてしまうため、セキュリティレベルが低い |
| セキュリティログ | Windows イベントのセキュリティイベントとして書き込まれる。Windows 権限で保護されており、セキュリティを意識するのであればこちらがお勧め |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/0580fbb0-d7ad-076b-4a30-5923cfdbde20.png)

# 3. 設定手順
基本的には公式 Docs の手順通りです。
今回、Amazon EC2 に作成した Windows 2022 Server / SQL 2016 Server 環境で試したものを貼っています。

https://learn.microsoft.com/ja-jp/sql/relational-databases/security/auditing/write-sql-server-audit-events-to-the-security-log?view=sql-server-ver16

## 3.1 auditpol コマンドを打ち込む
コマンドプロンプト（管理権限）にて、以下コマンドを打ち込みます。
``auditpol /set /subcategory:"application generated" /success:enable /failure:enable``
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/77a5c00e-a3b4-f9f5-6acb-98aa934fe758.png)

## 3.2 Windows セキュリティイベントに書き込むために権限を付与する
Windows セキュリティイベントにログを書き込むために、Microsoft SQL サーバーの起動ユーザーに対して権限を付与する必要があります。こちらはローカルセキュリティポリシー (``secpol.msc``) を用いて、「セキュリティ監査の生成」ポリシーに対してユーザーを付与してあげます。
**この設定を反映するために Microsoft Windows Server の再起動が必要になります。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/5884121f-9660-b7ca-e615-99e78b361f69.png)

SQL サーバーの起動ユーザーは、SQL Server 構成マネージャーのサーバーのプロパティから調べることが出来ます。
SQL 2016 Serverの場合、デフォルト値は``MSSQLSERVER``になっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/e4df2344-b942-056e-1033-ed9a385fa2d7.png)

## 3.3 SQLサーバーの監査ログを設定する
SSMS (SQL Server Management Studio)を用いて、監査ログ + 監査ポリシーの設定を行います。
詳しい設定手順は以下の公式 Docs を参照して下さい。

https://learn.microsoft.com/ja-jp/sql/relational-databases/security/auditing/create-a-server-audit-and-server-audit-specification?view=sql-server-ver16

今回は Windows セキュリティイベントログ宛の保管設定を行ってみます。
「セキュリティ」->「監査」より新規に Windows セキュリティイベントログ書き出し用のプロファイルを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/04fd234f-f810-8464-1c5c-1abb7f7025d6.png)
3.2 に記載した権限の付与とサーバー再起動による反映が行わていると、以下のように監査書き出しが成功します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/4bf9057d-fce3-b967-af92-75667df96c06.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/25c06fbc-0e4f-fa17-981d-fa468a933c08.png)

次に「サーバー監査の仕様」から監査ログに書き出しポリシーの設定を行います。
個々の監査アクションの設定は細かなパラメータとして任意にユーザー側で設定が出来るようになっています。
全てを有効化するとログ量の増大に繋がったり、パフォーマンスの懸念があるので、必要な監査要件に合わせて有効化することをお勧めします。

https://learn.microsoft.com/ja-jp/sql/relational-databases/security/auditing/sql-server-audit-action-groups-and-actions?view=sql-server-ver16#server-level-audit-action-groups

要件によって何を有効化するかはお客様次第になりますが、セキュリティ監査用途であれば以下の監査アクションが良いのではと思います。

| パラメータ | 内容 |
| ---- | ---- |
| **FAILED_LOGIN_GROUP** | プリンシパルが SQL Server へのログインを試みて失敗したことを示します。 このクラスのイベントは、新しい接続によって生じることも、接続プールから再利用された接続によって生じることもあります。|
| **FAILED_DATABASE_AUTHENTICATION_GROUP** | プリンシパルが包含データベースにログオンしようとして失敗したことを示します。 このクラスのイベントは、新しい接続によって生じることも、接続プールから再利用された接続によって生じることもあります。 このイベントが発生します。|
| **DATABASE_CHANGE_GROUP** | このイベントは、データベースが作成、変更、または削除されるときに発生します。 |
| **DATABASE_OBJECT_CHANGE_GROUP** | このイベントは、スキーマなどのデータベース オブジェクトで、CREATE、ALTER、または DROP ステートメントが実行されたときに発生します。 |
| **DATABASE_PERMISSION_CHANGE_GROUP** | このイベントは、 SQL Server の任意のユーザーによって、ステートメント権限に対して GRANT、REVOKE、または DENY が実行されるたびに、データベースに対する権限の許可などのデータベース限定のイベントに対して発生します。|
| **USER_CHANGE_PASSWORD_GROUP** | このイベントは、包含データベースのユーザーのパスワードが USER ALTER ステートメントを使用して変更されるたびに発生します。|
| **SERVER_OPERATION_GROUP** |このイベントは、設定、リソース、外部アクセス、承認の変更などのセキュリティ監査操作が使用されるときに発生します。|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/99dd4f5d-dc2f-824c-bda7-665550c001ed.png)

最後にポリシーの方で有効化を行います。

# 4. Windows イベントビューアーにて、監査ログを確認する
無事設定が反映され、監査ログとして出力されているかどうか、イベントビューアーで確認します。
Windows セキュリティイベントとして出力されていれば、ソース名**「MSSQLSERVER$AUDIT」**として出力されていることが分かります。
以下はログイン失敗の出力例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/995cf6e2-947d-a181-9313-c28627390d1c.png)

ここまで確認が出来ていれば、あとは Windows セキュリティイベントログを SIEM などに連携して、監査/検知などに役立てることができます。

# 5. まとめ
Microsoft SQL サーバーの監査ログの設定は意外と分かり難いのですが、細かな設定を施すことが出来て、また Windows セキュリティイベントログに出力することで監査要件に使えることが分かります。本記事がどなたかの参考になれば幸いです。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。