请启用 Javascript 以查看内容

如何使用 AWS Athena 查询用户对资源的创建和修改操作

 ·  ☕ 4 分钟  ·  ✍ CNSRE · 👀... 阅读

作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/241018091258/
相关话题:https://www.cnsre.cn/tags/aws/

在现代企业的云环境中,了解哪些用户对哪些资源进行了创建和修改操作,并统计这些操作的频率,至关重要。这不仅有助于监控资源管理,还能提升安全性和操作效率。本文将通过一个实际案例,演示如何使用 AWS Athena 查询 CloudTrail 日志,提取用户对资源的创建和修改操作,并进行详细统计分析。

实验背景与需求

在本实验中,我们的目标是从 CloudTrail 日志中提取所有用户对资源的创建和修改操作,并对这些操作进行统计分析。具体而言,我们希望能够回答以下问题:

  1. 哪些用户创建了哪些资源?
  2. 哪些用户修改了哪些资源?
  3. 每种操作的频率是多少?

实验准备工作

1. 创建和配置 CloudTrail

首先,确保你的 AWS 账户中已配置 CloudTrail,并将日志存储在 S3 存储桶中。如果尚未设置,请参考 AWS CloudTrail 配置指南 进行配置。

2. 设置 Athena

接下来,我们需要在 AWS Athena 中设置环境,以便查询存储在 S3 中的 CloudTrail 日志。

创建 CloudTrail 表

在 Athena 中创建一个数据库和表,用于存储 CloudTrail 日志数据。假设日志存储在 s3://your-bucket/cloudtrail/ 路径下,可以使用以下 SQL 语句创建表:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
CREATE DATABASE IF NOT EXISTS cloudtrail_logs;
USE cloudtrail_logs;

CREATE EXTERNAL TABLE IF NOT EXISTS cloudtrail_logs (
    eventVersion STRING,
    userIdentity STRUCT<
        type:STRING, 
        principalId:STRING, 
        arn:STRING, 
        accountId:STRING, 
        accessKeyId:STRING, 
        userName:STRING
    >,
    eventTime STRING,
    eventSource STRING,
    eventName STRING,
    awsRegion STRING,
    sourceIPAddress STRING,
    userAgent STRING,
    requestParameters STRING,
    responseElements STRING,
    requestID STRING,
    eventID STRING,
    eventType STRING,
    apiVersion STRING,
    readOnly BOOLEAN,
    resources ARRAY<STRUCT<ARN:STRING, accountId:STRING, type:STRING>>,
    eventCategory STRING,
    sessionCredential STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://your-bucket/cloudtrail/';

上述 SQL 语句定义了 CloudTrail 日志的结构,并指定了 S3 存储桶的位置作为数据源。

添加分区

为了提高查询效率,Athena 需要识别日志文件的分区信息。执行以下命令以修复表的分区:

1
MSCK REPAIR TABLE cloudtrail_logs;

查询用户操作

现在,我们可以编写 SQL 查询,从 CloudTrail 日志中提取用户对资源的创建和修改操作,并进行统计分析。

1. 查询用户创建资源的操作

以下查询将返回特定日期内每个用户的资源创建操作及其数量:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
SELECT 
    userIdentity.userName AS user_name, 
    eventName AS action, 
    COUNT(*) AS count
FROM 
    cloudtrail_logs
WHERE 
    eventName IN ('CreateBucket', 'RunInstances', 'CreateVolume', 'CreateDBInstance')  -- 关注的创建操作
    AND dt = '2024-08-09'  -- 替换为目标日期
GROUP BY 
    userIdentity.userName, 
    eventName
ORDER BY 
    user_name, 
    count DESC;

说明

  • eventName 列表中包含了常见的资源创建操作。根据实际需求,可以添加或移除操作类型。
  • dt 字段用于按日期分区过滤,确保查询效率。

2. 查询用户修改资源的操作

以下查询将返回特定日期内每个用户的资源修改操作及其数量:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
SELECT 
    userIdentity.userName AS user_name, 
    eventName AS action, 
    COUNT(*) AS count
FROM 
    cloudtrail_logs
WHERE 
    eventName IN ('ModifyInstanceAttribute', 'UpdateVolume', 'ModifyDBInstance')  -- 关注的修改操作
    AND dt = '2024-08-09'  -- 替换为目标日期
GROUP BY 
    userIdentity.userName, 
    eventName
ORDER BY 
    user_name, 
    count DESC;

说明

  • eventName 列表中包含了常见的资源修改操作。根据实际需求,可以调整操作类型。
  • 同样使用 dt 字段进行分区过滤。

3. 统计所有操作的频率

以下查询将返回所有用户的所有操作的统计数据,按操作名称进行分组和排序:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
SELECT 
    userIdentity.userName AS user_name, 
    eventName AS action, 
    COUNT(*) AS count
FROM 
    cloudtrail_logs
WHERE 
    dt = '2024-08-09'  -- 替换为目标日期
GROUP BY 
    userIdentity.userName, 
    eventName
ORDER BY 
    user_name, 
    count DESC;

说明

  • 此查询涵盖了所有操作类型,适用于全面了解用户操作行为。

解决常见问题

在实际操作中,可能会遇到以下问题及解决方案:

1. 数据不完整

问题:查询结果不完整,缺少部分日志数据。

解决方案

  • 检查 Athena 表的结构是否与 CloudTrail 日志格式匹配。
  • 确认分区是否正确添加。可以重新运行 MSCK REPAIR TABLE cloudtrail_logs; 命令。
  • 确保 S3 存储桶中的日志文件完整且未损坏。

2. 查询效率低

问题:查询速度较慢,耗时较长。

解决方案

  • 使用分区字段(如日期)进行过滤,减少扫描的数据量。
  • 仅选择必要的列,避免 SELECT *
  • 优化 SQL 查询,避免不必要的复杂操作。

总结

通过本文的指导,我们展示了如何使用 AWS Athena 从 CloudTrail 日志中提取用户对资源的创建和修改操作,并进行统计分析。这些步骤和技巧不仅帮助你高效地管理和分析 AWS 资源操作数据,还能提升整体的安全性和运营效率。

如果在实施过程中遇到任何问题,欢迎在评论区留言。感谢你的阅读,祝你在 AWS 数据分析的旅程中一切顺利!


作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/241018091258/
相关话题:https://www.cnsre.cn/tags/aws/

您的鼓励是我最大的动力
alipay QR Code
wechat QR Code

Avatar
作者
CNSRE
一位只会重启的运维


目录