

# SQL Server Audit
<a name="Appendix.SQLServer.Options.Audit"></a>

Amazon RDS では、組み込みの SQL Server 監査メカニズムを使用して、Microsoft SQL Server データベースを監査することができます。監査と監査の仕様は、オンプレミスのデータベースサーバー用にそれらを作成するのと同じ方法で作成することができます。

RDS は、完了した監査ログを S3 バケットにアップロードします。この際、作成されたロールを IAM 使用します。保存を有効にしている場合、RDS は設定された期間、監査ログを DB インスタンスに保存します。

詳細については、Microsoft SQL Server ドキュメントの「[SQL Server Audit (database engine)](https://docs.microsoft.com/sql/relational-databases/security/auditing/sql-server-audit-database-engine)」を参照してください。

## データベースアクティビティストリームを使用した SQL Server Audit
<a name="Appendix.SQLServer.DAS.Audit"></a>

RDS のデータベースアクティビティストリームを使用すると、SQL Server Audit イベントを Imperva、McAfee、IBM のデータベースアクティビティ監視ツールと統合できます。RDS SQL Server のデータベースアクティビティストリームによる監査の詳細については、「[Microsoft SQL Server での監査](DBActivityStreams.md#DBActivityStreams.Overview.SQLServer-auditing)」を参照してください。

**Topics**
+ [データベースアクティビティストリームを使用した SQL Server Audit](#Appendix.SQLServer.DAS.Audit)
+ [SQL Server Audit のサポート](#Appendix.SQLServer.Options.Audit.Support)
+ [SQL Server Audit を DB インスタンスオプションに追加する](Appendix.SQLServer.Options.Audit.Adding.md)
+ [SQL Server Audit を使用する](Appendix.SQLServer.Options.Audit.CreateAuditsAndSpecifications.md)
+ [監査ログの表示](Appendix.SQLServer.Options.Audit.AuditRecords.md)
+ [マルチ AZ インスタンスで SQL Server Audit を使用する](#Appendix.SQLServer.Options.Audit.Multi-AZ)
+ [S3 バケットを設定する](Appendix.SQLServer.Options.Audit.S3bucket.md)
+ [SQL Server Audit の IAM ロールを手動で作成する](Appendix.SQLServer.Options.Audit.IAM.md)

## SQL Server Audit のサポート
<a name="Appendix.SQLServer.Options.Audit.Support"></a>

Amazon RDS では、SQL Server 2016 以降、SQL Server のすべてのエディションでサーバーレベルの監査がサポートされており、Enterprise エディションでもデータベースレベルの監査がサポートされています。SQL サーバー 2016 (13.x) SP1 以降では、すべてのエディションでサーバーレベルとデータベースレベルの両方の監査がサポートされています。詳細については、SQL Server ドキュメントの「[SQL Server Audit (database engine)](https://docs.microsoft.com/sql/relational-databases/security/auditing/sql-server-audit-database-engine)」を参照してください。

RDS では、SQL Server Audit に関する次のオプション設定の構成をサポートしています。


| オプション設定 | 有効な値 | 説明 | 
| --- | --- | --- | 
| IAM\$1ROLE\$1ARN | 形式 arn:aws:iam::account-id:role/role-name の有効な Amazon リソースネーム (ARN)。 | 監査ログを保存する S3 バケットへのアクセスを許可する IAM ロールの ARN。詳細については、AWS 全般のリファレンス の「[Amazon リソースネーム (ARN)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-iam)」を参照してください。 | 
| S3\$1BUCKET\$1ARN | arn:aws:s3:::amzn-s3-demo-bucket 形式または arn:aws:s3:::amzn-s3-demo-bucket/key-prefix 形式の有効な ARN。 | 監査ログを保存する S3 バケットの ARN。 | 
| ENABLE\$1COMPRESSION | true または false | 監査ログの圧縮を行います。デフォルトでは、圧縮は有効です (true に設定されている)。 | 
| RETENTION\$1TIME | 0 ～840  | SQL Server 監査レコードが RDS インスタンスに保持される保持期間 (時間単位)。保持設定は、デフォルトでは無効になります。 | 

# SQL Server Audit を DB インスタンスオプションに追加する
<a name="Appendix.SQLServer.Options.Audit.Adding"></a>

SQL Server 監査を有効にするには、DB インスタンスでオプションを有効にすることと、SQL Server 内の機能を有効にすることの 2 つのステップを行う必要があります。SQL Server Audit オプションを DB インスタンスに追加するプロセスは次のとおりです。

1. 新しいオプショングループを作成するか、既存のオプショングループをコピーまたは変更します。

1. すべての必須オプションを追加して構成します。

1. オプショングループを DB インスタンスに関連付けます。

SQL Server Audit オプションを追加後、DB インスタンスを再起動する必要はありません。オプショングループがアクティブになった時点で、監査を作成して監査ログを S3 バケットに保存できるようになります。

**DB インスタンスのオプショングループに SQL Server Audit を追加して設定するには**

1. 次のいずれかを選択します。
   + 既存のオプショングループを使用します。
   + カスタムの DB オプショングループを作成し、そのオプショングループを使用します。詳細については、「[オプショングループを作成する](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)」を参照してください。

1. オプショングループに [**SQLSERVER\$1AUDIT**] オプションを追加し、オプション設定を構成します。オプションの追加方法の詳細については、「[オプショングループにオプションを追加する](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)」を参照してください。
   + 必要なポリシーがアタッチされた IAM ロールがある場合は、[**IAM ロール**] で、そのロールを選択できます。新しい IAM ロールを作成するには、[**新しいロールの作成**] を選択します。必要なポリシーの詳細については、[SQL Server Audit の IAM ロールを手動で作成する](Appendix.SQLServer.Options.Audit.IAM.md) を参照してください。
   + 使用する S3 バケットが既にある場合は、[**S3 送信先の選択**] で、そのバケットを選択します。S3 バケットを作成するには、[**新しい S3 バケットの作成**] を選択します。
   + 監査ファイルを圧縮する場合は、[**圧縮の有効化**] オプションをオンにします。デフォルトでは、圧縮は有効になっています。圧縮を無効にするには、[**Enable Compression (圧縮の有効化)**] をオフにします。
   + DB インスタンスの監査レコードを保持するには、[**Audit log retention (監査ログの保持**)] オプションをオンにします。保持期間 (時間) を指定します。最大保持期間は 35 日間です。

1. 新規または既存の DB インスタンスに、DB オプショングループを適用します。次のいずれかを選択します。
   + 新しい DB インスタンスを作成する場合は、インスタンスを起動するときにオプショングループを適用します。
   + 既存の DB インスタンスで、インスタンスを変更し、新しいオプショングループをアタッチして、オプショングループを適用します。詳細については、「[Amazon RDS DB インスタンスを変更する](Overview.DBInstance.Modifying.md)」を参照してください。

## SQL Server Audit オプションを変更する
<a name="Appendix.SQLServer.Options.Audit.Modifying"></a>

SQL Server Audit オプションを有効にしたら、設定を変更できます。オプション設定の変更方法の詳細については、「[オプションの設定を変更する](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ModifyOption)」を参照してください。

## DB インスタンスオプションから SQL Server Audit を削除する
<a name="Appendix.SQLServer.Options.Audit.Removing"></a>

SQL Server Audit 機能をオフにするには、監査を無効にし、オプションを削除します。

**監査を削除するには**

1. SQL Server 内の監査設定をすべて無効にします。監査が実行されている場所を確認するには、SQL Server セキュリティカタログビューをクエリします。詳細については、Microsoft SQL Server ドキュメントの「[Security catalog views](https://docs.microsoft.com/sql/relational-databases/system-catalog-views/security-catalog-views-transact-sql)」を参照してください。

1. DB インスタンスから SQL Server Audit オプションを削除します。次のいずれかを選択します。
   + DB インスタンスで使用しているオプショングループから SQL Server Audit オプションを削除します。この変更は同じオプショングループを使用するすべての DB インスタンスに影響します。詳細については、「[オプショングループからオプションを削除する](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)」を参照してください。
   + DB インスタンスを変更し、オプショングループを選択します (SQL Server Audit オプションはオフ)。この変更は、変更した DB インスタンスにのみ影響します。デフォルト (空) のオプショングループや別のカスタムオプショングループを指定できます。詳細については、「[Amazon RDS DB インスタンスを変更する](Overview.DBInstance.Modifying.md)」を参照してください。

1. DB インスタンスから SQL Server Audit オプションを削除後、インスタンスを再起動する必要はありません。S3 バケットから不要な監査ファイルを削除します。

# SQL Server Audit を使用する
<a name="Appendix.SQLServer.Options.Audit.CreateAuditsAndSpecifications"></a>

サーバー監査、サーバー監査の仕様、およびデータベース監査の仕様は、オンプレミスデータベースサーバーの場合と同じ方法で制御することができます。

## 監査の作成
<a name="Appendix.SQLServer.Options.Audit.CreateAudits"></a>

サーバーの監査は、オンプレミスデータベースサーバーで作成した方法と同じ方法で作成することができます。サーバー監査の作成方法については、Microsoft SQL Server ドキュメントの「[CREATE SERVER AUDIT](https://docs.microsoft.com/sql/t-sql/statements/create-server-audit-transact-sql)」を参照してください。

エラーを回避するには、次の制限に準拠します。
+ インスタンスごとにサポートされるサーバー監査の最大数 50 を超えない。
+ データをバイナリファイルに書き込むように SQL Server に指示する。
+ サーバーの監査名のプリフィックスとして `RDS_` を使用しない。
+ `FILEPATH` で、`D:\rdsdbdata\SQLAudit` を指定する。
+ `MAXSIZE` で、2 MB～50 MB の間のサイズを指定する。
+ `MAX_ROLLOVER_FILES` または `MAX_FILES` を設定しない。
+ 監査レコードの書き込みに失敗した場合に DB インスタンスをシャットダウンするように SQL Server を構成しない。

## 監査仕様の作成
<a name="Appendix.SQLServer.Options.Audit.CreateSpecifications"></a>

サーバー監査仕様とデータベース監査仕様は、オンプレミスデータベースサーバーで作成するのと同じ方法で作成します。監査仕様の作成方法については、Microsoft SQL Server のドキュメントの「[CREATE SERVER AUDIT SPECIFICATION](https://docs.microsoft.com/sql/t-sql/statements/create-server-audit-specification-transact-sql)」および「[CREATE DATABASE AUDIT SPECIFICATION](https://docs.microsoft.com/sql/t-sql/statements/create-database-audit-specification-transact-sql)」を参照してください。

エラーを回避するために、データベース監査仕様またはサーバー監査仕様の名前のプリフィックスとして `RDS_` を使用しないでください。

# 監査ログの表示
<a name="Appendix.SQLServer.Options.Audit.AuditRecords"></a>

監査ログは `D:\rdsdbdata\SQLAudit` に格納されます。

ファイルがサイズ制限に達している場合に SQL Server が監査ログファイルへの書き込みを完了すると、Amazon RDS はファイルを S3 バケットにアップロードします。保持設定が有効になっている場合、Amazon RDS は、このファイルを保持フォルダ (`D:\rdsdbdata\SQLAudit\transmitted`) に移動します。

保持設定については、[SQL Server Audit を DB インスタンスオプションに追加する](Appendix.SQLServer.Options.Audit.Adding.md) を参照してください。

監査ログファイルがアップロードされるまで、監査レコードは DB インスタンスに維持されます。監査レコードを表示するには、次のコマンドを実行します。

```
SELECT   * 
	FROM     msdb.dbo.rds_fn_get_audit_file
	             ('D:\rdsdbdata\SQLAudit\*.sqlaudit'
	             , default
	             , default )
```

同じコマンドを使用して、保持フォルダの監査レコードを表示するには、フィルタを `D:\rdsdbdata\SQLAudit\transmitted\*.sqlaudit` に変更します。

```
SELECT   * 
	FROM     msdb.dbo.rds_fn_get_audit_file
	             ('D:\rdsdbdata\SQLAudit\transmitted\*.sqlaudit'
	             , default
	             , default )
```

## マルチ AZ インスタンスで SQL Server Audit を使用する
<a name="Appendix.SQLServer.Options.Audit.Multi-AZ"></a>

マルチ AZ インスタンスで、監査ログファイルを Amazon S3 に送信するためのプロセスは、単一 AZ インスタンスのプロセスと似ています。ただし、重要な相違点がいくつかあります。
+ データベース監査仕様オブジェクトはすべてのノードにレプリケートされます。
+ サーバー監査およびサーバー監査仕様は、セカンダリノードにはレプリケートされません。その代わりに、手動で作成または変更する必要があります。

サーバー監査またはサーバー監査仕様を両方のノードからキャプチャするには

1. サーバー監査またはサーバー監査仕様をプライマリノードに作成します。

1. セカンダリノードにフェイルオーバーし、セカンダリノードに同じ名前と GUID を持つサーバー監査仕様またはサーバー監査仕様を作成します。GUID を指定するには、`AUDIT_GUID` パラメータを使用します。

# S3 バケットを設定する
<a name="Appendix.SQLServer.Options.Audit.S3bucket"></a>

監査ログファイルは、DB インスタンスから S3 バケットに自動的にアップロードされます。監査ファイルのターゲットとして使用する S3 バケットには、以下の制限が適用されます。
+ DB インスタンスと同じ AWS リージョンおよび AWS アカウントにある必要があります。
+ 公開することは禁止されています。
+ バケット所有者は IAM ロール所有者でもある必要があります。
+ IAM ロールには、S3 バケットのサーバー側の暗号化に関連付けられたカスタマー管理の KMS キーに対するアクセス許可が必要です。

データを格納するために使用されるターゲットキーは、次の命名スキーマに従います: `amzn-s3-demo-bucket/key-prefix/instance-name/audit-name/node_file-name.ext` 

**注記**  
バケット名とキープレフィックス値の両方を (`S3_BUCKET_ARN`) オプションで設定します。

このスキーマは、以下の要素で構成されています。
+ ***amzn-s3-demo-bucket*** – S3 バケットの名前。
+ **`key-prefix`** - 監査ログに使用するカスタムキープレフィックス。
+ **`instance-name`** - Amazon RDS インスタンスの名前。
+ **`audit-name`** - 監査の名前。
+ **`node`** - 監査ログの出典であるノードの識別子 (`node1` または `node2`)。シングル AZ インスタンスには 1 つのノード、マルチ AZ インスタンスには 2 つのレプリケーションノードがあります。プライマリノードとセカンダリノードのロールは時間とともに変化するため、これらはプライマリノードとセカンダリノードではありません。その代わりに、ノード識別子はシンプルなラベルです。
  + **`node1`** - 初期のレプリケーションノード (シングル AZ には 1 つのノードのみがあります)。
  + ** 2 `node2`** -番目のレプリケーションノード (マルチ AZ には 2 つのノードがあります)。
+ **`file-name`** - ターゲットファイルの名前。ファイル名は SQL Server からそのまま取得されます。
+ **`ext`** - ファイルの拡張子 (`zip` または `sqlaudit`)。
  + **`zip`** - 圧縮が有効になっているかどうか (デフォルト)。
  + **`sqlaudit`** - 圧縮が無効になっているかどうか。

# SQL Server Audit の IAM ロールを手動で作成する
<a name="Appendix.SQLServer.Options.Audit.IAM"></a>

通常、新しいオプションを作成すると、AWS マネジメントコンソール は IAM ロールと IAM 信頼ポリシーを作成します。ただし、SQL Server Audits で使用する新しい IAM ロールを手動で作成して、必要に応じてその他の要件に合わせてカスタマイズできます。そのためには、Amazon RDS サービスで Amazon S3 バケットを使用できるように、IAM ロールを作成して、アクセス許可を委任します。この IAM ロールを作成したら、信頼ポリシーとアクセス許可ポリシーをアタッチします。信頼ポリシーを使用することで、Amazon RDS はこのロールを引き受けることができます。アクセス許可ポリシーでは、このロールが実行できるアクションを定義します。詳細については、*AWS Identity and Access Management ユーザーガイド*の[AWS のサービスに許可を委任するロールの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)を参照してください。

必要な信頼関係とアクセス許可ポリシーは、このセクションの例を使用して作成できます。

以下の例は、SQL Server Audit の信頼関係を示しています。この例では、*サービスプリンシパル* `rds.amazonaws.com` を使用して、RDS で S3 バケットに書き込めるようにしています。*サービスプリンシパル*は、サービスにアクセス許可を付与するために使用される識別子です。このように、いつでも `rds.amazonaws.com` にアクセス許可を付与できます。これにより、RDS はお客様に代わってアクションを実行できるようになります。サービスプリンシパルの詳細については、[AWS JSON ポリシーの要素: プリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)を参照してください。

**Example SQL Server Audit の信頼関係**    
****  

```
{
	    "Version":"2012-10-17",		 	 	 
	    "Statement": [
	        {
	            "Effect": "Allow",
	            "Principal": {
	                "Service": "rds.amazonaws.com"
	            },
	            "Action": "sts:AssumeRole"
	        }
	    ]
	}
```

リソースベースの信頼関係では [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) および [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) のグローバル条件コンテキストキーを使用して、サービスに付与する特定のリソースへのアクセス許可を制限することをお勧めします。これは、[混乱した使節の問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)に対する最も効果的な保護方法です。

両方のグローバル条件コンテキストキーを使用し、`aws:SourceArn` 値にアカウント ID を含めます。この場合は、`aws:SourceAccount` 値と `aws:SourceArn` 値のアカウントは、同じステートメントで使用する場合、同じアカウント ID を使用する必要があります。
+ 単一リソースに対するクロスサービスアクセスが必要な場合は `aws:SourceArn` を使用します。
+ そのアカウント内の任意のリソースをクロスサービス使用に関連付けることを許可する場合、`aws:SourceAccount`を使用します。

信頼関係では、`aws:SourceArn` グローバル条件コンテキストキーに、必ず、ロールにアクセスするリソースの完全な Amazon リソースネーム (ARN) を使用します。SQL Server Audit の場合は、次の例に示すように、DB オプショングループと DB インスタンスの両方を必ず含めるようにしてください。

**Example SQL Server Audit のグローバル条件コンテキストキーとの信頼関係**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "rds.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": [
                        "arn:aws:rds:Region:my_account_ID:db:db_instance_identifier",
                        "arn:aws:rds:Region:my_account_ID:og:option_group_name"
                    ]
                }
            }
        }
    ]
}
```

SQL Server Audit のアクセス許可ポリシーの次の例では、Amazon S3 バケットの ARN を指定します。ARN を使用して、アクセス許可を付与する特定のアカウント、ユーザー、またはロールを識別します。ARN の使用の詳細については、[Amazon リソースネーム (ARN)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) を参照してください。

**Example SQL Server Audit のアクセス許可ポリシー**    
****  

```
{
	    "Version":"2012-10-17",		 	 	 
	    "Statement": [
	        {
	            "Effect": "Allow",
	            "Action": "s3:ListAllMyBuckets",
	            "Resource": "*"
	        },
	        {
	            "Effect": "Allow",
	            "Action": [
	                "s3:ListBucket",
	                "s3:GetBucketACL",
	                "s3:GetBucketLocation"
	            ],
	            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
	        },
	        {
	            "Effect": "Allow",
	            "Action": [
	                "s3:PutObject",
	                "s3:ListMultipartUploadParts",
	                "s3:AbortMultipartUpload"
	            ],
	            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/key_prefix/*"
	        }
	    ]
	}
```

**注記**  
`s3:ListAllMyBuckets` アクションは、同じ AWS アカウントが S3 バケットと SQL Server DB インスタンスの両方を所有していることを確認するために必要です。このアクションは、アカウント内のバケットの名前を一覧表示します。  
S3 バケットの名前空間はグローバルです。誤ってバケットを削除した場合は、別のユーザーが同じ名前のバケットを別のアカウントで作成できます。次に、SQL Server 監査データが新しいバケットに書き込まれます。