Skip to main content

从 AWS CloudTrail 获取有价值信息的命令行工具

项目描述

TrailScraper

PyPi 发布 Docker Hub 构建状态 构建状态

用于从 AWS CloudTrail 中获取有价值信息的命令行工具和用于处理 IAM 策略的通用工具箱

安装

操作系统

$ brew install trailscraper

使用 pip 安装

要求:

  • 蟒蛇> = 3.5

  • 点子

$ pip install trailscraper

直接使用docker运行

$ docker run --rm --env-file <(env | grep AWS_) -v $HOME/.aws:/root/.aws flosell/trailscraper:latest

用法

从 CloudTrail API 获取与过滤器匹配的 CloudTrail 事件

$ trailscraper select --use-cloudtrail-api \
                      --filter-assumed-role-arn some-arn \
                      --from 'one hour ago' \
                      --to 'now'
{
  "Records": [
    {
      "eventTime": "2017-12-11T15:01:51Z",
      "eventSource": "autoscaling.amazonaws.com",
      "eventName": "DescribeLaunchConfigurations",
...

下载一些日志

$ trailscraper download --bucket some-bucket \
                        --account-id some-account-id \
                        --region some-other-region \
                        --region us-east-1 \
                        --from 'two days ago' \
                        --to 'now' \

注意:包括 us-east-1 以下载全球服务的日志。详情见下文_

下载组织轨迹中的一些日志

$ trailscraper download --bucket some-bucket \
                        --account-id some-account-id \
                        --region us-east-1 \
                        --org-id o-someorgid \
                        --from 'two days ago' \
                        --to 'now'

在下载的日志中查找与过滤器匹配的 CloudTrail 事件

$ trailscraper select --filter-assumed-role-arn some-arn \
                      --from 'one hour ago' \
                      --to 'now'
{
  "Records": [
    {
      "eventTime": "2017-12-11T15:01:51Z",
      "eventSource": "autoscaling.amazonaws.com",
      "eventName": "DescribeLaunchConfigurations",
...

从一些 CloudTrail 记录生成策略

$ gzcat some-records.json.gz | trailscraper generate
{
    "Statement": [
        {
            "Action": [
                "ec2:DescribeInstances"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        }
    ],
    "Version": "2012-10-17"
}

通过猜测匹配动作来扩展现有策略

CloudTrail 日志可能并不总是包含所有相关操作。例如,当您确实需要删除和更新权限时,您的日志可能仅包含 terraform 运行后的创建操作。TrailScraper 可以尝试猜测可能相关的其他语句:

$ cat minimal-policy.json | trailscraper guess
{
    "Statement": [
        {
            "Action": [
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        },
        {
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:ListObjects"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        }
    ],
    "Version": "2012-10-17"
}
$ cat minimal-policy.json | ./go trailscraper guess --only Get
{
    "Statement": [
        {
            "Action": [
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        },
        {
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        }
    ],
    "Version": "2012-10-17"
}

查找 CloudTrail 事件并生成 IAM 策略

$ trailscraper select | trailscraper generate
{
    "Statement": [
        {
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVolumes",
                "ec2:DescribeVpcs",
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        },
        {
            "Action": [
                "sts:AssumeRole"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::1111111111:role/someRole"
            ]
        }
    ],
    "Version": "2012-10-17"
}

常问问题

如何在 CloudFormation YAML 而不是 JSON 中生成策略?

TrailScraper 不提供此功能。但是你可以使用 cfn-flip来做到这一点:

$ trailscraper select | trailscraper generate | cfn-flip
Statement:
  - Action:
      - ec2:DescribeInstances
    Effect: Allow
    Resource:
      - '*'

如何在 Terraform HCL 而不是 JSON 中生成策略?

TrailScraper 不提供此功能。但是您可以使用 iam-policy-json-to-terraform 来做到这一点:

$ trailscraper select | trailscraper generate | iam-policy-json-to-terraform
data "aws_iam_policy_document" "policy" {
  statement {
    sid       = ""
    effect    = "Allow"
    resources = ["*"]

    actions = [
      "ec2:DescribeInstances",
    ]
  }
}

为什么 TrailScraper 缺少一些事件?

  • 确保您有us-east-1区域的日志。一些全球 AWS 服务(例如 Route53、IAM、STS、CloudFront)使用该区域。有关详细信息,请查看CloudTrail 文档

为什么某些 TrailScraper 生成的操作不是真正的 IAM 操作?

这是完全可能的。不幸的是,没有关于 CloudTrail 事件如何映射到 IAM 操作的良好的机器可读文档,因此 TrailScraper 正在使用启发式方法来找出正确的操作。这些启发式方法可能并未涵盖 AWS 世界的所有特殊情况。

这就是你进来的地方:如果你发现 TrailScraper 没有涵盖的特殊情况,请打开一个新问题,或者更好的是,提交一个拉取请求。

有关更多详细信息,请查看贡献指南

为什么 click 认为我在 ASCII 环境中?

Click 将中止进一步的执行,因为 Python 3 被配置为使用 ASCII 作为环境的编码。

设置描述您的语言环境的环境变量,例如:

export LC_ALL=de_DE.utf-8
export LANG=de_DE.utf-8

或者

LC_ALL=C.UTF-8
LANG=C.UTF-8

有关详细信息,请参阅 http://click.pocoo.org/5/python3/#python-3-surrogate-handling

发展

$ ./go setup   # set up venv, dependencies and tools
$ ./go test    # run some tests
$ ./go check   # run some style checks
$ ./go         # let's see what we can do here

变更日志

此更改日志包含每个版本中的松散更改集合,包括对 API 的重大更改。

格式基于Keep a Changelog

0.7.0

添加

  • 支持 Python 3.9

已移除

  • 删除了对 Python 3.5 的官方支持。TrailScraper 可能仍会运行,但我们不再主动对其进行测试

改变了

  • 从 DockerHub 迁移到 Docker 镜像的 GitHub 容器注册表(因为 DockerHub 正在放弃对自动构建的支持并以其他方式限制它)

  • 更新了支持依赖项

0.6.4

固定的

  • 修复了引发 ModuleNotFoundError的 Docker 映像

改变了

  • 性能调整

    • trailscraper 下载使用更智能的目录列表来提高大日期范围和少量新数据的性能

    • trailscraper 下载现在并行下载文件

    • trailscraper select的性能小幅提升

0.6.2 和 0.6.3

(由于持续的发布脚本问题而跳过)

0.6.1

(与 0.6.1 相同,只是修复了不一致的版本)

0.6.0

添加

  • 支持 Python 3.7 和 3.8

  • 支持组织级别的跟踪 (#101)

固定的

  • 通过自制软件或 pip 安装时, Trailscraper 猜测不起作用(#110)

已移除

  • 删除了对 Python 2.7 和 3.4 的官方支持。TrailScraper 可能仍会运行,但我们不再主动对其进行测试

0.5.1

添加

  • 通过猜测匹配动作 #22 来扩展现有策略的新命令guess

固定的

  • 修复了包含没有 ARN 的资源的解析事件(例如 s3:ListObjects)#51

0.5.0

破坏 CLI 更改:将generate-policy拆分为selectgenerate (#38)

添加

  • 新命令select以将与过滤器匹配的所有 CloudTrail 记录打印到标准输出

  • 新命令generate用于从标准输入获取 CloudTrail 记录并为其生成策略

改变了

  • 新命令select默认完全不过滤,而 generate-policy默认过滤最近的事件。更改为使过滤更加明确和可预测,而不是让那些想知道为什么他们的事件没有出现的用户感到惊讶

已移除

  • 删除命令generate-policy,替换为selectgenerate。使用管道产生相同的行为:

    $ trailscraper select | trailscraper generate

0.4.4

固定的

  • 使 Trailscraper 时区感知。到目前为止,trailscraper 隐含地将所有内容都视为 UTC,这意味着在过滤要下载的日志文件或要从中生成的记录时,相对时间戳(例如 现在两小时前)无法正常工作。(#39)

添加

  • 新命令trailscraper last-event-timestamp以获取最后一个已知事件时间戳。

  • 新标志trailscraper 下载--wait等到找到指定时间范围内的事件。如果您正在等待 CloudTrail 为最近的操作发送日志,这很有用。

0.4.3

由于发布问题而跳过

0.4.2

固定的

  • 修复了将 CloudTrail 映射到 IAM 操作的各种特殊情况:

    • API 网关

    • 应用程序流 2

    • DynamoDB 流

    • 莱克斯

    • 机械土耳其人

    • S3

    • STS

    • 标记

0.4.1

固定的

  • 忽略 Python 2.7 中无法读取的记录文件(例如无效的 GZIP)(之前仅在 Python 3.* 中工作)

  • 为包含 API 版本日期的服务(例如 Lambda、CloudFront)生成的固定权限(#20)

0.4.0

添加

  • 支持 CloudTrail lookup_events API,允许用户在不从 S3 存储桶下载日志的情况下生成策略。请注意,此 API 仅返回“创建、修改和删除 API 调用”

  • trailscraper 下载现在支持--from--to标志来指定应该下载的时间范围。接受精确(例如“2017-10-12”)和相对(例如“-2days”)参数。

  • trailscraper generate-policy现在支持--from--to 过滤事件以考虑生成策略。接受精确(例如“2017-10-12”)和相对(例如“-2days”)参数。

  • 性能优化:generate-policy仅在请求的时间范围内读取日志文件

  • 添加了 --version命令行参数

改变了

  • 设置更灵活的依赖

已移除

  • 删除了trailscraper 下载中的--past-days参数。被 --from 和 --to 取代上文

固定的

  • 忽略无法读取的记录文件(例如无效的 GZIP)

0.3.0

添加

  • 支持 Python >= 2.7

改变了

  • 如果目标文件夹中已存在 CloudTrail 日志,请不要从 S3 下载它们 (#9)

  • 删除了对 awacs-library 的 fork 的依赖,以简化安装和开发

固定的

  • 在某些情况下导致具有相同操作集的策略语句未正确组合的错误 (#7)

0.2.0

添加

  • 生成策略时角色的基本过滤(#3)

0.1.0

初始发行

添加

  • 从 S3 为某些帐户和时间范围下载 CloudTrail 日志的基本功能

  • 从一组下载的 CloudTrail 日志生成 IAM 策略的基本功能

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

trailscraper-0.7.0.tar.gz (49.6 kB 查看哈希

已上传 source

内置分布

trailscraper-0.7.0-py2.py3-none-any.whl (45.7 kB 查看哈希

已上传 3 8