

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

# 事件、日志和审计跟踪记录
<a name="events-logs-audit"></a>

监控[数据库实例指标](db-instance-monitoring.md)和[操作系统指标](os-monitoring.md)、分析趋势并将指标与基准值进行比较，以及在值超出定义阈值时生成提醒，这些都是帮助您实现和维护 Amazon RDS 数据库实例的可靠性、可用性、性能及安全性的必要和最佳实践。但是，完整的解决方案还必须监控 MySQL 和 MariaDB 数据库的数据库事件、日志文件和审计跟踪记录。

**Sections**
+ [Amazon RDS 事件](rds-events.md)
+ [数据库日志](database-logs.md)
+ [审核跟踪](audit-trails.md)

# Amazon RDS 事件
<a name="rds-events"></a>

*Amazon* *RDS 事件*表示 Amazon RDS 环境中的更改。例如，当数据库实例状态从*正在启动*变为*可用*时，Amazon RDS 会生成事件 `RDS-EVENT-0088 The DB instance has been started`。Amazon RDS 将事件近乎实时地传输到 Amazon EventBridge。您可以通过 Amazon RDS 控制台、AWS CLI 命令 [describe-events](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/describe-events.html) 或 Amazon RDS API 操作 [DescribeEvents](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeEvents.html) 访问事件。以下屏幕插图显示了 Amazon RDS 控制台上显示的事件和日志。

