使用亚马逊 S3 和亚马逊 Athena 为适用于 PostgreSQL 的亚马逊 RDS 构建集中式审计数据集

数据库审计是组织需要满足的重要合规要求之一。您可能需要长期捕获、存储和保留审计数据。您还需要满足组织的信息安全法规和标准。

在这篇文章中,我们将向您展示如何从 适用于 PostgreSQL 数据库的 亚马逊关系数据库服务 (Amazon RDS) 中捕获和存储审计数据,并将其存储在 亚马逊简单存储服务 (Amazon S3) 中。我们还将向您展示如何使用 亚马逊云科技 Glue 处理审计数据 以及如何使用 A mazon Ath ena 进行查询。该解决方案使处理和查询审计数据变得更加容易,并且可以腾出数据库资源来存储和处理审计数据。

解决方案概述

下图显示了解决方案架构,该架构使用以下 亚马逊云科技 服务来分析 PostgreSQL 审计文件:

  • Amazon Athena
  • 亚马逊 CloudWatch
  • 亚马逊云科技 Glue
  • 亚马逊 Kinesis Data Firehose
  • 亚马逊云科技 Lambda
  • 亚马逊 S3

实施此解决方案的高级步骤如下:

  1. 创建 亚马逊云科技 身份和访问管理 (IAM) 角色。
  2. 创建 Lambda 函数来解密流。
  3. 创建一个 S3 存储桶来存储 Kinesis Data Firehose 生成的文件。
  4. 允许亚马逊 RDS 写入 CloudWatch 日志。
  5. 创建 Firehose 配送流。
  6. 创建订阅过滤器。
  7. 设置 亚马逊云科技 Glue 数据库、爬虫和表。
  8. 运行 Athena 查询以识别数据库性能问题。

先决条件

要关注这篇文章,你必须具备以下先决条件:

  • 具有创建和配置必要基础设施的适当权限的 亚马逊云科技 账户。
  • 适用于 PostgreSQL 的 RDS 数据库。有关说明,请参阅 创建并连接到 PostgreSQL 数据库
  • PostgreSQL 数据库的审计设置。有关说明,请参阅使用 pgAudit 扩展程序 在会话和对象级别进行 日志记录
  • 与服务交互所需的角色。我们在下一节中提供更多详细信息。

由于此解决方案涉及设置和使用 亚马逊云科技 资源,因此会在您的账户中产生费用。有关更多信息,请参阅 亚马逊云科技 定价 。我们强烈建议您在非生产实例中进行此设置并运行端到端验证,然后再在生产环境中实施此解决方案。

创建 IAM 角色

您可以使用 IAM 控制台、A WS 命令行接口 (亚马逊云科技 CLI)、 适用于 PowerShell 的 亚马逊云科技 工具 或 IAM API 来创建您的 IAM 角色。有关更多信息,请参阅 创建 IAM 角色

你需要三个角色: cwltokinesisFireHoserole、Firehosetos3Role 和 cwltoFirehose- Lambda-exec-Role。 cwltokinesisFirehoseRole 允许 CloudWatch Logs 将数据 流式传输到 Kinesis Data Fire参见以下代码:

{
    "Statement": [
        {
            "Effect": "Allow",
			"Action": 
				[
                "firehose:DescribeDeliveryStream",
                "firehose:PutRecord",
                "firehose:StartDeliveryStreamEncryption",
                "firehose:CreateDeliveryStream",
                "firehose:PutRecordBatch",
                "firehose:ListDeliveryStreams",
                "firehose:StopDeliveryStreamEncryption",
                "firehose:ListTagsForDeliveryStream",
                "firehose:UpdateDestination"
            ],
            "Resource": [
                "arn:aws:firehose:us-east-2:111111111:deliverystream/DB-CWL-KinesisDataFirehose"
            ]
        }
    ]
}

FireHosetos3 Role 允许 Kinesis Data Firehose 写入亚马逊 S3。参见以下代码:

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::pgaudit2",
                "arn:aws:s3:::pgaudit2/*"
            ]
        }
    ]
}

cwltoFirehose-Lambda-exec-Role 是 Lambda 执行角色 。参见以下代码:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:us-east-2:111111111:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-2:111111111:log-group:/aws/lambda/CWLtofirehose:*"
            ]
        }
    ]
}

创建 Lambda 函数

