在 Amazon RDS、MariaDB 和 Aurora MySQL 中有强大的监控和告警机制,但对于 DDL 和 DCL的变更通知缺乏现成的解决方案。这些更改可能会影响数据库实例的可用性和稳定性。因此,按照本文的指导,我们将设置日志记录并集成其他 AWS 服务,从而实现 DDL 和 DCL 更改的通知。
MariaDB 审计插件是一个开源插件,提供 MySQL 数据库引擎的审计功能。Amazon RDS 为 MySQL数据库实例提供此插件,作为可添加到选项组的选项。该插件记录每个客户端会话的数据库活动,包括连接用户、执行的查询、访问的表和更改的服务器变量的信息。该审计插件已经开源,并可以在 GitHub 上找到 - 。
Aurora MySQL 兼容版利用先进的审计功能,使用自定义数据库集群参数组来捕获数据库活动。存储在日志文件中的记录会发布到 CloudWatch日志以供处理,并通过 Lambda 解析发布的数据库审计日志,以发送通知至 Amazon SNS。
以下是我们解决方案架构的示意图:
删除)
要部署此解决方案,请按照以下步骤操作:
请参考以下 AWS 管理控制台的数据库创建说明:
请按照以下说明启用 (AWSCLI)以便通过命令行与 AWS 服务进行交互:
默认的 Amazon RDS for MySQL 选项组未启用审计插件。由于默认选项组无法修改,需创建一个 ,并 ,将其应用于 RDS 实例。启用审计插件,请完成以下步骤:
custom-option-grp-mysql-5-7
。MARIADB_AUDIT_PLUGIN
。SERVER_AUDIT_EVENTS
。
2. 在 值 中,使用 QUERY_DDL
, QUERY_DCL
。以下是使用 AWS CLI 在 Amazon Linux 2 EC2 实例的终端窗口中创建选项组的命令:
bash aws rds create-option-group \ --option-group-name custom-option-grp- mysql-5-7 \ --engine-name mysql \ --major-engine-version 5.7 \ --option-group- description "MySQL 5.7 审计日志已启用"
添加选项至选项组的命令:
`bash aws rds add-option-to-option-group \ --option-group-name custom-option- grp-mysql-5-7 \ --options ',并启用高级审计。请按照以下步骤进行:
aurora-mysql5.7
。custom-aurora-mysql-cluster-5-7
。QUERY_DDL
, QUERY_DCL
。以下是使用 AWS CLI 在 Amazon Linux 2 EC2 实例中的命令,用于创建参数组:
bash aws rds create-db-cluster-parameter-group \ --db-cluster-parameter- group-name custom-aurora-mysql-cluster-5-7 \ --db-parameter-group-familyaurora-mysql5.7 \ --description "启用审计的 Aurora MySQL 集群参数组"
实现参数组中的审计启用:
bash aws rds modify-db-cluster-parameter-group \ --db-cluster-parameter- group-name custom-aurora-mysql-cluster-5-7 \ --parameters "ParameterName=server_audit_logging,ParameterValue=1,ApplyMethod=immediate" \ "ParameterName=server_audit_events,ParameterValue='QUERY_DDL,QUERY_DCL',ApplyMethod=immediate"
现在,需将自定义选项组分配给 Amazon RDS for MySQL DB 实例,或将集群参数组分配给 Aurora MySQL 兼容版 DB实例。按照以下步骤操作:
请注意,将此新参数组附加到 DB 实例需要重新启动该个 DB 实例。对于 Aurora MySQL 兼容版,修改集群后需要重启集群成员 DB 实例。
MySQL [(none)]> SHOW VARIABLES LIKE '%server_audit_logging%'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | server_audit_logging | ON | +----------------------+-------+ 1 row in set (0.00 sec)
MySQL [(none)]> SHOW VARIABLES LIKE '%server_audit_events%'; +---------------------+---------------------+ | Variable_name | Value | +---------------------+---------------------+ | server_audit_events | QUERY_DDL,QUERY_DCL | +---------------------+---------------------+ 1 row in set (0.00 sec) ```
使用 AWS CLI 进行 Amazon RDS for MySQL 或 MariaDB 的修改与新选项组关联的命令如下:
`bash aws rds modify-db-instance \ --db-instance-identifier rds-mysql-01 \
--option-group-name custom-option-grp-mysql-5-7 \ --apply-immediately`
验证的命令:
`bash aws rds describe-db-instances \ --db-instance-identifier rds-mysql-01`
要修改 Aurora MySQL 兼容版以关联新参数组,使用以下代码:
`bash aws rds modify-db-cluster \ --db-cluster-identifier aurora-mysql-01 \
--db-cluster-parameter-group-name custom-aurora-mysql-cluster-5-7 \ --apply-
immediately`
验证的命令:
`bash aws rds describe-db-clusters \ --db-cluster-identifier aurora-mysql-01`
得到的示例输出:
`bash DBCLUSTERMEMBERS pending-reboot aurora-mysql-01-instance-1 True`
若要使更改生效,请重启 DB 集群成员,使用以下命令:
`bash aws rds reboot-db-instance \ --db-instance-identifier aurora-
mysql-01-instance-1`
## 将 MySQL 审计日志发布到 CloudWatch 日志
启用审计选项后,需要将数据库日志发布到 CloudWatch 日志组。为此,请完成以下步骤:
1. 在 Amazon RDS 控制台中,选择 **数据库** 。
2. 选择您的 DB 实例并选择 **修改** 。
3. 在 **其他配置** 下,在 **日志导出** 部分,选择 **审计日志** (可选择性地,选择 **错误日志** 、**一般日志** 和 **慢查询日志** )。
4. 选择 **继续** 。
5. 在 **计划修改** 下,选择 **立即应用** 。
6. 选择 **修改 DB 实例** 或 **修改集群** 。
使用 AWS CLI,对于 Amazon RDS for MySQL,运行以下命令:
`bash aws rds modify-db-instance \ --db-instance-identifier rds-mysql-01 \
--cloudwatch-logs-export-configuration
'{"EnableLogTypes":;若要与外部服务和产品集成,请使用 HTTPS 协议及集成
URL。为此示例,我们使用电子邮件作为协议及邮箱作为端点。要创建订阅,请完成以下步骤:
1. 在 Amazon SNS 控制台中,选择左侧导航栏中的 **订阅** 。
2. 选择 **创建订阅** 。
3. 在 **主题 ARN** 中,选择之前创建的 SNS 主题。
4. 在 **协议** 中,选择 **电子邮件** 。
5. 在 **端点** 中,输入接收事件通知的电子邮件地址。
6. 根据企业标准提供任何可选详细信息。
7. 选择 **创建订阅** 。
使用 AWS CLI,在 Amazon Linux 2 EC2 实例的终端窗口中运行以下命令:
`bash aws sns subscribe \ --topic-arn arn:aws:sns:us-east-1:00000:lambda-rds-
notification \ --protocol email \ [email protected]`
您应该会收到一封确认订阅的电子邮件。
1. 选择 **确认订阅** 。
## 创建 Lambda 函数并添加触发器
Lambda 函数的执行角色是允许该函数访问 AWS 服务和资源的
(IAM) 角色。在这里创建一个具有访问 CloudWatch 和 Amazon SNS的权限的执行角色。创建函数时提供执行角色。当调用函数时,Lambda 会通过采用此角色自动为您的函数提供临时凭证。您无需在函数代码中调用
`sts:AssumeRole`。为确保 Lambda 能正确采用您的执行角色,角色的信任策略必须指定 Lambda服务主体(lambda.amazonaws.com)作为受信任的服务。请完成以下步骤以创建您的策略和角色:
1. 创建一个 IAM 角色,并使用以下信任策略 (`lambda_trust_RDS_notification.json`) 以允许 Lambda 执行角色:
`json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action":
[ "sts:AssumeRole" ], "Principal": { "Service": [ "lambda.amazonaws.com" ] } }
] }`
1. 创建角色:
`bash aws iam create-role \ --role-name lambdarole_RDS_notification \
--assume-role-policy file://lambda_trust_RDS_notification.json`
1. 添加以下内联策略 (`lambda_policy_RDS_notification.json`),以允许 Lambda 访问所需资源:
```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow",
"Action": [ "logs:CreateLogGroup", "sns:Publish" ], "Resource": [
"arn:aws:logs:[aws-region]:[your-account-number]:log-group:[AuditLogGroup]:_",
"arn:aws:sns:[aws-region]:[your-account-number]:[SNS-TOPIC]",
"arn:aws:lambda:[aws-region]:[your-account-number]:function:_ " ] }, {
"Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ],
"Resource": [ "arn:aws:logs:[aws-region]:[your-account-number]:log-
group:/aws/lambda/*" ] }, { "Effect":
Leave a Reply