CREATE SERVER AUDIT (Transact-SQL)

適用対象: SQL Server Azure SQL Managed Instance

SQL Server Audit を使用して、サーバー監査オブジェクトを作成します。 詳細については、「SQL Server Audit (データベース エンジン)」を参照してください。

Transact-SQL 構文表記規則

構文

CREATE SERVER AUDIT audit_name
{
    TO { [ FILE (<file_options> [ , ...n ] ) ] | APPLICATION_LOG | SECURITY_LOG | URL | EXTERNAL_MONITOR }
    [ WITH ( <audit_options> [ , ...n ] ) ]
    [ WHERE <predicate_expression> ]
}
[ ; ]

<file_options>::=
{
    FILEPATH = 'os_file_path'
    [ , MAXSIZE = { max_size { MB | GB | TB } | UNLIMITED } ]
    [ , { MAX_ROLLOVER_FILES = { integer | UNLIMITED } } | { MAX_FILES = integer } ]
    [ , RESERVE_DISK_SPACE = { ON | OFF } ]
}

<audit_options> ::=
{
    [ QUEUE_DELAY = integer ]
    [ , ON_FAILURE = { CONTINUE | SHUTDOWN | FAIL_OPERATION } ]
    [ , AUDIT_GUID = uniqueidentifier ]
    [ , OPERATOR_AUDIT = { ON | OFF } ]
}

<predicate_expression> ::=
{
    [ NOT ] <predicate_factor>
    [ { AND | OR } [ NOT ] { <predicate_factor> } ]
    [ , ...n ]
}

<predicate_factor>::=
    event_field_name { = | < > | != | > | >= | < | <= | LIKE } { number | ' string ' }

引数

TO { FILE | APPLICATION_LOG | SECURITY_LOG | URL | EXTERNAL_MONITOR }

監査ターゲットの場所を指定します。 オプションは、バイナリ ファイル、Windows アプリケーション ログ、または Windows セキュリティ ログです。 SQL Server は、Windows で追加の設定を行わないと Windows セキュリティ ログに書き込むことができません。 詳細については、「セキュリティ ログへの SQL Server 監査イベントの書き込み」を参照してください。

URL ターゲットは SQL Server ではサポートされていません。

重要

Azure SQL Managed Instance では、SQL 監査はサーバー レベルで動作します。 場所は URL または EXTERNAL_MONITOR にのみすることができます。

FILEPATH = 'os_file_path'

監査ログのパス。 ファイル名は、監査名と監査 GUID に基づいて生成されます。 このパスが無効な場合、監査は作成されません。

FILEPATH ターゲットは、Azure SQL Managed Instance ではサポートされていません。 代わりに PATH を使用する必要があります。

MAXSIZE = max_size

監査ファイルのサイズの上限を指定します。 max_size の値は、整数の後に MB、GB、TB を付けて指定するか、または UNLIMITED を指定します。 max_size に指定できる最小サイズは 2 MB、最大サイズは 2,147,483,647 TB です。 UNLIMITED を指定した場合、ファイルはディスクがいっぱいになるまで拡張されます。 (0UNLIMITED を示します。) 2 MB 未満の値を指定すると、エラー MSG_MAXSIZE_TOO_SMALL が発生します。 既定値は UNLIMITED です。

MAXSIZE ターゲットは、Azure SQL Managed Instance ではサポートされていません。

MAX_ROLLOVER_FILES = { integer | UNLIMITED }

現在のファイルに加えてファイル システム内に保持するファイルの最大数を指定します。 MAX_ROLLOVER_FILES 値は、整数または UNLIMITED にする必要があります。 既定値は UNLIMITED です。 監査が再開されるたび (データベース エンジン のインスタンスの再起動時や、監査をオフにして再度オンにしたとき)、または MAXSIZE に達して新しいファイルが必要になった場合に、このパラメーターが評価されます。 MAX_ROLLOVER_FILES の評価時にファイル数が MAX_ROLLOVER_FILES の設定を超えている場合、最も古いファイルが削除されます。 そのため、MAX_ROLLOVER_FILES の設定が 0 の場合、MAX_ROLLOVER_FILES 設定が評価されるたびに新しいファイルが作成されます。 MAX_ROLLOVER_FILES 設定の評価時に自動的に削除されるファイルは 1 つだけです。したがって、MAX_ROLLOVER_FILES の値を下げても、古いファイルを手動で削除しない限り、ファイル数は少なくなりません。 指定できるファイルの最大数は 2,147,483,647 です。

