はじめに
AWS DOPの勉強で頻繁に権限の問題が出てきてややこしいので整理してみる
評価フロー
アカウントA の EC2インスタンスが、アカウントB の S3バケットへアクセスするみたいなのを想定
AI解説
クロスアカウントアクセスは、大きく分けて2つのフェーズで評価されます。
フェーズ1: アカウントAのEC2インスタンスが、アカウントBのIAM Role B
の認証情報を取得する (AssumeRole)
これは、EC2インスタンスが、アカウントBのリソースにアクセスするための「身分証明書」を借りるプロセスです。
-
EC2インスタンスが
IAM Role A
の認証情報を取得:-
EC2インスタンスにアタッチされたインスタンスプロファイルを介して、
IAM Role A
の一時的なセキュリティ認証情報を取得しようとします。 -
この時、
IAM Role A
の信頼ポリシーが、ec2.amazonaws.com
サービスプリンシパルからのsts:AssumeRole
を許可しているか評価されます。 -
許可されていなければ、ここで処理は停止します。
-
-
アカウントAの
IAM Role A
がIAM Role B
をAssumeRole
しようと要求:-
IAM Role A
の認証情報を持ったEC2インスタンスが、sts:AssumeRole
APIを呼び出し、ターゲットとしてアカウントBのIAM Role B
を指定します。
-
-
アカウントAのSCPによる評価:
-
アカウントAに適用されているSCP Aが、
sts:AssumeRole
アクションを拒否していないか評価されます。 -
拒否されていれば、処理は停止します。
-
-
IAM Role A
のIAMポリシーによる評価:-
IAM Role A
にアタッチされているIAMポリシーが、アカウントBのIAM Role B
へのsts:AssumeRole
アクションを許可しているか評価されます。 -
拒否されていれば、処理は停止します。
-
-
アカウントBのSCPによる評価:
-
アカウントBに適用されているSCP Bが、アカウントAからの
sts:AssumeRole
アクションを拒否していないか評価されます。 -
拒否されていれば、処理は停止します。
-
-
IAM Role B
の信頼ポリシーによる評価:-
アカウントBの
IAM Role B
にアタッチされている信頼ポリシーが、アカウントAのIAM Role A
からのsts:AssumeRole
アクションを許可しているか評価されます。 -
拒否されていれば、処理は停止します。
-
-
IAM Role B
のパーミッションバウンダリーによる評価:-
もし
IAM Role B
にパーミッションバウンダリーが設定されていれば、sts:AssumeRole
アクションがその境界内で許可されているか評価されます。 -
拒否されていれば、処理は停止します。
-
→ これら全ての条件が「許可」であった場合、アカウントAのEC2インスタンスは、アカウントBのIAM Role B
の一時的な認証情報を取得します。
フェーズ2: アカウントAのEC2インスタンスが、取得したIAM Role B
の権限を使ってアカウントBのS3にアクセスする
EC2インスタンスは、IAM Role B
の認証情報を使用して、S3へのAPIリクエスト(例: s3:GetObject
)を発行します。
-
アカウントBのSCPによる評価:
-
アカウントBに適用されているSCP Bが、
s3:GetObject
アクションを拒否していないか評価されます。 -
拒否されていれば、処理は停止します。
-
-
IAM Role B
のIAMポリシーによる評価:-
IAM Role B
にアタッチされているIAMポリシーが、ターゲットのS3バケットに対するs3:GetObject
アクションを許可しているか評価されます。 -
拒否されていれば、処理は停止します。
-
-
S3バケットのリソースベースポリシーによる評価:
-
ターゲットのS3バケットにアタッチされているバケットポリシーが、
IAM Role B
からのs3:GetObject
アクションを許可しているか評価されます。 -
拒否されていれば、処理は停止します。
-
-
IAM Role B
のパーミッションバウンダリーによる評価:-
もし
IAM Role B
にパーミッションバウンダリーが設定されていれば、s3:GetObject
アクションがその境界内で許可されているか評価されます。 -
拒否されていれば、処理は停止します。
-
→ これら全ての条件が「許可」であった場合のみ、アカウントAのEC2インスタンスはアカウントBのS3バケットにアクセスできます。