IAM ポリシーを使用して、特定の S3 フォルダに対するユーザー固有のアクセス権を付与するにはどうすればよいですか?

最終更新日: 2021 年 10 月 5 日

IAM ユーザーポリシーを使用して、Amazon Simple Storage Service (Amazon S3) バケット内の特定のフォルダへのアクセスを制限したいと考えています。

簡単な説明

AWS Identity and Access Management (IAM) ユーザーポリシーを使用して、Amazon S3 バケット内の特定のフォルダにアクセスできるユーザーを制御できます。

解決方法

シングルユーザーポリシー - このポリシー例では、特定の IAM ユーザーがバケットの最初のレベルにある特定のフォルダを参照してから、目的のフォルダおよびサブフォルダ内のオブジェクトに対してアクションを実行できます。この例では、次の構造で David という名前の IAM ユーザーと my-company という名前のバケットを使用します。

/home/Adele/ /home/Bob/ /home/David/ /restricted/ /root-file.txt

{
 "Version":"2012-10-17",
 "Statement": [
   {
     "Sid": "AllowUserToSeeBucketListInTheConsole",
     "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
     "Effect": "Allow",
     "Resource": "*"
   },
  {
     "Sid": "AllowRootAndHomeListingOfCompanyBucket",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::my-company"],
     "Condition":{"StringEquals":{"s3:prefix":["","home/"],"s3:delimiter":["/"]}}
    },
   {
     "Sid": "AllowListingOfUserFolder",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::my-company"],
     "Condition":{"StringLike":{"s3:prefix":["home/David/*"]}}
   },
   {
     "Sid": "AllowAllS3ActionsInUserFolder",
     "Effect": "Allow",
     "Action": ["s3:*"],
     "Resource": ["arn:aws:s3:::my-company/home/David/*"]
   }
 ]
}

Amazon S3 コンソールは、フォルダ内のオブジェクトを表示するための特殊文字としてスラッシュ (/) を使用します。接頭辞 (s3:prefix) と区切り文字 (s3:delimiter) を使用すると、フォルダ内のオブジェクトを整理したり参照したりできます。

マルチユーザーポリシー - 場合によっては、ポリシーを作成するときにリソースの正確な名前がわからないことがあるでしょう。たとえば、前の例のように、すべてのユーザーが自分のオブジェクトを Amazon S3 バケットに置くことを許可したいと思うこともあるでしょう。けれども、リソースの一部としてユーザーの名前を指定するユーザーごとの個別のポリシーを作成する代わりに、そのグループ内の任意のユーザーに対して機能する単一のグループポリシーを作成できます。

これを行うには、ポリシー変数を使用します。これにより、ポリシー内のプレースホルダーを指定できます。ポリシーが評価されると、ポリシー変数はリクエスト自体から得られた値に置き換えられます。

この例は、ポリシー変数 ${aws:username} を使用する Amazon S3 バケットのポリシーを示しています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowUserToSeeBucketListInTheConsole",
      "Action": [
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation"
      ],
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Sid": "AllowRootAndHomeListingOfCompanyBucket",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::my-company"
      ],
      "Condition": {
        "StringEquals": {
          "s3:prefix": [
            "",
            "home/"
          ],
          "s3:delimiter": [
            "/"
          ]
        }
      }
    },
    {
      "Sid": "AllowListingOfUserFolder",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::my-company"
      ],
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "home/${aws:username}/*"
          ]
        }
      }
    },
    {
      "Sid": "AllowAllS3ActionsInUserFolder",
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::my-company/home/${aws:username}/*"
      ]
    }
  ]
}

: StringLike のみがアスタリスク (*) をワイルドカードとして認識します。StringEquals はそのように認識しません。詳細については、文字列条件演算子を参照してください。