

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 审核 Amazon DocumentDB 事件
<a name="event-auditing"></a>

使用 Amazon DocumentDB（与 MongoDB 兼容），您可以审核集群中执行的事件。记录的事件的示例包括成功和失败的身份验证尝试、删除数据库中的集合或创建索引。默认情况下，在 Amazon DocumentDB 上禁用审计，并要求您选择使用该功能。

启用审计后，Amazon DocumentDB 会将数据定义语言 (DDL)、数据操纵语言 (DML)、身份验证、授权和用户管理事件记录到亚马逊日志。 CloudWatch 启用审计后，Amazon DocumentDB 会将集群的审计记录（JSON 文档）导出到亚马逊 CloudWatch 日志。您可以使用亚马逊 CloudWatch 日志来分析、监控和存档您的 Amazon DocumentDB 审计事件。

尽管 Amazon DocumentDB 不收取额外费用来启用审计，但您需要为日志的 CloudWatch 使用支付标准费率。有关 CloudWatch 日志定价的信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

Amazon DocumentDB 审计功能与所监控的服务资源使用情况有明显不同。 AWS CloudTrail CloudTrail 记录使用 AWS Command Line Interface (AWS CLI) 或 AWS 管理控制台 对集群、实例、参数组和快照等资源执行的操作。默认情况下，带的资源审计 CloudTrail 处于开启状态，无法禁用。Amazon DocumentDB 审计功能是一种可选功能。它记录在集群中对对象（例如数据库、集合、索引和用户）采取的操作。