![\[Amazon RDS 控制台上显示的告警、事件和日志\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/amazon-rds-monitoring-alerting/images/alarms-events-logs-rds-console.png)


Amazon RDS 会发出不同类型的事件，包括数据库实例事件、数据库参数组事件、数据库安全组事件、数据库快照事件、RDS 代理事件和蓝/绿部署事件。信息包括：
+ 来源名称和来源类型；例如：`"SourceIdentifier": "database-1", "SourceType": "db-instance"`
+ 事件的日期和时间；例如：`"Date": "2022-12-01T09:20:28.595000+00:00"`
+ 与事件关联的消息；例如：`"Message": "Finished updating DB parameter group"`
+ 事件类别；例如：`"EventCategories": ["configuration change"]`

有关完整参考，请参阅 Amazon RDS 文档中的 [Amazon RDS 事件类别和事件消息](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Events.Messages.html)。

我们建议您监控 Amazon RDS 事件，因为这些事件表示数据库实例可用性的状态更改、配置更改、只读副本状态更改、备份和恢复事件、失效转移操作、故障事件、对安全组的修改以及许多其他通知。例如，如果您已设置只读副本数据库实例以提高数据库的性能和持久性，我们建议您监控与数据库实例关联的*只读副本*事件类别的 Amazon RDS 事件。这是因为诸如 `RDS-EVENT-0057 Replication on the read replica was terminated` 之类的事件表明您的只读副本不再与主数据库实例同步。向负责团队通报发生了此类事件可能有助于及时缓解问题。Amazon EventBridge 和其他 AWS 服务 [例如 AWS Lambda、Amazon Simple Queue Service（Amazon SQS）和 Amazon Simple Notification Service（Amazon SNS）] 可以帮助您自动响应系统事件，例如数据库可用性问题或资源更改。

在 Amazon RDS 控制台上，您可以检索过去 24 小时的事件。如果您使用 AWS CLI 或 Amazon RDS API 查看事件，则使用 **describe-events** 命令检索过去 14 天内的事件，如下所示。

```
$ aws rds describe-events --source-identifier database-1 --source-type db-instance
{
    "Events": [
        {
            "SourceIdentifier": "database-1",
            "SourceType": "db-instance",
            "Message": "CloudWatch Logs Export enabled for logs [audit, error, general, slowquery]",
            "EventCategories": [],
            "Date": "2022-12-01T09:20:28.595000+00:00",
            "SourceArn": "arn:aws:rds:eu-west-3:111122223333:db:database-1"
        },
        {
            "SourceIdentifier": "database-1",
            "SourceType": "db-instance",
            "Message": "Finished updating DB parameter group",
            "EventCategories": [
                "configuration change"
            ],
            "Date": "2022-12-01T09:22:40.413000+00:00",
            "SourceArn": "arn:aws:rds:eu-west-3:111122223333:db:database-1"
        }
    ]
}
```

如果想长期存储事件，则无论是一直存储到指定的到期期限还是永久存储，您都可以使用 [CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) 来记录有关 Amazon RDS 生成的事件的信息。要实施此解决方案，您可以使用 Amazon SNS 主题来接收 Amazon RDS 事件通知，然后调用 Lambda 函数将事件记录在 CloudWatch Logs 中。

1. 创建将在事件上调用的 Lambda 函数，并将事件中的信息记录到 CloudWatch Logs。CloudWatch Logs 与 Lambda 集成，并提供了一种便捷方法来记录事件信息，即使用 **print** 函数将信息输出到 `stdout`。

1. 通过订阅 Lambda 函数创建 SNS 主题（将**协议**设置为 Lambda），并将**端点**设置为您在上一步中创建的 Lambda 函数的 Amazon 资源名称（ARN）。

1. 配置您的 SNS 主题以接收 Amazon RDS 事件通知。有关详细说明，请参阅 [AWS re:Post 文章](https://repost.aws/knowledge-center/sns-topics-rds-notifications)，了解如何让您的 Amazon SNS 主题接收 Amazon RDS 通知。

1. 在 Amazon RDS 控制台上，创建新的事件订阅。将**目标**设置为 ARN，然后选择您之前创建的 SNS 主题。根据您的要求设置**来源类型**和**要包括的事件类别**。有关更多信息，请参阅 Amazon RDS 文档中的[订阅 Amazon RDS 事件通知](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Events.Subscribing.html)。

# 数据库日志
<a name="database-logs"></a>

MySQL 和 MariaDB 数据库会生成日志，您可以访问这些日志进行审计和问题排查。这些日志是：
+ [审计](https://mariadb.com/kb/en/mariadb-audit-plugin-log-format/)：审计跟踪记录是一组记录服务器活动的记录。对于每个客户端会话，它都会记录谁连接到服务器（用户名和主机）、运行了哪些查询、访问了哪些表以及更改了哪些服务器变量。
+ [错误](https://dev.mysql.com/doc/refman/8.0/en/error-log.html)：此日志包含服务器的（`mysqld`）启动和关闭时间，以及诊断消息，例如在服务器启动和关闭期间以及服务器运行时发生的错误、警告和注意事项。
+ [常规](https://dev.mysql.com/doc/refman/8.0/en/query-log.html)：此日志记录 `mysqld` 的活动，包括每个客户端的连接和断开连接活动，以及从客户端接收的 SQL 查询。当您怀疑出现错误并想确切了解客户端向 `mysqld` 发送了什么内容时，常规查询日志可能非常有用。
+ [慢速查询](https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html)：此日志记录了花费很长时间才执行的 SQL 查询。

作为最佳实践，您应该[将数据库日志从 Amazon RDS 发布到 Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.Procedural.UploadtoCloudWatch.html)。通过 CloudWatch Logs，您可以对日志数据进行实时分析，将数据存储在高持久性存储中，并使用 CloudWatch Logs 代理管理数据。您可以从 Amazon RDS 控制台[访问和查看您的数据库日志](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.Procedural.Watching.html)。您还可以使用 CloudWatch Logs Insights，通过交互方式搜索并分析 CloudWatch Logs 中的日志数据。以下示例说明了对审计日志的查询，该查询会检查 `CONNECT` 事件在日志中出现的次数、谁连接以及这些事件是从哪个客户端（IP 地址）连接的。审计日志中的摘录可能如下所示：

```
20221201 14:07:05,ip-10-22-1-51,rdsadmin,localhost,821,0,CONNECT,,,0,SOCKET
20221201 14:07:05,ip-10-22-1-51,rdsadmin,localhost,821,0,DISCONNECT,,,0,SOCKET
20221201 14:12:20,ip-10-22-1-51,rdsadmin,localhost,822,0,CONNECT,,,0,SOCKET
20221201 14:12:20,ip-10-22-1-51,rdsadmin,localhost,822,0,DISCONNECT,,,0,SOCKET
20221201 14:17:35,ip-10-22-1-51,rdsadmin,localhost,823,0,CONNECT,,,0,SOCKET
20221201 14:17:35,ip-10-22-1-51,rdsadmin,localhost,823,0,DISCONNECT,,,0,SOCKET
20221201 14:22:50,ip-10-22-1-51,rdsadmin,localhost,824,0,CONNECT,,,0,SOCKET
20221201 14:22:50,ip-10-22-1-51,rdsadmin,localhost,824,0,DISCONNECT,,,0,SOCKET
```

示例 Log Insights 查询显示，`rdsadmin` 每 5 分钟从 `localhost` 连接到数据库一次，总共连接了 22 次，如下图所示。这些结果表明，该活动源自内部 Amazon RDS 流程，例如监控系统本身。

![\[Log Insights 报告\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/amazon-rds-monitoring-alerting/images/log-insights.png)


日志事件通常包含您想要统计的重要消息，例如有关与 MySQL 和 MariaDB 数据库实例关联的操作的警告或错误。例如，如果操作失败，则可能会发生错误并将其记录到错误日志文件中，如下所示：`ERROR 1114 (HY000): The table zip_codes is full`。您可能需要监控这些条目以了解错误发生趋势。您可以[使用筛选条件从 Amazon RDS 日志创建自定义 CloudWatch 指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CreateMetricFilterProcedure.html)，以启用对 Amazon RDS 数据库日志的自动监控，从而监控特定日志中的特定模式，并在出现违反预期行为时生成告警。[例如](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CountOccurrencesExample.html)，为日志组 `/aws/rds/instance/database-1/error` 创建一个指标筛选条件，用于监控错误日志并搜索[特定模式](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html)，例如 `ERROR`。将**筛选模式**设置为 `ERROR`，将**指标值**设置为 `1`。筛选条件将检测每条包含关键字 `ERROR` 的日志记录，并会将每个包含“ERROR”的日志事件的计数增加 1。创建筛选条件后，您可以设置告警，以在 MySQL 或 MariaDB 错误日志中检测到错误时通知您。

要详细了解如何通过创建 CloudWatch 控制面板并使用 CloudWatch Logs Insights 来监控慢速查询日志和错误日志，请参阅博客文章 [Creating an Amazon CloudWatch dashboard to monitor Amazon RDS and Amazon Aurora MySQL](https://aws.amazon.com/blogs/database/creating-an-amazon-cloudwatch-dashboard-to-monitor-amazon-rds-and-amazon-aurora-mysql/)。

# 审核跟踪
<a name="audit-trails"></a>

审计跟踪记录（或审计日志）提供与 AWS 账户中安全相关的事件的时间顺序记录。其中包括 Amazon RDS 的事件，这些事件为影响您的数据库或云环境的活动顺序提供了书面证据。在 Amazon RDS for MySQL 或 MariaDB 中，使用审计跟踪记录涉及：
+ 监控数据库实例审计日志
+ 监控 AWS CloudTrail 中的 Amazon RDS API 调用

对于 Amazon RDS 数据库实例，审计的目标通常包括：
+ 为以下内容启用问责制：
  + 对参数或安全配置执行的修改
  + 在数据库架构、表或行中执行的操作，或者影响特定内容的操作
+ 入侵检测和调查
+ 可疑活动检测和调查
+ 检测授权问题；例如，识别普通用户或特权用户滥用访问权限的行为

数据库审计跟踪记录试图回答以下典型问题：*谁查看或修改了数据库中的敏感数据？ 这是什么时候发生的？ 特定用户从哪里访问数据？ 特权用户是否滥用了其无限访问权限？*

MySQL 和 MariaDB 都通过使用 MariaDB 审计插件实现数据库实例审计跟踪记录功能。此插件会记录数据库活动，例如用户登录数据库和对数据库运行的查询。数据库活动记录存储在日志文件中。若要访问审计日志，数据库实例必须使用具有 `MARIADB_AUDIT_PLUGIN` 选项的自定义选项组。有关更多信息，请参阅 Amazon RDS 文档中的 [MySQL 的 MariaDB 审计插件支持](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.MySQL.Options.AuditPlugin.html)。审计日志中的记录以插件定义的特定格式存储。您可以在 [MariaDB 服务器文档](https://mariadb.com/kb/en/mariadb-audit-plugin-log-format/)中找到有关审计日志格式的更多详细信息。

您的 AWS 账户的 AWS 云审计跟踪记录由 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 服务提供。CloudTrail 将 Amazon RDS 的 API 调用作为事件捕获。所有 Amazon RDS 操作都会记录。CloudTrail 提供了用户、角色或 AWS 服务在 Amazon RDS 中所执行操作的记录。事件包括在 AWS 管理控制台、AWS CLI、AWS SDK 和 API 中所执行的操作。

## 示例
<a name="example"></a>

在典型的审计场景中，您可能需要将 AWS CloudTrail 跟踪与数据库审计日志和 Amazon RDS 事件监控相结合。例如，您可能遇到的情况是，您的 Amazon RDS 数据库实例（例如 `database-1`）的数据库参数已修改，您的任务是确定谁进行了修改、更改了哪些内容以及更改发生的时间。

要完成任务，请执行以下步骤：

1. 列出发生在数据库实例 `database-1` 上的 Amazon RDS 事件，并确定类别 `configuration change` 中是否存在包含消息 `Finished updating DB parameter group` 的事件。

   ```
   $ aws rds describe-events --source-identifier database-1 --source-type db-instance
   {
       "Events": [
           {
               "SourceIdentifier": "database-1",
               "SourceType": "db-instance",
               "Message": "Finished updating DB parameter group",
               "EventCategories": [
                   "configuration change"
               ],
               "Date": "2022-12-01T09:22:40.413000+00:00",
               "SourceArn": "arn:aws:rds:eu-west-3:111122223333:db:database-1"
           }
       ]
   }
   ```

1. 确定数据库实例正在使用哪个数据库参数组：

   ```
   $ aws rds describe-db-instances --db-instance-identifier database-1 --query 'DBInstances[*].[DBInstanceIdentifier,Engine,DBParameterGroups]'
   [
       [
           "database-1",
           "mariadb",
           [
               {
                   "DBParameterGroupName": "mariadb10-6-test",
                   "ParameterApplyStatus": "pending-reboot"
               }
           ]
       ]
   ]
   ```

1. 使用 AWS CLI 在部署 `database-1` 的区域中，于在步骤 1 中发现的 Amazon RDS 事件前后的时间段内，[搜索 CloudTrail 事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events-cli.html)，其中 `EventName=ModifyDBParameterGroup`。

   ```
   $ aws cloudtrail --region eu-west-3 lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=ModifyDBParameterGroup --start-time "2022-12-01, 09:00 AM" --end-time "2022-12-01, 09:30 AM"    
   
   {
       "eventVersion": "1.08",
       "userIdentity": {
           "accountId": "111122223333",
           "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
           "sessionContext": {
               "sessionIssuer": {
                   "type": "Role",
                   "principalId": "AIDACKCEVSQ6C2EXAMPLE",
                   "arn": "arn:aws:iam::111122223333:role/Role1",
                   "accountId": "111122223333",
                   "userName": "User1"
               }
           }
       },
       "eventTime": "2022-12-01T09:18:19Z",
       "eventSource": "rds.amazonaws.com",
       "eventName": "ModifyDBParameterGroup",
       "awsRegion": "eu-west-3",
       "sourceIPAddress": "AWS Internal",
       "userAgent": "AWS Internal",
       "requestParameters": {
           "parameters": [
               {
                   "isModifiable": false,
                   "applyMethod": "pending-reboot",
                   "parameterName": "innodb_log_buffer_size",
                   "parameterValue": "8388612"
               },
               {
                   "isModifiable": false,
                   "applyMethod": "pending-reboot",
                   "parameterName": "innodb_write_io_threads",
                   "parameterValue": "8"
               }
           ],
           "dBParameterGroupName": "mariadb10-6-test"
       },
       "responseElements": {
           "dBParameterGroupName": "mariadb10-6-test"
       },
       "requestID": "fdf19353-de72-4d3d-bf29-751f375b6378",
       "eventID": "0bba7484-0e46-4e71-93a8-bd01ca8386fe",
       "eventType": "AwsApiCall",
       "managementEvent": true,
       "recipientAccountId": "111122223333",
       "eventCategory": "Management",
       "sessionCredentialFromConsole": "true"
   }
   ```

CloudTrail 事件显示，AWS 账户 111122223333 中角色为 `Role1` 的用户 `User1` 于 `2022-12-01 at 09:18:19 h` 修改了数据库实例 `database-1` 使用的数据库参数组 `mariadb10-6-test`。修改了两个参数，并设置为以下值：
+ `innodb_log_buffer_size = 8388612`
+ `innodb_write_io_threads = 8`

## 其他 CloudTrail 和 CloudWatch Logs 功能
<a name="additional-features"></a>

您可以通过在 CloudTrail 控制台中查看**事件历史记录**对过去 90 天内的操作和安全事故进行问题排查。要延长保留期并利用其他查询功能，您可以使用 [AWS CloudTrail Lake](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake.html)。借助 AWS CloudTrail Lake，您可以在事件数据存储中保存事件数据长达七年。此外，此服务支持复杂的 SQL 查询，相比**事件历史记录**中的简单密钥值查询提供的视图，这些查询提供更深入、更可自定义的事件视图。

要监控您的审计跟踪记录、设置告警并在特定活动发生时收到通知，您需要[将 CloudTrail 配置为将跟踪记录发送到 CloudWatch Logs](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/monitor-cloudtrail-log-files-with-cloudwatch-logs.html)。将跟踪记录存储为 CloudWatch Logs 后，您可以定义指标筛选条件来评估日志事件以匹配字词、短语或值，并将指标分配给指标筛选条件。此外，您还可以创建根据您指定的阈值和时间段生成的 CloudWatch 告警。例如，您可以配置告警，向负责的团队发送通知，以便他们可以采取适当的措施。您也可以将 CloudWatch 配置为自动执行操作以响应警报。