りんごとバナナとエンジニア

エンジニア修行の記録

【AWS】CloudTrailログからリクエストのGlobal Condition Keyを推測する

AWSのポリシーを作るとき、 Condition 句を使って特定のプリンシパルをポリシー適用の例外として指定したい時がある。 Condition 句の中で指定した条件は、リクエストに含まれるGlobal Condition Keyと照らし合わせて確認され、リクエストが許可されるかどうかが決まる。

docs.aws.amazon.com

しかし、業務で特定のアカウントやVPC・サービスのみがS3バケットにアクセスできるようバケットポリシーを作ろうとした際、テストの方法がわからず、ポリシーを変えてはリクエストを送ってみて確認、という作業を繰り返すことになってしまった。
より効率的な方法はないかカスタマーサポートに聞いてみたところ、Global Condition Keyを直接確認できる方法は存在しないが、CloudTrailでリクエストログを取得していればそこから推測できると教えてもらった。

CloudTrailのログのフィールドは以下のドキュメントにまとまっている。

docs.aws.amazon.com

例えば、AWS glueサービスからS3バケットに置いてあるスクリプトをダウンロードしようとして、Access Deniedのエラーが出たとする。その場合、エラーメッセージに requestId が表示されていれば、それを使ってCloudTrailのログを検索することで、当該リクエストの詳細なログを取得できる。
ポリシーの Condition によく使うキーとの対応として、 aws:userid は CloudTrailログの useridentity.principalId に、 aws:PrincipalAccountuserIdentity.accountId に相当する。また、VPC Endpoint経由でのアクセスかどうか確認するには、CloudTrailログ内に vpcEndpointId フィールドが存在するかを確認すればよい。
リクエストのログを取得することができれば、トライアンドエラーでポリシーを何度も変更する必要がなくなり、ポリシー設計が非常に楽になる。