如何自动将 AWS RDS 审计日志导出到 S3 Bucket 实例?
已发表: 2022-03-05在我们学习如何自动将 RDS 审计日志导出到 S3 之前,您是否知道 AWS CloudWatch 会自动存储 RDS 数据库日志? 是的,它们确实如此,但是它们只存储您的数据库实例的常规日志。 现在,如果您想从日志中查找特定查询或数据怎么办? 哪个用户执行了特定查询或来自哪个 IP 地址? 谁从您的数据库表中删除了某些记录?
此外,不知何故,您设法将 RDS 实例的所有审计日志导出到 CloudWatch,这很棒。 但是,你知道吗? CloudWatch 只会将这些日志保留 30 天!! 要将它们保留更长时间,您需要将 CloudWatch 日志导出到 S3 存储桶。 您可以从 CloudWatch 控制面板手动执行此操作。 但是,如果您想为此实现自动化怎么办?
本指南将引导您完成自动记录所有此类事件所需的所有步骤!!
本指南包括:
1) 调整 RDS 设置以将审核日志发送到 CloudWatch
2) 创建一个 S3 存储桶(用于存储 CloudWatch 审计日志)
3) 创建 IAM 角色(我们将用于 Lambda 自动化)
4) Lambda(自动将 CloudWatch Logs 导出到 S3 的功能)
让我们开始!
调整 RDS 设置以将审核日志发送到 CloudWatch
首先,我们需要调整 RDS 以将特定日志发送到 CloudWatch。 为此,我们将创建一个选项组和一个参数组。
创建选项组
⇒ 访问您的 Amazon RDS 仪表板。
⇒ 转到选项组。
⇒ 单击创建组按钮。
⇒ 输入该组的名称和描述。
⇒ 选择引擎:mysql 和引擎版本:8.0。 单击创建。
⇒ 单击您创建的选项组。
⇒ 在选项部分下,单击添加选项按钮。
⇒ 在“SERVER_AUDIT_EVENTS*”选项下,输入您要审核的值,即 CONNECT、QUERY、QUERY_DDL、QUERY_DML、QUERY_DCL、QUERY_DML_NO_SELECT。 如果您想记录在您的表上运行的所有查询,只需在此字段中输入 QUERY。
⇒ 为立即申请设置“是”。 单击添加选项。
创建参数组
⇒ 让我们打开 Amazon RDS 仪表板。
⇒ 单击参数组。
⇒ 单击创建参数组按钮。
⇒ 选择“参数组族”:mysql8.0
⇒ 选择“类型”:数据库参数组
⇒ 输入组名和描述。 单击创建。
⇒ 现在,单击您创建的参数组。
⇒ 在参数下,我们将编辑某些参数并设置以下值:
⇒ 编辑参数:“log_output” ⇒ 将其值从 TABLE 更改为 FILE
⇒ 编辑参数:“slow_query_log” ⇒ 将其值从 BLANK 更改为 1
⇒ 编辑参数:“general_log” ⇒ 将其值从 BLANK 更改为 1
现在,我们都设置好了选项组和参数组。 现在,让我们将这些组分配给我们的 RDS。
⇒ 转到您的 RDS 仪表板。
⇒ 单击您创建的 RDS。
⇒ 单击修改。
⇒ 向下滚动页面并转到“数据库选项”部分。
⇒ 在“DB 参数组”下,选择您创建的参数组。
⇒ 在“选项组”下,选择您创建的选项组。
我们现在都准备好了 RDS。 完成上述步骤后,请等待 20-30 分钟来填充 CloudWatch 中的数据(注意:可能需要更多时间,具体取决于日志的大小)。
CloudWatch 收集所有日志后,您将在 CloudWatch 仪表板下看到审核日志。 它将如下图所示:
创建 S3 存储桶(用于存储 CloudWatch 审计日志)
⇒ 转到 Amazon S3 仪表板。
⇒ 创建一个新的桶。
⇒ 创建存储桶后,打开它并导航到权限选项卡。
⇒ 我们需要允许 CloudWatch 将对象放入存储桶(写入权限)
⇒ 点击桶策略的编辑按钮。 输入以下代码:
{
“版本”:“2012-10-17”,
“陈述”: [
{
“效果”:“允许”,
“主要的”: {
“服务”:“logs.YOUR-REGION.amazonaws.com” // 即 logs.us-east-1.amazonaws.com
},
“动作”:“s3:GetBucketAcl”,
“资源”:“arn:aws:s3:::BUCKET_NAME_HERE”
},
{
“效果”:“允许”,
“主要的”: {
“服务”:“logs.YOUR-REGION.amazonaws.com”
},
“动作”:“s3:PutObject”,
“资源”:“arn:aws:s3:::BUCKET_NAME_HERE/*”,
“健康)状况”: {
“字符串相等”:{
“s3:x-amz-acl”:“bucket-owner-full-control”
}
}
}
] }
创建 IAM 角色(我们将其用于 Lambda 自动化)
现在,我们将创建将在 Lambda 函数设置中使用的 IAM 角色。 AWS Lambda 服务将需要记录事件和写入我们创建的 S3 存储桶的权限。
我们将使用“AmazonS3FullAccess”、“CloudWatchLogsFullAccess”和“CloudWatchEventsFullAccess”策略创建 IAM 角色“Export-RDS-CloudWatch-to-S3-Lambda”。
⇒ 打开您的 AWS IAM 仪表板。
⇒ 切换到角色并单击创建角色按钮。
⇒ 在“用例”下,选择 Lambda 并单击下一步。
⇒ 搜索“AmazonS3FullAccess”并选择它。
⇒ 搜索“CloudWatchLogsFullAccess”并选择它。
⇒ 搜索“CloudWatchEventsFullAccess”并选择它。
⇒ 设置角色名称:“Export-RDS-CloudWatch-to-S3-Lambda”并点击创建角色。
Lambda(自动将 CloudWatch Logs 导出到 S3 的功能)
Lambda 函数允许您将代码放在函数下并在触发器上运行它。 您不需要为此设置任何服务器或设置。 非常简单高效!
⇒ 切换到 AWS Lambda 仪表板。
⇒ 单击函数,然后单击创建函数按钮。
⇒ 选择“草稿作者”。
⇒ 设置“函数名称”:Export-RDS-CloudWatch-Logs-To-S3
⇒ 在“运行时”下,选择 Python 3.x。
⇒ 在“权限”下,选择“使用现有角色”并选择我们在上一步中创建的 IAM 角色。
⇒ 单击创建函数并导航到代码视图并输入以下脚本:
导入 boto3
导入操作系统
导入日期时间GROUP_NAME = os.environ['GROUP_NAME'] DESTINATION_BUCKET = os.environ['DESTINATION_BUCKET'] PREFIX = os.environ['PREFIX'] NDAYS = os.environ['NDAYS'] nDays = int(NDAYS)
currentTime = datetime.datetime.now()
StartDate = currentTime – datetime.timedelta(days=nDays)
EndDate = currentTime – datetime.timedelta(days=nDays – 1)fromDate = int(StartDate.timestamp() * 1000)
toDate = int(EndDate.timestamp() * 1000)BUCKET_PREFIX = os.path.join(PREFIX, StartDate.strftime('%Y{0}%m{0}%d').format(os.path.sep))
def lambda_handler(事件,上下文):
client = boto3.client('logs')
client.create_export_task(
logGroupName=GROUP_NAME,
从时间=从日期,
to=toDate,
目的地=DESTINATION_BUCKET,
目的地前缀=BUCKET_PREFIX
)
⇒ 现在,点击配置⇒ 环境变量。
⇒ 我们需要创建 4 个变量:
⇒ DESTINATION_BUCKET:<您的 S3 存储桶的名称>
⇒ GROUP_NAME:<您要导出的日志组名>
⇒ NDAYS:1
⇒ 前缀:导出日志
⇒ 好的,你已经准备好了。 保存函数。
现在,让我们设置自动化来运行这个 lambda 函数。
⇒ 现在,访问您的 CloudWatch 仪表板。
⇒ 前往活动 ⇒ 规则。
⇒ 单击创建规则。
⇒ 在事件源下,选择计划。
⇒ 设置固定速率或 cron 表达式来自动运行我们的 lambda 函数。
⇒ 在目标下,选择 Lambda 函数。
⇒ 在函数下,选择我们在上一步中创建的函数。
这是所有的了。 现在,您已经设置了一个自动将 RDS 日志导出到 S3 的环境。 您可以根据需要保留日志。 但是,如果您仍然遇到任何问题,请随时在此处发表评论。 我们很想听到您的声音!!