
S3 アカウント検索
このツールを使うと、S3バケットが属するアカウントIDを見つけることができます。
このツールを動作させるには、以下の少なくとも1つの権限が必要です:
s3:getObject)。s3:ListBucket)。さらに、調査対象のバケットに対して(これらの)権限のいずれかを持つ、引き受けることができるロールが必要です。
詳細な背景については、Cloudar Blogをご覧ください。
このパッケージは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へのアクセスを許可するために使用されますが、ワイルドカードもサポートしています。適切なパターンを構築し、どれがDenyまたはAllowになるかを確認することで、アカウントIDを1桁ずつ発見して特定できます。
0で始まるアカウントに存在するS3バケットへのアクセスを制限するポリシーを追加します。アクセスが許可されれば、アカウントIDが0で始まる必要があることがわかります。リクエストが拒否された場合は、最初の桁として1で再試行します。リクエストが許可されるまでインクリメントを続け、最初の桁を見つけます。8だった場合、80、81、82などで始まるアカウントIDをテストします。このプロジェクトの管理にはpoetryを使用しています。
poetry install を実行します。poetry shell で仮想環境をアクティブにします(poetry run $command を使用することもできます)。poetry publish --build を実行します。s3:ResourceAccount < 500000000000と同等です。
"Condition": {
"StringLike": {"s3:ResourceAccount": [
"0*", "1*", "2*", "3*", "4*",
]},
},
実際には、このツールはほとんどの場合で十分に高速です。