プレフィックスで制限されたS3アクセスのIAMポリシー

特定のプレフィックス(フォルダパス)配下のオブジェクトにS3アクセスを制限するIAMポリシーを作成します。マルチテナントアプリケーションやユーザーごとのストレージに有用です。

Storage

詳細な説明

プレフィックスベースのS3アクセス制御

マルチテナントアプリケーションや共有バケットでは、各ユーザーやサービスを独自の「フォルダ」(プレフィックス)に制限する必要があります。IAMポリシーは、リソースを特定のプレフィックスパターンにスコープすることでこれを実現できます。

ポリシーJSON

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowListBucketWithPrefix",
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::shared-bucket",
      "Condition": {
        "StringLike": {
          "s3:prefix": ["uploads/user-123/*"]
        }
      }
    },
    {
      "Sid": "AllowObjectAccessUnderPrefix",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": "arn:aws:s3:::shared-bucket/uploads/user-123/*"
    }
  ]
}

2ステートメント設計

  • ステートメント1はバケットに対するListBucketを許可しますが、条件を使用してuploads/user-123/プレフィックス配下のオブジェクトのリストのみに制限します。条件がないと、ユーザーはバケット内のすべてのオブジェクトをリストできてしまいます。
  • ステートメント2はオブジェクトレベルの操作(Get、Put、Delete)を付与しますが、特定のプレフィックスARNパターンに一致するリソースのみです。

動的プレフィックスポリシー

実際には、プレフィックスを動的にするために${aws:username}${aws:PrincipalTag/tenant-id}などのIAMポリシー変数を使用することが多いです:

"Resource": "arn:aws:s3:::shared-bucket/uploads/${aws:PrincipalTag/tenant-id}/*"

これにより、ユーザーやテナントごとに個別のポリシーを作成する必要がなくなります。

ユースケース

各テナントのデータが一意のS3プレフィックス配下に格納されるマルチテナントSaaSアプリケーションで、別々のバケットなしにIAMレベルでデータ分離を確保します。

試してみる — AWS IAM Policy Generator

フルツールを開く