此工具允许你查找某个 S3 存储桶所属的账户 ID。
要使此功能生效,你至少需要具备以下权限之一:
s3:getObject)。s3:ListBucket)。此外,你需要一个可以代入的角色,该角色对你正在检查的存储桶拥有(其中一项)这些权限。
更多背景信息可参见 Cloudar 博客
该软件包可在 pypi 上获取,你可以使用以下命令之一(推荐使用 pipx)
pipx install s3-account-search
pip install s3-account-search
# 使用存储桶
s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket
# 使用对象
s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket/path/to/object.ext
# 也可以省略 s3://
s3-account-search arn:aws:iam::123456789012:role/s3_read my-bucket
# 或从指定的源配置文件开始
s3-account-search --profile source_profile arn:aws:iam::123456789012:role/s3_read s3://my-bucket
存在一个 IAM 策略条件 s3:ResourceAccount,原本用于向指定账户(或账户集合)授予对 S3 的访问权限,但同时也支持通配符。通过构造合适的模式并观察哪些会导致拒绝或允许,我们可以逐位发现账户 ID。
0 开头的 S3 存储桶。如果访问被允许,我们就知道账户 ID 必须以 0 开头。如果请求被拒绝,则尝试以 1 作为第一位数字。我们不断递增,直到请求被允许,从而找到第一位数字。8,我们测试以 80、81、82 等开头账户 ID。我们使用 poetry 管理此项目
poetry installpoetry shell 激活虚拟环境(也可以使用 poetry run $command)poetry publish --builds3:ResourceAccount < 500000000000
"Condition": {
"StringLike": {"s3:ResourceAccount": [
"0*", "1*", "2*", "3*", "4*",
]},
},
实际上,此工具在大多数情况下已经足够快。