AWS S3访问策略 - Web浏览器与API

时间:2015-08-21 19:16:13

标签: ruby-on-rails amazon-web-services amazon-s3 carrierwave railstutorial.org

更新:我最终回答了我自己的问题。有关解决此问题的教程,请参阅“答案”部分。

问题: 外部源通过API控件访问AWS S3存储桶所需的策略究竟是什么?

详细信息: 我跟随Michael Hartl的Rails教程,我到了第11课的末尾,我们使用CarrierWave将图像文件存储在AWS S3存储桶中。我能够让它工作(必须添加区域ENV变量),但只能与具有完全管理员权限的用户。显然这并不理想。我专门为此目的创建了一个用户帐户,但所有演练似乎只关注Web浏览器访问。事实上,我能够创建允许用户只能在特定存储桶中读取,写入和删除的策略,但这只能通过Web浏览器而不是通过API工作。只有在我附加AdministratorAccess策略时,API访问才有效。

这是我到目前为止所拥有的:

政策:AllowRootLevelListingOfMyBucket

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Sid": "AllowRootLevelListingOfMyBucket",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::MyBucket"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:prefix": [
                        ""
                    ],
                    "s3:delimiter": [
                        "/"
                    ]
                }
            }
        }
    ]
}

政策:AllowUserToReadWriteObjectDataInMyBucket

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

正如我所说,这允许Web浏览器访问,但API访问尝试返回" AccessDenied"错误:Excon :: Errors :: Forbidden(预期(200)< => Actual(403 Forbidden)

我需要为API访问添加什么内容?

更新:我已经缩小了一点问题。有一些"动作"我需要给予许可,但我还没能完全确定行动。但是使用通配符可以工作,并且我已经能够锁定用户帐户,只能访问一个存储桶。以下是我所做的更改:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUserToReadWriteObjectDataInMyBucket",
            "Action": [
                "s3:*"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::MyBucket/*"
            ]
        }
    ]
}

1 个答案:

答案 0 :(得分:0)

我最终回答了我自己的问题,并创建了其他人可能想要遵循的教程:

您需要做的第一件事是回顾一下Hartl提供的代码。确保您完全按照所示键入(或复制/粘贴)。在本节中的所有代码中,您可能只需要添加一个小的附加内容。 “region”环境变量。如果您创建的存储桶不在默认的美国区域中,则需要这样做。稍后会详细介绍。以下是/config/initializers/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'],
      :region                => ENV['S3_REGION']
    }
    config.fog_directory     =  ENV['S3_BUCKET']
  end
end

该行:region => ENV['S3_REGION']对许多人来说都是一个问题。当您继续本教程时,您将了解它的用途。

您应该完全按照所示使用该代码块。 请勿将实际密钥放在那里。我们会将它们分别发送给Heroku。

现在让我们转到您的AWS账户和安全性。

  1. 首先,创建您的AWS账户。在大多数情况下,这就像注册任何网站一样。制作一个很好的长密码并将其存储在安全的地方,就像加密的密码管理器一样。当您创建帐户时,您将获得第一组AWS密钥。您将不会在本教程中使用它们,但是您可能在将来的某个时候需要它们,因此请将它们保存在安全的地方。
  2. 转到S3部分并制作一个存储桶。它必须具有唯一性 名字,所以我通常只把日期放在最后,就是这样。例如,您可以将其命名为“my-sample-app-bucket-20160126”。一旦您 创建了您的存储桶,单击该名称,然后单击“属性”。 了解您的存储桶所属的“区域”非常重要。找到它, 并记下它。你稍后会用它。
  3. 您的主帐户可能拥有对所有内容的完全权限,因此我们不要使用它来在两个Web服务之间传输随机数据。如果它出来,这可能会花费你很多钱。我们将改为限制用户。 在IAM部分创建一个新用户。我将其命名为“雾”,因为这是处理发送和接收的云服务软件。创建它时,您可以选择显示和/或下载与新用户关联的键。保持安全是非常重要的 和安全的地方。它不会进入你的代码,因为那可能会 最终进入其他人可以看到它的存储库。另外,不要这样做 新用户密码,因为它不会登录AWS仪表板。
  4. 制作一个新组。我称之为“s3railsbucket”。这就是 权限将被分配。在此组中添加“雾”。
  5. 转到“政策”部分。单击“创建策略”,然后选择“创建您的 自己的政策“。给它一个以”允许“开头的名称,这样就会显示在附近 政策列表的顶部。这是一个巨大的清单。这是我做的:
  6. 政策名称: AllowFullAccessToMySampleAppBucket20160126
    描述:允许对名为的S3存储桶进行远程写入/删除访问 我的样本应用程序内斗 - 20160126。
    政策文件:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "s3:*",
                "Effect": "Allow",
                "Resource": [
                    "arn:aws:s3:::my-sample-app-bucket-20160126",
                    "arn:aws:s3:::my-sample-app-bucket-20160126/*"
                ]
            }
        ]
    }
    
    1. 返回“群组”部分,选择您制作的群组,然后添加 您对集团的新政策。
    2. 这适用于AWS配置。我不需要制定允许的政策 “雾”列出了桶的内容,即使我尝试了大多数教程 说这是必要的。我认为只有你想要一个用户才有必要 可以通过仪表板登录。

      现在为Heroku配置。这些东西输入你的 命令提示符,就像'heroku run rake db:migrate'等。这是 您输入之前创建的“雾”用户的实际访问密钥和密钥。

      $ heroku config:set S3_ACCESS_KEY=THERANDOMKEYYOUGOT  
      $ heroku config:set S3_SECRET_KEY=an0tHeRstRing0frAnDomjUnK  
      $ heroku config:set S3_REGION=us-west-2  
      $ heroku config:set S3_BUCKET=my-sample-app-bucket-20160126
      

      再看一下最后一个。记得你看过的属性 你的S3桶?您可以在此处输入与您的代码相关联的代码 区域。如果您的存储桶不在俄勒冈州,则必须将us-west-2更改为您的实际区域代码。编写本教程时,此链接有效:

      http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region

      如果这不起作用,Google“AWS S3区域代码”。

      完成所有这些并仔细检查代码中的错误后,我得到了 Heroku与AWS合作存储图片!