特定のIAM Identity Centerユーザーのみ S3アクセスを許可するバケットポリシー

2023.09.08

どうも、ちゃだいん(@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(※上で紹介したものとは別物なので注意)で制御するには、以下の方法もあります。