web-dev-qa-db-ja.com

s3へのアクセス拒否アップロード

S3にアップロードしようとしましたが、s3バケットログのログを見ると、次のように表示されます。

mybucket-me [17/Oct/2013:08:18:57 +0000] 120.28.112.39 
arn:aws:sts::778671367984:federated-user/[email protected] BB3AA9C408C0D26F 
REST.POST.BUCKET avatars/dean%2540player.com/4.png "POST / HTTP/1.1" 403 
AccessDenied 231 - 132 - "http://localhost:8080/ajaxupload/test.html" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17" -

アクセスが拒否されました。それが指しているところから、私が見逃しているのはバケットポリシーの追加だけだと思います。だからここに行きます。

メールを使用して、アプリにログインし、アバターをアップロードすることができました。アバターを配置するバケット名はmybucket-meであり、アバターという名前のサブバケットがあります。

-mybucket-me
 -avatars
  [email protected] //dynamic based on who are logged in
   -myavatar.png //image uploaded

バケットポリシーを追加して、Iなどのフェデレーションにs3でのアップロードを許可するにはどうすればよいですかまたはバケットにアップロードする権限を付与できるようにバケットポリシーに追加する正しいステートメントは何ですか?

13
Wondering Coder

次のポリシーをバケットに添付できます。

{
    "Version": "2008-10-17",
    "Id": "Policy1358656005371",
    "Statement": [
        {
            "Sid": "Stmt1354655992561",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:sts::778671367984:federated-user/[email protected]"                  
                ]
            },
            "Action": [
                "s3:List*",
                "s3:Get*"
            ],
            "Resource": [
                "arn:aws:s3:::my.bucket",
                "arn:aws:s3:::my.bucket/*"
            ]
        }
    ]
}

フェデレーションユーザー[email protected]に「my.bucket」への読み取り専用権限を付与します。

このポリシーは、特にこのユーザーに名前を付けるため、あまり維持できません。よりスケーラブルな方法で特定のフェデレーションユーザーのみにアクセスを許可するには、GetFederationTokenを呼び出すときにこれを行うことをお勧めします。 STSコードを投稿すると、そこにポリシーを割り当てることができますが、上記と非常によく似ています。

5
prestomation

S3バケットにアップロードするには、次のようにIAM /グループポリシーを追加/作成する必要があります。

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

どこ arn:aws:s3:::testはAmazonリソース名(ARN)です。

出典: IAMポリシーの記述:Amazon S3バケットへのアクセスを許可する方法

関連:

4
kenorb

2019+

あなたは今、次のいずれかをしなければなりません:

  • 新しいパブリックACLをブロックし、パブリックオブジェクトfalseアイテムが公開されている場合(写真の左上のポリシー)

enter image description here

  • セットする acl: 'private'画像をアップロードするときアイテムが非公開の場合

Node.jsの例:

const upload = multer({
    storage: multerS3({
        s3: s3,
        bucket: 'moodboard-img',
        acl: 'private',
        metadata: function (req, file, cb) {
            cb(null, {fieldName: file.fieldname});
        },
        key: function (req, file, cb) {
            cb(null, Date.now().toString())
        }
    })
})
3
Sebastien Horin