Azure SQL Managed Instance では MAX_ROLLOVER_FILES をサポートしていません。

MAX_FILES = integer

適用対象: SQL Server 2012 (11.x) 以降。

作成できる監査ファイルの最大数を指定します。 制限に達しても、最初のファイルへのロールオーバーは行われません。 MAX_FILES の制限に達すると、追加の監査イベントを生成させるアクションは失敗し、エラーが発生します。

RESERVE_DISK_SPACE = { ON | OFF }

このオプションは、ディスク上のファイルを MAXSIZE 値に事前に割り当てます。 MAXSIZEUNLIMITED と等しくない場合にのみ適用されます。 既定値は OFF です。

RESERVE_DISK_SPACE ターゲットは、Azure SQL Managed Instance ではサポートされていません。

QUEUE_DELAY = integer

監査アクションの処理が強制されるまでの経過時間 (ミリ秒) を指定します。 値 0 は同期配信を表します。 クエリ遅延に設定可能な最小値は 1000 (1 秒) で、これが既定値です。 最大値は 2147483647 (2,147,483.647 秒、つまり 24 日、20 時間、31 分、23.647 秒) です。 無効な数値を指定すると、MSG_INVALID_QUEUE_DELAY エラーが発生します。

ON_FAILURE = { CONTINUE | SHUTDOWN | FAIL_OPERATION }

ターゲットで監査ログへの書き込みができない場合に、ターゲットへのインスタンスの書き込みをエラーにするか、続行するか、SQL Server を停止するかを示します。 既定値は CONTINUE です。

CONTINUE

SQL Server 操作を続行します。 監査レコードは保持されません。 監査はイベントのログ記録を試行し続け、エラー状態が解決されると、記録を再開します。 続行オプションを選択すると、セキュリティ ポリシーに違反する可能性がある、監査されない活動を許可する場合があります。 完全な監査を維持することより、データベース エンジンの操作を続行することの方が重要である場合に、このオプションを使用します。

SHUTDOWN

SQL Server がなんらかの理由で監査ターゲットへのデータの書き込みに失敗した場合は、SQL Server のインスタンスを強制的にシャットダウンします。 CREATE SERVER AUDIT ステートメントを実行しているログインには、SQL Server 内での SHUTDOWN 権限が必要です。 実行中のログインから SHUTDOWN 権限が後で取り消された場合でも、シャットダウンの動作は継続します。 ユーザーがこのアクセス許可を持っていない場合は、ステートメントが失敗し、監査は作成されません。 監査エラーによってシステムのセキュリティまたは整合性が阻害される可能性がある場合に、このオプションを使用します。 詳細については、「SHUTDOWN」を参照してください。

FAIL_OPERATION

適用対象: SQL Server 2012 (11.x) 以降。

監査イベントを発生させるデータベース アクションを失敗させます。 監査イベントを発生させないアクションは続行できますが、監査イベントを発生させることはできません。 監査はイベントのログ記録を試行し続け、エラー状態が解決されると、記録を再開します。 データベース エンジンへのフル アクセスより、完全な監査の維持の方が重要である場合に、このオプションを使用します。

AUDIT_GUID = uniqueidentifier

監査には、データベース ミラーリングなどのシナリオをサポートするために、ミラーリングされたデータベースで見つかった GUID と照合する特定の GUID が必要です。 この GUID は、監査が作成されると変更できなくなります。

OPERATOR_AUDIT

適用対象: Azure SQL Managed Instance のみ。

サポート リクエストの間に Microsoft サポート エンジニアがお客様のサーバーにアクセスする必要がある場合に、監査によってその操作がキャプチャされるかどうかを示します。

predicate_expression

適用対象: SQL Server 2012 (11.x) 以降のバージョン。

イベントを処理する必要があるかどうかを判定するために使用する述語式を指定します。 述語式は 3,000 文字に制限され、これにより文字列引数が制限されます。

event_field_name

適用対象: SQL Server 2012 (11.x) 以降のバージョン。

述語ソースを識別するイベント フィールドの名前です。 監査フィールドについては、「sys.fn_get_audit_file (Transact-SQL)」で説明されています。 file_nameaudit_file_offsetevent_time 以外のすべてのフィールドは監査できます。

Note