**Topics**
+ [支持的事件](#auditing-events)
+ [启用审核](#event-auditing-enabling-auditing)
+ [禁用审核](#event-auditing-disabling-auditing)
+ [访问审核事件](#event-auditing-accessing)
+ [筛选 DML 审核事件](#filtering-dml-events)

## 支持的事件
<a name="auditing-events"></a>

Amazon DocumentDB 审核支持以下事件类别：
+ **数据定义语言 (DDL)**：包括数据库管理操作、连接、用户管理和授权。
+ **数据操作语言读取事件（DML 读取）**：包括 `find()` 和各种聚合运算符、算术运算符、布尔运算符和其他读取查询运算符。
+ **数据操纵语言写入事件（DML 写入）**：包括 `insert(), update(), delete(),` 和 `bulkWrite()` 运算符 

事件类型如下所示。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/documentdb/latest/developerguide/event-auditing.html)

**注意**  
DML 事件文档参数字段中的值的大小限制为 1KB。如果该值超过 1KB，Amazon DocumentDB 将截断该值。

**注意**  
目前不审核 TTL 删除事件。

## 启用审核
<a name="event-auditing-enabling-auditing"></a>

在集群上启用审核是一个两步过程。确保两个步骤都已完成，否则审核日志将不会发送到 CloudWatch 日志。

### 步骤 1：启用 audit\$1logs 集群参数
<a name="event-auditing-enable-audit_logs"></a>

要启用审核，您需要修改参数组中的 `audit_logs` 参数。`audit_logs` 是要记录的事件列表，以逗号分隔。事件必须以小写形式指定，列表元素之间不应有空格。

您可以为参数组设置以下值：


| 值 | 说明 | 
| --- | --- | 
| ddl | 设置此设置将启用对 DDL 事件的审计，例如 createDatabase、DropDatabase、CreateCollection、DropCollection、createIndex、authCheck、身份验证、创建用户、DropUser、用户、UpdateUser 和 grantRolesTo revokeRolesFrom dropAllUsers FromDatabase | 
| dml\$1read | 设置此项将启用对 DML 读取事件的审计，例如 find、sort count、distinct、group、projecta、unwind、geoNear、geoIntersects、geoWithin 和其他 MongoDB 读取查询运算符。 | 
| dml\$1write | 设置此项将启用对 DML 写入事件的审核，例如 insert()、update()、delete() 和 bulkWrite() | 
| all | 设置此项将启用对数据库事件的审核，例如读取查询、写入查询、数据库操作和管理员操作。 | 
| none | 设置此项将禁用审核 | 
| enabled（传统） | 这是一个等同于“ddl”的传统参数设置。设置此项将启用对 DDL 事件的审计，例如 createDatabase、DropDatabase、CreateCollection、DropCollection、createIndex、authCheck、身份验证、创建用户、Drop grantRolesTo User、用户、UpdateUser 和。 revokeRolesFrom dropAllUsers FromDatabase我们不建议使用此设置，因为它是传统设置。 | 
| disabled  (传统) | 这是一个等同于“无”的传统参数设置。我们不建议使用此设置，因为它是传统设置。 | 

**注意**  
audit\$1logs 集群参数的默认值为 `none`（传统“`disabled`”）。

您也可以组合使用上述值。


| 值 | 说明 | 
| --- | --- | 
| ddl, dml\$1read | 设置此项将启用对 DDL 事件和 DML 读取事件的审核。 | 
| ddl, dml\$1write | 设置此项将启用对 DDL 事件和 DML 写入的审核 | 
| dml\$1read, dml\$1write | 设置此项将启用对所有 DML 事件的审核 | 

**注意**  
您无法修改默认参数组。

有关更多信息，请参阅下列内容：
+ [创建 Amazon DocumentDB 集群参数组](cluster_parameter_groups-create.md)

  创建自定义参数组后，通过将 `audit_logs` 参数值更改为 `all` 来修改它。
+ [修改 Amazon DocumentDB 集群参数组](cluster_parameter_groups-modify.md)

  

### 步骤 2：启用 Amazon CloudWatch 日志导出
<a name="event-auditing-enable-export"></a>

当`audit_logs`集群参数的值为`enabled`、`ddl``dml_read``dml_write`、或时，您还必须启用 Amazon DocumentDB 以将日志导出到亚马逊。 CloudWatch如果您省略了这两个步骤中的任何一个，则审核日志将不会发送到。 CloudWatch

在创建集群、执行或恢复快照时，您可以按照以下步骤启用 CloudWatch 日志。 point-in-time-restore

------
#### [ Using the AWS 管理控制台 ]

要启用 Amazon DocumentDB CloudWatch 使用控制台将日志导出到，请参阅以下主题：
+ **创建集群时**：在 [使用创建集群和主实例 AWS 管理控制台](db-cluster-create.md#db-cluster-create-con)中，请参阅**创建集群：其他配置**（步骤 5，**日志导出**）
+ **修改现有集群时**：[修改 Amazon DocumentDB 集群](db-cluster-modify.md)
+ **执行集群快照还原时**：[从集群快照还原](backup_restore-restore_from_snapshot.md)
+ **执行 point-in-time恢复时** — [还原到某个时间点](backup_restore-point_in_time_recovery.md)

------
#### [ Using the AWS CLI ]

**在创建新集群时启用审计日志**  
以下代码创建集群`sample-cluster`并启用 CloudWatch 审计日志。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws docdb create-db-cluster \
    --db-cluster-identifier sample-cluster \
    --port 27017 \
    --engine docdb \
    --master-username master-username \
    --master-user-password password \
    --db-subnet-group-name default \
    --enable-cloudwatch-logs-exports audit
```
对于 Windows：  

```
aws docdb create-db-cluster ^
    --db-cluster-identifier sample-cluster ^
    --port 27017 ^
    --engine docdb ^
    --master-username master-username ^
    --master-user-password password ^
    --db-subnet-group-name default ^
    --enable-cloudwatch-logs-exports audit
```

**在修改现有集群时启用审计日志**  
以下代码修改集群`sample-cluster`并启用 CloudWatch 审计日志。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws docdb modify-db-cluster \
   --db-cluster-identifier sample-cluster \
   --cloudwatch-logs-export-configuration '{"EnableLogTypes":["audit"]}'
```
对于 Windows：  

```
aws docdb modify-db-cluster ^
   --db-cluster-identifier sample-cluster ^
   --cloudwatch-logs-export-configuration '{"EnableLogTypes":["audit"]}'
```
这些操作的输出将类似于下文（JSON 格式）。  

```
{
    "DBCluster": {
        "HostedZoneId": "ZNKXH85TT8WVW",
        "StorageEncrypted": false,
        "DBClusterParameterGroup": "default.docdb4.0",
        "MasterUsername": "<user-name>",
        "BackupRetentionPeriod": 1,
        "Port": 27017,
        "VpcSecurityGroups": [
            {
                "Status": "active",
                "VpcSecurityGroupId": "sg-77186e0d"
            }
        ],
        "DBClusterArn": "arn:aws:rds:us-east-1:900083794985:cluster:sample-cluster",
        "Status": "creating",
        "Engine": "docdb",
        "EngineVersion": "4.0.0",
        "MultiAZ": false,
        "AvailabilityZones": [
            "us-east-1a",
            "us-east-1c",
            "us-east-1f"
        ],
        "DBSubnetGroup": "default",
        "DBClusterMembers": [],
        "ReaderEndpoint": "sample-cluster.cluster-ro-corcjozrlsfc.us-east-1.docdb.amazonaws.com",
        "EnabledCloudwatchLogsExports": [
            "audit"
        ],
        "PreferredMaintenanceWindow": "wed:03:08-wed:03:38",
        "AssociatedRoles": [],
        "ClusterCreateTime": "2019-02-13T16:35:04.756Z",
        "DbClusterResourceId": "cluster-YOS52CUXGDTNKDQ7DH72I4LED4",
        "Endpoint": "sample-cluster.cluster-corcjozrlsfc.us-east-1.docdb.amazonaws.com",
        "PreferredBackupWindow": "07:16-07:46",
        "DBClusterIdentifier": "sample-cluster"
    }
}
```

------

## 禁用审核
<a name="event-auditing-disabling-auditing"></a>

您可以通过禁用 CloudWatch 日志导出和禁用`audit_logs`参数来禁用审计。

### 禁用 CloudWatch 日志导出
<a name="event-auditing-disabling-logs-export"></a>

您可以使用 AWS 管理控制台 或禁用导出审核日志 AWS CLI。

------
#### [ Using the AWS 管理控制台 ]

以下过程使用禁用 Amazon DocumentDB AWS 管理控制台 将日志导出到。 CloudWatch

**禁用审计日志**

1. [登录 AWS 管理控制台，然后在 /docdb 上打开亚马逊文档数据库控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/docdb)

1. 在导航窗格中，选择**集群**。然后，选择要禁用导出日志的集群名称左侧的按钮。

1. 选择 **Actions (操作)**，然后选择 **Modify (修改)**。

1. 向下滚动到 **Log exports (日志导出)** 部分并选择 **Disabled (已禁用)**。

1. 选择**继续**。

1. 检查更改，然后选择何时将该更改应用到集群。
   + **Apply during the next scheduled maintenance window (在下一个计划的维护时段内应用)**
   + **Apply immediately (立即应用)**

1. 选择**修改集群**。

------
#### [ Using the AWS CLI ]

以下代码修改集群`sample-cluster`并禁用 CloudWatch 审计日志。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws docdb modify-db-cluster \
   --db-cluster-identifier sample-cluster \
   --cloudwatch-logs-export-configuration '{"DisableLogTypes":["audit"]}'
```
对于 Windows：  

```
aws docdb modify-db-cluster ^
   --db-cluster-identifier sample-cluster ^
   --cloudwatch-logs-export-configuration '{"DisableLogTypes":["audit"]}'
```
此操作的输出将类似于下文（JSON 格式）。  

```
{
    "DBCluster": {
        "DBClusterParameterGroup": "default.docdb4.0",
        "HostedZoneId": "ZNKXH85TT8WVW",
        "MasterUsername": "<user-name>",
        "Status": "available",
        "Engine": "docdb",
        "Port": 27017,
        "AvailabilityZones": [
            "us-east-1a",
            "us-east-1c",
            "us-east-1f"
        ],
        "EarliestRestorableTime": "2019-02-13T16:35:50.387Z",
        "DBSubnetGroup": "default",
        "LatestRestorableTime": "2019-02-13T16:35:50.387Z",
        "DBClusterArn": "arn:aws:rds:us-east-1:900083794985:cluster:sample-cluster2",
        "Endpoint": "sample-cluster2.cluster-corcjozrlsfc.us-east-1.docdb.amazonaws.com",
        "ReaderEndpoint": "sample-cluster2.cluster-ro-corcjozrlsfc.us-east-1.docdb.amazonaws.com",
        "BackupRetentionPeriod": 1,
        "EngineVersion": "4.0.0",
        "MultiAZ": false,
        "ClusterCreateTime": "2019-02-13T16:35:04.756Z",
        "DBClusterIdentifier": "sample-cluster2",
        "AssociatedRoles": [],
        "PreferredBackupWindow": "07:16-07:46",
        "DbClusterResourceId": "cluster-YOS52CUXGDTNKDQ7DH72I4LED4",
        "StorageEncrypted": false,
        "PreferredMaintenanceWindow": "wed:03:08-wed:03:38",
        "DBClusterMembers": [],
        "VpcSecurityGroups": [
            {
                "Status": "active",
                "VpcSecurityGroupId": "sg-77186e0d"
            }
        ]
    }
}
```

------

### 禁用 audit\$1logs 参数
<a name="event-auditing-disabling-audit-parameter"></a>

要禁用集群的 `audit_logs` 参数，您可以修改集群，使其使用 `audit_logs` 参数值为 `disabled` 的参数组。或者，您可以修改集群的参数组中的 `audit_logs` 参数值，使其为 `disabled`。

有关更多信息，请参阅以下主题：
+ [修改 Amazon DocumentDB 集群](db-cluster-modify.md)
+ [修改 Amazon DocumentDB 集群参数组](cluster_parameter_groups-modify.md)

## 访问审核事件
<a name="event-auditing-accessing"></a>

使用以下步骤访问您在 Amazon 上的审计事件 CloudWatch。

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1. 确保您与 Amazon DocumentDB 集群位于同一区域。

1. 在导航窗格中，选择**日志**。

1. 要查找集群的审核日志，请从列表中找到并选择 **/aws/docdb/*yourClusterName*/audit**。

   此时，每个实例名称的下方将显示该实例的审计事件。

## 筛选 DML 审核事件
<a name="filtering-dml-events"></a>

### 开始使用 DML 审核筛选
<a name="w2aac29c49c21b3"></a>

可以在 DML 审计事件写入 Amazon CloudWatch 之前对其进行过滤。要利用此功能，必须启用审核日志和 DML 日志记录。Amazon DocumentDB 支持 `atype`、`command`、`user`、`namespace` 和 `auditAuthorizationSuccess` 筛选。

**注意**  
不筛选 DDL 事件。

可以在 `db.adminCommand( { command } )` 操作中使用 `setAuditConfig`、`filter` 和 `auditAuthorizationSuccess` 参数指定审核筛选器，随时启用审核筛选：

```
db.admin.runCommand(
   {
      setAuditConfig: 1, 
      filter:
         {
            //filter conditions
         },
      auditAuthorizationSuccess: true | false
   }
)
```

还可以通过运行以下命令检索审核筛选器设置：

```
db.admin.runCommand( { getAuditConfig: 1})
```

**安全要求**

在设置或列出 DML 审计过滤器`admindb`时，只有 users/roles 具有特权操作的数据库`auditConfigure`才能执行上述命令。您可以使用 [`clusterAdmin`、`hostManager`、`root`] 中的内置角色之一，也可以创建具有 `auditConfigure` 权限的自定义角色。以下是使用具有 `auditConfigure` 权限的现有角色的示例，以及使用自定义角色的示例。

具有内置角色的用户：

```
use admin
db.createUser(
  {
    user: "myClusterAdmin",
    pwd: "password123",
    roles: [ { role: "clusterAdmin", db: "admin" } ]
  }
)
```

具有自定义角色的用户：

```
use admin
db.createRole(
   {
     role: "myRole",
     privileges: [
       { resource: { cluster: true }, actions: [ "auditConfigure" ] }
     ],
     roles: []
   }
)
db.createUser(
  {
    user: "myUser",
    pwd: "myPassword",
    roles: [ { role: "myRole", db: "admin" } ]
  }
)
```

#### 筛选使用案例
<a name="filtering-use-cases"></a>

**示例：按命令筛选事件**

```
db.admin.runCommand(
   {
      setAuditConfig: 1,
      filter: {
        "$and": [
         {
            "param.command":
               {
                  $in: [ "find","count", "insert", "delete", "update", "findandmodify" ]
               }
         }
         ]
      },
      auditAuthorizationSuccess: true
   }
)
```

**示例：按用户名筛选事件**

在此示例中，只有用户“myUser”将进行日志记录：

```
db.admin.runCommand(
   {
      setAuditConfig: 1,
      filter: {
      "$and": [
         {
            "param.user":
               {
                  $in: [ "myUser" ]
               }
         }
         ]},
      auditAuthorizationSuccess: true})
```

**示例：按 `atype` 筛选**

```
db.admin.runCommand(
   {
      setAuditConfig: 1,
      filter: {atype: "authCheck"},
      auditAuthorizationSuccess: true
   })
```

**注意**  
所有 DML 日志均有 `atype` 类型的 `authCheck`。只有 DDL 具有不同的 `atype`。如果您`authCheck`在中输入了以外的值`filter`，它将不会生成 DML 登录 CloudWatch。

**示例：使用由运算符连接的多个筛选器进行筛选**

```
db.admin.runCommand(
   {
      setAuditConfig: 1,
      filter: {
      "$and": [
         {
            "param.command":
               {
                  $in: [ "find","count", "insert", "delete", "update", "findandmodify" ]
               }
         }
         ],
       "$nor": [
         {
            "param.command":
               {
                  $in: ["count", "insert", "delete", "update", "findandmodify" ]
               }
         }]  
       },
      auditAuthorizationSuccess: true})
```

**注意**  
顶层仅支持 `$and`、`$or` 和 `$nor`。不支持任何其他运算符，它们会导致出错。

**示例：通过 `auditAuthorizationSuccess` 按事件筛选**

在此筛选器中，所有成功通过授权的命令都不会进行记录：

```
db.admin.runCommand(
   {
      setAuditConfig: 1,
      filter: {},
      auditAuthorizationSuccess: false
   }
)
```

**示例：使用 `$in` 和 `$nin` 条件进行筛选**

同时在 `$in` 和 `$nin` 中使用时，该命令不会进行日志记录，因为两个条件之间有一个隐含的“和”。在此示例中，正则表达式将阻止 `find` 命令，因此不会记录任何内容：

```
db.admin.runCommand(
   {
      setAuditConfig: 1,
      filter: {
      "$and": [
         {
            atype: "authCheck",
            "param.command":
               {
                  $in: [ "find", "insert", "delete", "update", "findandmodify" ],
                  $nin: ["count", "insert", "delete", "update", "findandmodify" ],
                  $not: /^^find.*/
               }
         }, 
         ],
       "$or": [
         {
            "param.command":
               {
                  $nin: ["count", "insert", "delete", "update", "findandmodify" ]
               }
         }]  
       },
      auditAuthorizationSuccess: true})
```

**示例：按 `namespace` 筛选**

```
db.admin.runCommand(
   {
      setAuditConfig: 1,
      filter: {
      "$and": [
         {
            "param.ns":
               {
                  $in: [ "test.foo" ]
               }
         }
         ]},
      auditAuthorizationSuccess: true})
```

**示例：重置为默认筛选器**

重置为默认值意味着每个 DML 审核事件都将记录。要将筛选重置为默认值，请运行以下命令：

```
db.admin.runCommand(
   {
      setAuditConfig: 1,
      filter: {},
      auditAuthorizationSuccess: true
   }
)
```