

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

在 Amazon RDS 中，您可以使用内置 SQL Server 审核机制来审核 Microsoft SQL Server 数据库。您可以按照为本地数据库服务器创建审核和审核规范的相同方式来创建它们。

RDS 使用您提供的 IAM 角色将完成的审核日志上传到 S3 存储桶。如果您启用保留，则 RDS 会在配置的时间段内将您的审核日志保留在您的数据库实例中。

有关更多信息，请参阅 Microsoft SQL Server 文档中的 [SQL Server Audit（数据库引擎）](https://docs.microsoft.com/sql/relational-databases/security/auditing/sql-server-audit-database-engine)。

## SQL Server 审计与数据库活动流
<a name="Appendix.SQLServer.DAS.Audit"></a>

您可以使用 RDS 的数据库活动流，将 SQL Server 审计事件与 Imperva、McAfee 和 IBM 中的数据库活动监控工具集成。有关使用 RDS SQL Server 的数据库活动流进行审计的详细信息，请参阅[Microsoft SQL Server 中的审计](DBActivityStreams.md#DBActivityStreams.Overview.SQLServer-auditing) 

**Topics**
+ [SQL Server 审计与数据库活动流](#Appendix.SQLServer.DAS.Audit)
+ [SQL Server Audit 支持](#Appendix.SQLServer.Options.Audit.Support)
+ [将 SQL Server Audit 添加到数据库实例选项](Appendix.SQLServer.Options.Audit.Adding.md)
+ [使用 SQL Server Audit](Appendix.SQLServer.Options.Audit.CreateAuditsAndSpecifications.md)
+ [查看审核日志](Appendix.SQLServer.Options.Audit.AuditRecords.md)
+ [将 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 的所有版本都支持服务器级审计，而企业版还支持数据库级审计。从 SQL Server 2016 (13.x) SP1 开始，所有版本支持服务器级别和数据库级别审核。有关更多信息，请参阅 SQL Server 文档中的 [SQL Server Audit（数据库引擎）](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 Resource Name (ARN)。 | IAM 角色的 ARN，该角色对您想要用于存储审核日志的 S3 存储桶授予访问权。有关更多信息，请参阅《AWS 一般参考》中的 [Amazon 资源名称（ARN）](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-iam)。 | 
| S3\$1BUCKET\$1ARN | 有效 ARN 为 arn:aws:s3:::amzn-s3-demo-bucket 或 arn:aws:s3:::amzn-s3-demo-bucket/key-prefix 格式 | 您想要用于存储审核日志的 S3 存储桶的 ARN。 | 
| ENABLE\$1COMPRESSION | true 或者 false | 控制审核日志压缩。默认情况下，启用压缩（设置为 true）。 | 
| RETENTION\$1TIME | 0 到 840 | SQL Server 审核记录在您的 RDS 实例上保留的时间（按小时计）。默认情况下，禁用保留。 | 

# 将 SQL Server Audit 添加到数据库实例选项
<a name="Appendix.SQLServer.Options.Audit.Adding"></a>

启用 SQL Server Audit 需要两个步骤：在数据库实例上启用选项，然后在 SQL Server 内启用功能。将 SQL Server Audit 选项添加到数据库实例的流程如下：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 添加和配置所有必需的选项。

1. 将选项组与数据库实例相关联。

添加 SQL Server Audit 选项后，您无需重新启动数据库实例。只要选项组处于活动状态，您就可以创建审核并在 S3 存储桶中存储审核日志。

**若要在数据库实例的选项组中添加和配置 SQL Server Audit**

1. 选择以下选项之一：
   + 使用现有选项组。
   + 创建自定义数据库选项组并使用该选项组。有关更多信息，请参阅“[创建选项组](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 存储桶，请选择 **Create a New S3 Bucket**（创建新的 S3 存储桶）。
   + 对于**启用压缩**，请将此选项保留为选中状态以压缩审核文件。默认情况下，压缩已启用。若要禁用压缩，请取消选中 **Enable Compression (启用压缩)**。
   + 对于**审核日志保留**，如需在数据库实例上保留审核记录，请选择此选项。指定保留时间，按小时计。最长保留时间为 35 天。

1. 将选项组应用到新的或现有的数据库实例。选择以下选项之一：
   + 如果您正在创建新的数据库实例，请在启动实例时应用选项组。
   + 在现有数据库实例上，请通过修改实例并附加新的选项组来应用选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

## 修改 SQL Server Audit 选项
<a name="Appendix.SQLServer.Options.Audit.Modifying"></a>

启用 SQL Server Audit 选项后，您可以修改各项设置。有关如何修改选项设置的信息，请参阅[修改选项设置](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ModifyOption)。

## 从数据库实例选项中删除 SQL Server Audit
<a name="Appendix.SQLServer.Options.Audit.Removing"></a>

您可以通过禁用审核并删除选项来关闭 SQL Server Audit 功能。

**若要删除审核**

1. 禁用 SQL Server 内的所有审核设置。若要了解审核在何处运行，请查询 SQL Server 安全性目录视图。有关更多信息，请参阅 Microsoft SQL Server 文档中的[安全性目录视图](https://docs.microsoft.com/sql/relational-databases/system-catalog-views/security-catalog-views-transact-sql)。

1. 从数据库实例中删除 SQL Server Audit 选项。选择以下选项之一：
   + 从数据库实例使用的选项组中删除 SQL Server Audit 选项。此更改会影响使用相同选项组的所有数据库实例。有关更多信息，请参阅“[从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)”。
   + 修改数据库实例，然后选择一个没有 SQL Server Audit 选项的选项组。此更改仅影响您修改的数据库实例。您可以指定默认 (空) 选项组，或指定其他自定义选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

1. 从数据库实例中删除 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 文档中的[创建服务器审核](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`。
+ 请勿将 SQL Server 配置为在数据库实例未能写入审核记录时将其关闭。

## 创建审核规范
<a name="Appendix.SQLServer.Options.Audit.CreateSpecifications"></a>

按照为本地数据库服务器创建服务器审核规范和数据库审核规范相同的方式来创建它们。有关创建审核规范的信息，请参阅 Microsoft SQL Server 文档中的[创建服务器审核规范](https://docs.microsoft.com/sql/t-sql/statements/create-server-audit-specification-transact-sql)和[创建数据库审核规范](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 添加到数据库实例选项](Appendix.SQLServer.Options.Audit.Adding.md)。

在上传审核日志文件之前，审核记录会一直保留在数据库实例上。您可以通过运行以下命令来查看审核记录。

```
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 )
```

## 将 SQL Server Audit 与多可用区实例结合使用
<a name="Appendix.SQLServer.Options.Audit.Multi-AZ"></a>

对于多可用区实例，将审核日志文件发送到 Amazon S3 的过程与单可用区实例类似。但是，二者之间存在一些重要区别：
+ 数据库审核规范对象复制到所有节点。
+ 服务器审核和服务审核规范不会复制到辅助节点。相反，您必须手动创建或修改它们。

若要从两个节点捕获服务器审核或服务器审核规范：

1. 在主节点上创建服务器审核或服务器审核规范。

1. 故障转移到辅助节点，并在辅助节点上使用相同名称和 GUID 创建服务器审核或服务器审核规范。使用 `AUDIT_GUID` 参数指定 GUID。

# 配置 S3 存储桶
<a name="Appendix.SQLServer.Options.Audit.S3bucket"></a>

审核日志文件会自动从数据库实例上传到您的 S3 存储桶。以下限制适用于您用作审核文件目标的 S3 存储桶。
+ 它必须与数据库实例位于相同的 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`）的标识符。单可用区实例有一个节点，多可用区实例有两个复制节点。这些不是主要和辅助节点，因为主要和辅助节点的角色会随时间而变化。相反，节点标识符是一个简单的标签。
  + **`node1`** – 第一个复制节点（单可用区只有一个节点）。
  + **`node2`** – 第二个复制节点（多可用区有两个节点）。
+ **`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 Audit 一起使用的新 IAM 角色，以便您可以根据自己的任何附加需求对其进行定制。为此，创建一个 IAM 角色并委托权限，以便 Amazon RDS 服务可使用您的 Amazon S3 存储桶。创建这个 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 策略元素：Principal](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 Resource Name (ARN)。对于 SQL Server Audit，请确保同时包含数据库选项组和数据库实例，如以下示例所示。

**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 Resource Name (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` 账户是否同时拥有 S3 存储桶和 SQL Server 数据库实例，需要执行 AWS 操作。该操作会列出该账户中的存储桶的名称。  
S3 存储桶命名空间是全局的。如果您意外删除了您的存储桶，则另一用户可以在其他账户中创建具有相同名称的存储桶。然后将 SQL Server Audit 数据写入新的存储桶。