どうも、ちゃだいん(@chazuke4649)です。
特定のAWS IAM Identity Centerユーザーのみ S3アクセスを許可するバケットポリシーをご紹介します。
"特定のIAM Identity Center許可セット"の場合は、以下ブログをどうぞ。
前提
正確には、「特定のAWS IAM Identity Centerユーザー以外の S3アクセスを拒否するバケットポリシー」です。
また、そもそもユーザー側にS3のアクセスが許可されている状態を想定します。よって、バケットポリシーがない状態だと、ユーザー側に権限があればアクセスできる状態であり、それを一定条件を満たさないと拒否するようにリソース側で制御するイメージです。
結論
以下のようなバケットポリシーになります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::<S3バケット名>/*",
"Condition": {
"StringNotLike": {
"aws:userId": "<IAMロールID>:<Identity Centerユーザー名>"
}
}
}
]
}
この二つのブログを大いに参考にしています。
ポイント
Condition
にて、aws:userId
に対し、許可したい 許可セットのIAMロールID x Identity Centerユーザー名 を記述します。
この値は、例えばそのIdentity Centerユーザーが使えれば、 aws sts get-caller-identity
で取得できます。
$ aws sts get-caller-identity
{
"UserId": "AROADUMMYDUMMYDUMMY:TestAdminUser",
"Account": "000000000000",
"Arn": "arn:aws:sts::000000000000:assumed-role/AWSReservedSSO_ReadOnlyAccess_exampleeeeeeeee/TestAdminUser"
}
まさに、このUserIdのみ許可したいということであれば、先ほどのバケットポリシーに当てはめるとこうなります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::<S3バケット名>/*",
"Condition": {
"StringNotLike": {
"aws:userId": "AROADUMMYDUMMYDUMMY:TestAdminUser"
}
}
}
]
}
Identity Centerユーザーによる認可の実体は、「許可セットによって生成されたIAMロールを引き受けたロールセッション」です。
つまり、「IAMユーザーがIAMロールにスイッチロールした時と同じようなもの」です。
ということは、リソースポリシーとしては、特定の Assumed-role session と同様の記述で制御が可能ということになります。
注意点
1点注意点としては、IAMロールIDは明示的に記述し、ワイルドカードを使わないことです。
つまり、さっきの例でいくと"aws:userId": "*:TestAdminUser"
としない方が良い場合があります。
というのも「Identity Centerユーザー名だけで絞ればいいんじゃない?」と思う人もいると思うのですが、もし利用者に元々適当なIAMユーザーとIAMロールを作る権限があれば、Identity Centerユーザーによるロールセッションを偽装できる可能性があります。
具体的には、とあるIdentity Centerユーザーの同じユーザー名のIAMユーザーを作成し、S3FullAccess
のあるIAMロールを作ってスイッチすれば、UserIdは、IAMロールID部分以外を除くとIdentity Centerユーザーのそれと見分けがつきません。
ただし、ロールIDは、IAMロールを一意に識別するIDなので偽装は困難です。さらに、適当なIAMユーザーが許可セットのIAMロールにスイッチすることは、信頼ポリシーにて許可されていないため、できません。
よって、許可セットのIAMロールID x Identity Centerユーザー名 に一致するロールセッションのみを対象とすることで、そういった偽装を防ぐことが可能です。
他参考情報
AWS グローバル条件コンテキストキー - AWS Identity and Access Management
AWS JSON ポリシーの要素: Principal - AWS Identity and Access Management
What is IAM Identity Center? - AWS IAM Identity Center (successor to AWS Single Sign-On)
IAM ID センターリソースへのアクセス許可の管理の概要 - AWS IAM Identity Center (successor to AWS Single Sign-On)
ちなみに、レアケースですがSCPにてIdentity Center ユーザーのユーザーID(※上で紹介したものとは別物なので注意)で制御するには、以下の方法もあります。