web-dev-qa-db-ja.com

単一のバケットへのフルアクセス権を持つAmazon S3ユーザーが必要です

私は次の特権を持つユーザーfooを持っています(それはどのグループのメンバーでもありません):

_{
  "Statement": [
    {
      "Sid": "Stmt1308813201865",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bar"
    }
  ]
}
_

ただし、そのユーザーは、認証されたユーザー(すべてのユーザーに適用される可能性があります)にフルアクセスを許可するまで、アップロードしたり、ほとんど何もできません。 botokey.set_acl('public-read')を実行しようとすると、アップロード後にエラーがスローされるため、これでもユーザーは権限を変更できません。

理想的には、このユーザーはbarバケットへの完全なアクセス権を持ち、それ以外には何もありません。何が問題なのですか?

32
Kit Sunde

s3:ListBucket権限をバケット自体に付与する必要があります。以下のポリシーをお試しください。

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "S3:*",
      "Resource": "arn:aws:s3:::bar/*",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": "arn:aws:s3:::bar",
      "Condition": {}
    }
  ]
}
40
cloudberryman

選択した答えは私にはうまくいきませんでしたが、これはうまくいきました:

{
  "Statement": [
    {
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::my-bucket",
        "arn:aws:s3:::my-bucket/*"
      ]
    }
  ],
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "arn:aws:s3:::*"
    }
  ]
}

クレジット: http://mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using-Amazon-iam/

20
Suman

AWS Policy Generator をご存知ですか?

8
Ryan Parman

IAMポリシーの書き込み:Amazon S3バケットへのアクセスを許可する方法 に公式のAWSドキュメントがあります

適切なルールをコピーして貼り付け、すべてのステートメントで「リソース」キーをバケットのARNに変更するだけです。

programamtic accessの場合、ポリシーは次のようになります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": ["arn:aws:s3:::bar"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": ["arn:aws:s3:::bar/*"]
        }
    ]
}

コンソールアクセスの場合、アクセスは次のようになります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::bar*"
        },
        {
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": ["arn:aws:s3:::bar"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": ["arn:aws:s3:::bar/*"]
        }
    ]
}
2
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                        "s3:GetBucketLocation",
                        "s3:ListAllMyBuckets"
                      ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::YOUR-BUCKET",
                "arn:aws:s3:::YOUR-BUCKET/*"
            ]
        }
    ]
}
0
Rishikesh

Cyber​​duckがオブジェクトACLを設定できない理由を理解できないために髪を抜いてきたのに、別のクライアント(Panic Transmitなど)で動作する場合の解決策は次のとおりです。

アクションリストにs3:GetBucketAclを追加する必要があります。例:

{
    "Statement": [
        {
            "Sid": "Stmt1",
            "Action": [
                "s3:GetBucketAcl",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::your-bucket-name"
        }
    ]
}

もちろん、s3:*の制限が少ない場合は、これを行う必要はありませんが、知っておくと良いと思います。

0
daniel

@cloudberrymanの答えは正しいですが、私は物事を可能な限り短くしたいです。この答えは次のように減らすことができます:

{  
   "Statement":[  
      {  
         "Effect":"Allow",
         "Action":"S3:*",
         "Resource":[  
            "arn:aws:s3:::bar",
            "arn:aws:s3:::bar/*"
         ]
      }
   ]
}
0
Sam Rueby

リソースで以下のように言及することにより、バケットの内部フォルダーを許可します。また、すべてのバケットにリスト権限を与える必要があります。以下のサンプルポリシーを確認してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::example-bucket",
                "arn:aws:s3:::example-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        }
    ]
}

これについての詳細を知るには、これを見つけてください 記事

0
Karthik

それは私にとってはうまくいきます:

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:ListBucketMultipartUploads",
                "s3:ListBucketVersions"
            ],
            "Resource": "arn:aws:s3:::bucket_name_here"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:*Object*",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": "arn:aws:s3:::bucket_name_here/*"
        }
    ]
}
0