我们创建了 Lambda 函数来解密流并将记录通过 Kinesis Data Firehose 推送到亚马逊 S3。然后,我们在记录器的函数中添加一个图层。要在 Lambda 控制台上创建函数,请完成以下步骤:

  1. 在 Lambda 控制台上, 在导航 窗格中选择函数
  2. 选择 创建函数
  3. 将你的函数命名为 cwl toFireHose。
  4. 选择运行时的 Python 3.10。
  5. 选择现有角色 cwltoFirehose-L ambda-exec-role。
  6. 输入以下代码并创建您的函数:
    
    导入重新导入日期时间导入 base64 导入 gzip 导入 io 从 aws_lambda_powertools 导入 zlib 导入 Logger csvValues(消息):标准化消息 = re.sub (r' (\ s) +',消息,flags=re.mutiline) res = re.match (r'^ (.+ .+) UTC\: (.+)\ (.+\)\: (.+)\:\ [.+ AUDIT\:] (.+) ',标准化消息) dt = datetime.datetime.strptime (res.group (1),'%y-%m-%d %H: %M: %S) tail = res.group (4) .split (', ',7) [7] 如果 tail.startswith (' "'):查询 = tail.split ('”') [1] 否则:查询 = tail.split (', ') [0] 返回字典 (zip ([' 年 '、' 月 '、' 日 '、' 时间戳 '、' 日期时间 '、' ip地址 '、' 用户记录 '、' 查询 ']、[dt.year、dt.month、dt.day、int (dt.timestamp ())、res.group (1)、res.group (1)、res.group (1) group (2)、res.group (3)、query]、) def lambda_handler(事件、上下文):输出 = [] cwlogger.info(事件)用于记录事件 [' 记录 ']:cwlogger.info(记录 [' 数据 '])compressed_payload = gzip.decompressed payload press(compressed_payload)cwlogger.info(未压缩_payload_payload.decode)(' utf-8 ') striped = re.sub (r "\\”,“”,已解码) 有效载荷 = json.loads(已删除)cwlogger.info(有效负载 ['LogEvents'])数据 = [csvValues (le ['message']) paylogger.info(数据)str_data =”\n “.join ([json.join dumps (d) for data.encode]) # 在这里对负载进行自定义处理 output_record = {'recordID': recordID '],' 结果 ':' 确定 ',' 数据 ':base64.b64encode (' utf-8 ')) .decode (' utf-8 ')} cwlogger.info (output_record) output_record put.append(output_record)cwlogger.info('成功处理了 {} 条记录。'.format(len(事件 [' records '])))返回{'记录':输出} 
     
    
  7. 在 Lambda 控制台上, 在导航 窗格中选择图层
  8. 选择 添加图层
  9. 对于 层源 ,选择 亚马逊云科技 层
  10. 对于 亚马逊云科技 层 ,请选择图层 awslambdaPowerTools pythonV2。
  11. 选择 “ 添加 ” 。

创建 S3 存储桶

接下来,我们创建一个存储桶来存储 Kinesis Data Firehose 生成的审计文件。有关创建 S3 存储桶的说明,请参阅 创建存储桶

允许亚马逊 RDS 写入 CloudWatch 日志

要使亚马逊 RDS 能够写入 CloudWatch 日志,请完成以下步骤:

  1. 在 Amazon RDS 控制台上, 在导航窗格中选择 数据库
  2. 选择要向 CloudWatch 发布日志的实例,然后选择 修改
  3. 日志导出 部分中,选择要发布的日志类型。

创建 Firehose 配送流

使用以下步骤创建 Firehose 交付流:

  1. 在 Kinesis Data Firehose 控制台上,选择 创建传输流
  2. 选择您的来源和目的地。
  3. 交付流名称 中 ,输入一个名称。
  4. 对于 “ 数据转换 ” ,选择 “ 启用 ” 。
  5. 对于 亚马逊云科技 Lambda 函数,请输入您的函数 ARN。
  6. 对于 缓冲区大小 ,输入函数的首选缓冲区大小。
  7. 对于 缓冲间隔 ,输入函数的首选缓冲间隔。
  8. 对于 “ 录制格式转换 ” ,选择 “ 禁用 ” 。
  9. 对于 S3 存储桶 ,输入您的 S3 存储桶的名称。
  10. 对于 动态分区 ,请选择 禁用
  11. 对于 S3 存储桶前缀 ,输入可选前缀。
  12. S3 缓冲提示 下 ,选择您的首选缓冲区和间隔。
  13. 对于数据记录的 压缩 ,选择 禁用
  14. 对于数据记录的 加密 ,选择 禁用
  15. 对于 Amazon S3 中的 源记录备份 ,选择 禁用
  16. 展开 高级设置 ,对于 亚马逊 CloudWatch 错误记录 ,选择 启用。
  17. 在 “ 权限 ” 下 , 选择 “选择现有角色 ” 。
  18. 选择角色 FireHosetos3 Role。
  19. 选择 创建交付流

要查看您的日志组,请 在 CloudWatch 控制台导航窗格中选择 日志组 。CloudWatch 日志组有一个审计文件;例如, /aws/rds/instance/rds-pg-labs/postgresql,如以下屏幕截图所示

创建订阅过滤器

要创建 Kinesis Data Firehose 订阅过滤器,请完成以下步骤:

  1. 在 Kinesis Data Firehose 控制台上,导航到 订阅筛选器 选项卡
  2. 在 “ 创建 ” 菜单上,选择 “创 建 Kinesis Firehose 订阅过滤器 ”。
  3. 对于 目标账户 ,选择往来 账户
  4. 对于 Kinesis Firehose 传送流 ,请输入您的传输流的名称。
  5. 选择现有角色中,选择角色 cwl to kinesisFireHoseRole。
  6. 对于 日志格式 ,选择 其他
  7. 对于 订阅筛选模式 ,输入 AUD IT
  8. 在订 阅筛选器名称 中 ,输入一个名称。
  9. 日志事件消息 中 ,输入您的日志数据。
  10. 选择 “ 开始直播 ” 。

设置 亚马逊云科技 Glue 数据库、爬虫和表

现在,您应该已配置 CloudWatch 指标流,并将指标流转到您的 S3 存储桶。在此步骤中,我们配置 亚马逊云科技 Glue 数据库、爬虫、表和表分区。

  1. 在 亚马逊云科技 Glu e 控制台 上 ,选择 添加数据库
  2. 输入数据库的名称,例如 pgaudit _db。
    现在我们已经准备好了 亚马逊云科技 Glue 数据库,我们设置了爬虫。
  3. 在导航窗格中,选择 Crawlers。
  4. 选择 “ 添加爬虫 ”。
  5. 输入您的爬虫的名称,例如 pg audit_crawler。
  6. 选择 “ 下一步 ” 。
  7. 对于 “添加数据存储 ” ,选择 S3。
  8. 包含路径 中 ,输入要抓取的文件夹或文件的 S3 路径。
  9. 选择 “ 下一步 ” 。
  10. 对于 “添加其他数据存储 ” ,选择 “ ” 。
  11. 对于 选择 IAM 角色 ,选择具有必要权限的现有角色或让 亚马逊云科技 Glue 为您创建角色。
  12. 在 “ 为该爬虫 创建时间表 ” 部分的 “ 频率 ” 中 ,选择 “ 每日 ”。
    您也可以选择按需运行爬虫。
  13. 输入您的起始小时和分钟信息。
  14. 选择 “ 下一步 ” 。

有关配置爬虫的更多信息,请参阅 爬网 程序属性。

当这个爬虫运行时,它会自动创建一个 亚马逊云科技 Glue 表。它还基于 S3 存储桶中的文件夹结构创建表架构和分区。

运行 Athena 查询以识别数据库性能问题

现在我们已经使用 亚马逊云科技 Glue 创建了数据库和表,我们可以分析和找到有关数据库的有用见解。我们使用 Athena 运行 SQL 查询,以了解数据库的使用情况并识别潜在问题(如果有)。Athena 是一种无服务器交互式查询服务,可使用标准 SQL 轻松分析数据。您只需为运行的查询付费。有关更多信息,请参阅 亚马逊云科技 定价 。使用 Athena,您无需设置和管理任何服务器或数据仓库。您只需指向 Amazon S3 中的数据,定义架构,然后使用内置编辑器开始查询即可。

要测试我们的解决方案,请运行以下查询:

Select  * from “pgaudit_db”.audit_db1;


运行以下查询:

SELECT * FROM "pgaudit_db"."audit_db1" where query like 'select%';

清理

为了避免持续产生费用,请删除您在这篇文章中创建的资源。

  1. 删除 IAM 角色
  2. 删除 Lambda 函数。
  3. 删除 S3 存储桶
  4. 删除 PostgreSQL 版的 RDS 实例。
  5. 删除 Firehose 配送流。
  6. 删除 亚马逊云科技 Glue 数据库

结论

在这篇文章中,我们演示了如何从 RDS for PostgreSQL 数据库中捕获和存储审计数据并将其存储在 Amazon S3 中、使用 Aws Glue 对其进行处理,以及如何使用 Athena 对其进行查询。此解决方案可以帮助您生成审计报告。该解决方案也适用于兼容 亚马逊 Aurora PostgreSQL 的版本。 在本文的第 2 部分中,我们将引导您为 MySQL 和 MariaDB 设置审计。

如果您对此帖子有任何意见或疑问,请在评论中分享。


作者简介


Kavita Vellala
是 亚马逊云科技 的高级数据库顾问,在数据库技术方面拥有丰富的经验。Kavita 曾开发过甲骨文、SQL Server、PostgreSQL、MySQL、Couchbase 和亚马逊 Redshift 等数据库引擎。在 亚马逊云科技,她帮助客户进行数字化转型,并加快将其数据库工作负载迁移到 亚马逊云科技 云的速度。她喜欢调整创新的人工智能和机器学习技术来帮助公司解决新问题,并更高效、更有效地解决旧问题。

Sharath Lingareddy 是亚马逊网络服务专业服务团队的高级数据库架构师。他曾使用甲骨文、PostgreSQL、MySQL DynamoDB、亚马逊 RDS 和 Aurora 提供解决方案。他的重点领域是将本地数据库同构和异构迁移到亚马逊 RDS 和 Aurora PostgreSQL。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。