Какие действия мне нужно указать в пользовательской политике, чтобы я мог загружать файлы на S3?

0

Если я назначу политику AdministratorAccess для моего пользователя S3, я могу легко загрузить файлы из своего веб-приложения в AWS S3.

Имя политики: AdministatorAccess

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}

Но когда я пытаюсь ограничить его привилегии с помощью другой политики, я получаю ошибку 403 от Amazon - AccessDenied.

Заголовки запросов:

Remote Address: [hidden]
Request URL:https://mydevelopmentbucket.s3-us-west-2.amazonaws.com/
Request Method:POST
Status Code:403 Forbidden

Вернул xml из Amazon S3:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied</Message>    
  <RequestId>B9DDXX267F8E201E</RequestId>      
  <HostId>gAU8sdlfkjsflkjsdZEmFT0VJwOG3FYdflkjdsfx6Po=</HostId>
</Error>

Не достаточно ли этих действий для загрузки файлов? Ниже приведена измененная (ограниченная) политика пользователя.

"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject",
"s3:ListBucket"

Ограниченная политика:

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

Политика разработки ведра:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "UploadFile",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::5503214313988:user/limited_user"
      },
      "Action": [
         "s3:DeleteObject",
          "s3:GetObject",
          "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::mydevelopmentbucket/*"
    },

    {
      "Sid": "ListBucket",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::5503214313988:user/limited_user"
      },
      "Action": [
         "s3:ListBucket"          
      ],
      "Resource": "arn:aws:s3:::mydevelopmentbucket"
    },

    {
      "Sid": "crossdomainAccess",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::mydevelopmentbucket/crossdomain.xml"
    }
  ]
}

Запрос полезной нагрузки

------WebKitFormBoundaryGGlyxVetpT9vWBGi
Content-Disposition: form-data; name="key"

3c23688b16c03b7491508ab97595b74ebd301ca6a4f0aaea74a23a81944e457c/avatars/gjRyRE20LzJsGHAwulI1QZqV77JpnPGmTLKrxvvnIpQSqe800zcHT8vvWGF0wVoC/cache2.jpg
------WebKitFormBoundaryGGlyxVetpT9vWBGi
Content-Disposition: form-data; name="AWSAccessKeyId"

AKIAIITCEYZCTQBJ4RUQ
------WebKitFormBoundaryGGlyxVetpT9vWBGi
Content-Disposition: form-data; name="acl"

public-read
------WebKitFormBoundaryGGlyxVetpT9vWBGi
Content-Disposition: form-data; name="policy"

ewogICAgImV4cGlyYXRpb24iOiAiMjAyMC0wMS0wMVQwMDowMDowMFoiLAogICAgImNvbmRpdGlvbnMiOiBbCiAgICAgICAgeyJidsdkfjsflksdjflksdfjHMtd2l0aCIsICIkQ29udGVudC1UeXBlIiwgIiJdLAogICAgICAgIFsic3RhcnRzLXdpdGgiLCAiJGZpbGVuYW1lIiwgIiJdLAogICAgICAgIHsic3VjY2Vzc19hY3Rpb25fc3RhdHVzIjogIjIwMSJ9LAogICAgICAgIFsiY29udGVudC1sZW5ndGgtcmFuZ2UiLCAwLCA1MjQyODgwMDBdCiAgICBdCn0=
------WebKitFormBoundaryGGlyxVetpT9vWBGi
Content-Disposition: form-data; name="signature"

svw7geEWRWER88ERLaxNiIY=
------WebKitFormBoundaryGGlyxVetpT9vWBGi
Content-Disposition: form-data; name="Content-Type"

image/jpeg
------WebKitFormBoundaryGGlyxVetpT9vWBGi
Content-Disposition: form-data; name="filename"

cache2.jpg
------WebKitFormBoundaryGGlyxVetpT9vWBGi
Content-Disposition: form-data; name="success_action_status"

201
------WebKitFormBoundaryGGlyxVetpT9vWBGi
Content-Disposition: form-data; name="file"; filename="undefined"
Content-Type: image/png


------WebKitFormBoundaryGGlyxVetpT9vWBGi--

Моя угловая директива:

$scope.upload = function(dataUrl) {

    Upload.upload({
        url: '<%= ENV["S3_UPLOAD_URL"] %>',
        method: 'POST',
        data: {
            key: 'avatars/' + $scope.picFile.name, 
            AWSAccessKeyId: '<%= ENV["AWS_ACCESS_KEY_ID"] %>',
            acl: 'public-read', 
            policy: $scope.policy,
            signature: $scope.signature,
            "Content-Type": $scope.picFile.type != '' ? $scope.picFile.type : 'application/octet-stream', 
            filename: $scope.picFile.name, 
            success_action_status: 201,
            file: Upload.dataUrltoBlob(dataUrl)
        }
    })
    .then(
        function (resp) {
            console.log('Success');                    
        },
        function(resp) {
            console.log('Error');
        },
        function(evt) {
            $scope.progressPercentage = parseInt(100.0 * evt.loaded / evt.total);                    
        }
    );  
};
Теги:
amazon-web-services
amazon-s3
ng-file-upload

1 ответ

0

Мне нужно было добавить еще 2 действия в мою политику limited_user:

"s3:GetObjectAcl",
"s3:PutObjectAcl"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню