Доступ запрещен - ресурс S3 с использованием предварительно подписанного URL - Ruby SDK - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь загрузить и просмотреть файлы в полностью приватное ведро.

Контроллер:

В контроллере я вызываю функцию "Aws :: S3 :: PresignedPost" в SDK для Ruby V3 для генерации данных формы.

      @s3_direct_post = Aws::S3::PresignedPost.new(aws_config[:aws_credenciais], aws_config[:aws_bucket_region], aws_config[:aws_bucket], {
      key: "#{empresa.companyname}/ordem_servico/#{Time.now.year}/#{@ordem_servico.id}/#{@ordem_servico.os_id}_v#{@ordem_servico.versao}/#{SecureRandom.uuid}/${filename}",
      success_action_status: "201",
      acl: 'public-read',
      expires: (Time.now + 15.minutes)
      })

Форма спереди:

В форме фронта я генерирую скрытые входы с переменными, сгенерированными SDK

      <form id="my-dropzone" action="https://bucket.s3.amazonaws.com" class="dropzone dz-clickable dz-started" enctype="multipart/form-data">
        <input type="hidden" name="key" value="nucleusteste/ordem_servico/2019/180/4_v1/49147a65-ed8b-48c9-a198-7bd6b23c72d1/${filename}">
        <input type="hidden" name="success_action_status" value="201">
        <input type="hidden" name="acl" value="public-read">
        <input type="hidden" name="Expires" value="Mon, 03 Jun 2019 17:18:54 GMT">
        <input type="hidden" name="policy" value="eyJleHBpcmF0aW9uIjoiMjAxOS0wNi0wM1QxODowMzo1NFoiLCJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJ0ZXN0ZWNvbnZlcnBsYXN0In0sWyJzdGFydHMtd2l0aCIsIiRrZXkiLCJudWNsZXVzdGVzdGUvb3JkZW1fc2Vydmljby8yMDE5LzE4MC80X3YxLzQ5MTQ3YTY1LWVkOGItNDhjOS1hMTk4LTdiZDZiMjNjNzJkMS8iXSx7InN1Y2Nlc3NfYWN0aW9uX3N0YXR1cyI6IjIwMSJ9LHsiYWNsIjoicHVibGljLXJlYWQifSx7IkV4cGlyZXMiOiJNb24sIDAzIEp1biAyMDE5IDE3OjE4OjU0IEdNVCJ9LHsieC1hbXotY3JlZGVudGlhbCI6IkFLSUEyRkE1RExGV0xPQ1hWSTRZLzIwMTkwNjAzL3VzLWVhc3QtMS9zMy9hd3M0X3JlcXVlc3QifSx7IngtYW16LWFsZ29yaXRobSI6IkFXUzQtSE1BQy1TSEEyNTYifSx7IngtYW16LWRhdGUiOiIyMDE5MDYwM1QxNzAzNTRaIn1dfQ==">
        <input type="hidden" name="x-amz-credential" value="AKIB5FA2DLLLLOCVVI5Y/20190603/us-east-1/s3/aws4_request">
        <input type="hidden" name="x-amz-algorithm" value="AWS4-HMAC-SHA256">
        <input type="hidden" name="x-amz-date" value="20190603T170354Z">
        <input type="hidden" name="x-amz-signature" value="e3670b80d0e09e77ee07971a60235b18a2181fd34ff901a334f9ed2222fece45">
      </form>

AWS S3 CORS:

В части настроек моего контейнера я создал CORS, чтобы принимать только PUT, POST и DELETE только с моего сайта, и я оставил визуализацию файлов бесплатной.

      <?xml version="1.0" encoding="UTF-8"?>
      <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
        <CORSRule>
          <AllowedOrigin>https://mysite.herokuapp.com</AllowedOrigin>
          <AllowedMethod>PUT</AllowedMethod>
          <AllowedMethod>POST</AllowedMethod>
          <AllowedMethod>DELETE</AllowedMethod>
          <AllowedHeader>*</AllowedHeader>
        </CORSRule>
        <CORSRule>
          <AllowedOrigin>*</AllowedOrigin>
          <AllowedMethod>GET</AllowedMethod>
        </CORSRule>
      </CORSConfiguration>

Политика Bucket:

      {
      "Version": "2012-10-17",
      "Id": "Policy1559567062776",
      "Statement": [
      {
      "Sid": "Stmt1559567058183",
      "Effect": "Allow",
      "Principal": {
      "AWS": "*"
      },
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::test...."
      }
      ]
      }

Политика пользователя AWS:

Я создал пользователя AIM с помощью AmazonS3FullAccess, а также создал следующее правило и назначил его пользователю.

      {
      "Version": "2012-10-17",
      "Statement": [
      {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
      "s3:PutAccountPublicAccessBlock",
      "s3:GetAccountPublicAccessBlock",
      "s3:ListAllMyBuckets",
      "s3:ListJobs",
      "s3:CreateJob",
      "s3:HeadBucket"
      ],
      "Resource": "*"
      },
      {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::*"
      },
      {
      "Sid": "VisualEditor2",
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::*/*"
      }
      ]
      }

Возвращение всегда одинаково:

      <?xml version="1.0" encoding="UTF-8"?>
      <Error><Code>AccessDenied</Code><Message>Access Denied</Message>
        <RequestId>2EBDDD1ED051EB93</RequestId>
        <HostId>jULDSNHGX7L8W67duCAwdUjssSBp6eSuYlQR4xlfwTovOaMCkLAOUSJhM9g4o1w1WdSWAZfn+vg=</HostId>
      </Error>
...