Excon ::错误::禁止(预期(200)<=>实际(403禁止)

Vir*_*ult 7 ruby-on-rails amazon-s3 carrierwave railstutorial.org

当我尝试将图片上传到"Car"对象时,我被拒绝访问S3.但是我添加了S3后,资源文件夹中的站点图像显示得很好.我得到的具体错误是:

2015-02-17T14:40:48.459629+00:00 app[web.1]: Excon::Errors::Forbidden (Expected(200) <=> Actual(403 Forbidden)
2015-02-17T14:40:48.459630+00:00 app[web.1]: excon.error.response
2015-02-17T14:40:48.459635+00:00 app[web.1]:     "Connection"       => "close"
2015-02-17T14:40:48.459637+00:00 app[web.1]:     "Content-Type"     => "application/xml"
2015-02-17T14:40:48.459639+00:00 app[web.1]:     "Date"             => "Tue, 17 Feb 2015 14:40:48 GMT"
2015-02-17T14:40:48.459640+00:00 app[web.1]:     "Server"           => "AmazonS3"
2015-02-17T14:40:48.459632+00:00 app[web.1]:   :body          => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>2CE306ACD51F02A1</RequestId><HostId>tKLXUAKxyDFTMExl7kE+AuVVsEJOFqXh983li6N7R2UlYDXv1Z3GJRvW5zy1XIXVs2zArp310vg=</HostId></Error>"
2015-02-17T14:40:48.459642+00:00 app[web.1]:     "x-amz-id-2"       => ""part of secret key"="
Run Code Online (Sandbox Code Playgroud)

随着"秘密密钥的一部分"明显被编辑.我尝试创建一个不同的用户并使用新密钥,但这没有用.不是从这里去的地方.

应用程序/上传/ picture_uploader

class PictureUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
  process resize_to_limit: [400, 400]

  if Rails.env.production?
    storage :fog
  else
    storage :file
  end

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Add a white list of extensions which are allowed to be uploaded.
  def extension_white_list
    %w(jpg jpeg gif png)
  end
end
Run Code Online (Sandbox Code Playgroud)

carrier_wave.rb

if Rails.env.production?
  CarrierWave.configure do |config|
    config.fog_credentials = {
      # Configuration for Amazon S3
      :provider              => 'AWS',
      :aws_access_key_id     => ENV['S3_ACCESS_KEY'],
      :aws_secret_access_key => ENV['S3_SECRET_KEY']
    }
    config.fog_directory     =  ENV['S3_BUCKET']
  end
end
Run Code Online (Sandbox Code Playgroud)

我相信这是所有相关文件,请告诉我是否还有更多内容.不确定指定区域或超级用户是否有帮助,似乎不会.

Rob*_*and 43

[编辑:此时我默认为另一个答案,特别是如果你处于刺激环境中.这是一种解决方法,对我来说在几年前制造易碎玩具时起作用,但我同意在担心安全问题时授予最小权限.]

我遇到了同样的错误,解决方案是从AWS管理控制台附加管理访问策略:

1)通过http://aws.amazon.com/iam/登录AWS管理控制台

2)单击左侧导航窗格中的"策略"

3)选择"AdministratorAccess"策略

4)单击页面顶部的"策略操作">"附加"

5)选择与我的S3_ACCESS_KEY,S3_SECRET_KEY和S3_BUCKET关联的用户

6)点击"附加政策"

仅通过https://console.aws.amazon.com/s3/home从我的存储桶授予所有权限是不够的.

  • 因此,如果我们按照这个并在亚马逊中生成用户...我们现在有两组访问/密钥(当您转到'安全凭证'时,您的AWS账户会有一个通用密钥 - >访问密钥(访问密钥ID和秘密访问密钥)...然后另一个用于您在"用户"中设置的任何用户,如上面的步骤中所使用的.在运行'heroku config时,我们在终端中使用哪组密钥:set AWS_ACCESS_KEY_ID = and heroku config:设置AWS_SECRET_ACCESS_ID ='??? (3认同)
  • @RobMulholand据我所知,当您授予此管理员访问权限时,您将获得权限,以便这个新用户基本上可以对存储桶执行任何操作.这违背了选择和选择权限的目的.再据我所知.最后,我发现解决方案是在自定义策略中在ARN末尾添加"*",其中包含一些基本的S3权限(无管理员).否则,权限似乎只适用于存储桶的根目录,`*`是存储桶中的root +底层资源的通配符. (3认同)
  • 对于安全性,这不是一个非常糟糕的主意吗? (2认同)

Jer*_*emy 5

从安全角度来看,另一个告诉您授予 IAM 用户管理员访问权限的答案是一个坏主意 - 它允许任何有权访问这些密钥的人在您的账户中执行任何操作,包括删除所有基础设施。

我还没有计算出 Carrierwave / Fog 需要的确切的最小权限集,但是我得到的一个较小的集看起来像:

使用如下策略文档创建 AWS IAM 策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::BUCKETNAME/*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::BUCKETNAME"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

请注意,在BUCKETNAME和上指定 S3 操作并不是错误BUCKETNAME/*- 第一个与在存储桶上执行的 API 操作相关,第二个与存储在存储桶中的对象相关。