action_id および class_type フィールドは、型が sys.fn_get_audit_file に示されている varchar で、フィルター対象の述語ソースである場合にのみ、数値と共に使用できます。 class_type で使用する値のリストを取得するには、次のクエリを実行します。

SELECT spt.[name], spt.[number]
FROM   [master].[dbo].[spt_values] spt
WHERE  spt.[type] = N'EOD'
ORDER BY spt.[name];

数値

適用対象: SQL Server 2012 (11.x) 以降のバージョン。

decimal を含む任意の数値型です。 制限として、使用可能な物理メモリの不足、または 64 ビット整数として表すのに大きすぎる数字が挙げられます。

'文字列'

適用対象: SQL Server 2012 (11.x) 以降のバージョン。

述語の比較に必要な ANSI 文字列または Unicode 文字列です。 述語比較関数に対しては、暗黙の文字列型変換は行われません。 無効な型を渡すとエラーになります。

解説

作成されたサーバー監査は無効な状態です。

CREATE SERVER AUDIT ステートメントはトランザクションのスコープ内にあります。 トランザクションがロールバックされると、ステートメントもロールバックされます。

アクセス許可

サーバー監査を作成、変更、または削除する場合、プリンシパルには、ALTER ANY SERVER AUDIT または CONTROL SERVER の権限が必要です。

改ざんを防止するために監査情報をファイルに保存する場合は、そのファイルの場所へのアクセスを制限します。

A. ファイル ターゲットを使用するサーバー監査を作成する

次の例では、バイナリ ファイルをターゲットとする HIPAA_Audit というサーバー監査を、オプションなしで作成します。

CREATE SERVER AUDIT HIPAA_Audit
    TO FILE ( FILEPATH ='\\SQLPROD_1\Audit\' );

B. Windows アプリケーション ログ ターゲットを使用するサーバー監査をオプション付きで作成する

次の例では、Windows アプリケーション ログをターゲット セットとする HIPAA_Audit というサーバー監査を作成します。 キューには 1 秒ごとに書き込みが行われ、失敗時はキューによって SQL Server エンジンがシャットダウンされます。

CREATE SERVER AUDIT HIPAA_Audit
    TO APPLICATION_LOG
    WITH ( QUEUE_DELAY = 1000,  ON_FAILURE = SHUTDOWN);

C: WHERE 句を含むサーバー監査を作成する

次の例では、データベース、スキーマ、およびサンプルの 2 つのテーブルを作成します。 DataSchema.SensitiveData という名前のテーブルには機密データが含まれ、このテーブルへのアクセスは監査に記録する必要があります。 DataSchema.GeneralData という名前のテーブルには、機密データは含まれません。 データベース監査の仕様によって、DataSchema スキーマのすべてのオブジェクトへのアクセスが監査されます。 サーバー監査の対象を SensitiveData テーブルのみに制限する WHERE 句付きで、サーバー監査が作成されます。 サーバー監査は、監査フォルダーが C:\SQLAudit にあることを前提としています。

CREATE DATABASE TestDB;
GO
USE TestDB;
GO
CREATE SCHEMA DataSchema;
GO
CREATE TABLE DataSchema.GeneralData (ID int PRIMARY KEY, DataField varchar(50) NOT NULL);
GO
CREATE TABLE DataSchema.SensitiveData (ID int PRIMARY KEY, DataField varchar(50) NOT NULL);
GO
-- Create the server audit in the master database
USE master;
GO
CREATE SERVER AUDIT AuditDataAccess
    TO FILE ( FILEPATH ='C:\SQLAudit\' )
    WHERE object_name = 'SensitiveData' ;
GO
ALTER SERVER AUDIT AuditDataAccess WITH (STATE = ON);
GO
-- Create the database audit specification in the TestDB database
USE TestDB;
GO
CREATE DATABASE AUDIT SPECIFICATION [FilterForSensitiveData]
FOR SERVER AUDIT [AuditDataAccess]
ADD (SELECT ON SCHEMA::[DataSchema] BY [public])
WITH (STATE = ON);
GO
-- Trigger the audit event by selecting from tables
SELECT ID, DataField FROM DataSchema.GeneralData;
SELECT ID, DataField FROM DataSchema.SensitiveData;
GO
-- Check the audit for the filtered content
SELECT * FROM fn_get_audit_file('C:\SQLAudit\AuditDataAccess_*.sqlaudit',default,default);
GO