AWS S3 访问策略 - Web 浏览器与 API
AWS S3 Access Policy - web browser vs API
更新:我最终回答了我自己的问题。有关解决此问题的教程,请参阅“答案”部分。
问题:
外部源通过 API 控件访问 AWS S3 存储桶所需的策略究竟是什么?
详情:
我正在学习 Michael Hartl 的 Rails 教程,我已经完成了第 11 课的结尾,我们使用 CarrierWave 将图像文件存储在 AWS S3 存储桶中。我能够让它工作(必须添加一个区域 ENV 变量),但只能与具有完全管理员权限的用户一起使用。显然这并不理想。我专门为此目的创建了一个用户帐户,但所有演练似乎只与 Web 浏览器访问有关。事实上,我能够创建允许用户只能在特定存储桶中读取、写入和删除的策略,但这只能通过网络浏览器而不是通过 API。 API 访问仅在我附加 AdministratorAccess 策略时有效。
这是我目前的情况:
政策: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/*"
]
}
]
}
正如我所说,这允许网络浏览器访问,但是 API 访问尝试 return 一个 "AccessDenied" 错误:Excon::Errors::Forbidden(预期(200)<=> 实际(403 禁止访问)
我需要添加什么才能获得 API 访问权限?
更新:我已经缩小了问题范围。有一些 "Action" 需要我授予权限,但我无法准确识别该操作。但是使用通配符是可行的,而且我已经能够将用户帐户锁定为只能访问一个存储桶。这是我所做的更改:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowUserToReadWriteObjectDataInMyBucket",
"Action": [
"s3:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::MyBucket/*"
]
}
]
}
我最终回答了我自己的问题,并创建了一个其他人可能想要遵循的教程:
您需要做的第一件事是回顾 Hartl 提供的代码。确保您完全按照显示的方式输入(或copy/pasted)。在本节的所有代码中,您可能只需要添加一小部分。 "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 账户和安全性。
- 首先,创建您的 AWS 帐户。 在大多数情况下,这就像注册任何网站一样。制作一个漂亮的长密码并将其存储在安全的地方,例如加密的密码管理器。当您创建帐户时,您将获得第一组 AWS 密钥。您不会在本教程中使用它们,但您可能在将来的某个时候需要它们,因此请将它们保存在安全的地方。
- 去S3部分做一个bucket。它必须有一个唯一的
名字,所以我通常只是把日期放在最后就行了。例如,您可以将其命名为 "my-sample-app-bucket-20160126"。一旦您
已创建您的存储桶,单击名称,然后单击属性。
知道 "Region" 你的桶在什么地方对你来说很重要。 找到它,
并记下它。稍后你会用到它。
- 您的主帐户可能拥有对所有内容的完全权限,因此我们不要使用它在两个网络服务之间传输随机数据。如果它泄露出去,你可能会损失很多钱。我们将创建一个有限的用户。 在IAM部分新建一个User。我将其命名为"fog",因为那是处理发送和接收的云服务软件。创建它时,您可以选择显示 and/or 下载与新用户关联的密钥。重要的是你把这个放在安全的地方
和安全的地方。它不会进入您的代码,因为那可能会
最终出现在其他人可以看到的存储库中。另外,不要给这个
新用户密码,因为它不会登录到 AWS 仪表板。
- 新建一个群组。我叫我的 "s3railsbucket"。这是
将分配权限。将 "fog" 添加到该组。
- 转到“政策”部分。单击 "Create Policy",然后单击 select“创建您的
Own Policy”。给它起一个以 "Allow" 开头的名称,这样它就会显示在附近
策略列表的顶部。这是一个巨大的清单。这是我所做的:
策略名称: AllowFullAccessToMySampleAppBucket20160126
说明:允许远程write/delete访问名为
my-sample-app-bucket-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/*"
]
}
]
}
- 返回组部分,select您创建的组,然后添加
您对群组的新政策。
AWS 配置到此结束。我不需要制定政策来允许
"fog" 列出存储桶的内容,尽管我尝试了大多数教程
说那是必要的。我认为只有当你想要一个用户时才有必要
可以通过仪表板登录。
现在进行 Heroku 配置。这些东西被输入到你的
命令提示符,就像 'heroku run rake db:migrate' 之类的。这是
在其中输入您从之前创建的 "fog" 用户那里获得的 实际 访问密钥和秘密密钥。
$ 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
更改为您的实际区域代码。 link 在编写本教程时有效:
http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
如果这不起作用,Google "AWS S3 region codes"。
完成所有这些并仔细检查代码中的错误后,我得到了
Heroku 与 AWS 合作存储图片!
更新:我最终回答了我自己的问题。有关解决此问题的教程,请参阅“答案”部分。
问题: 外部源通过 API 控件访问 AWS S3 存储桶所需的策略究竟是什么?
详情: 我正在学习 Michael Hartl 的 Rails 教程,我已经完成了第 11 课的结尾,我们使用 CarrierWave 将图像文件存储在 AWS S3 存储桶中。我能够让它工作(必须添加一个区域 ENV 变量),但只能与具有完全管理员权限的用户一起使用。显然这并不理想。我专门为此目的创建了一个用户帐户,但所有演练似乎只与 Web 浏览器访问有关。事实上,我能够创建允许用户只能在特定存储桶中读取、写入和删除的策略,但这只能通过网络浏览器而不是通过 API。 API 访问仅在我附加 AdministratorAccess 策略时有效。
这是我目前的情况:
政策: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/*"
]
}
]
}
正如我所说,这允许网络浏览器访问,但是 API 访问尝试 return 一个 "AccessDenied" 错误:Excon::Errors::Forbidden(预期(200)<=> 实际(403 禁止访问)
我需要添加什么才能获得 API 访问权限?
更新:我已经缩小了问题范围。有一些 "Action" 需要我授予权限,但我无法准确识别该操作。但是使用通配符是可行的,而且我已经能够将用户帐户锁定为只能访问一个存储桶。这是我所做的更改:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowUserToReadWriteObjectDataInMyBucket",
"Action": [
"s3:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::MyBucket/*"
]
}
]
}
我最终回答了我自己的问题,并创建了一个其他人可能想要遵循的教程:
您需要做的第一件事是回顾 Hartl 提供的代码。确保您完全按照显示的方式输入(或copy/pasted)。在本节的所有代码中,您可能只需要添加一小部分。 "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 账户和安全性。
- 首先,创建您的 AWS 帐户。 在大多数情况下,这就像注册任何网站一样。制作一个漂亮的长密码并将其存储在安全的地方,例如加密的密码管理器。当您创建帐户时,您将获得第一组 AWS 密钥。您不会在本教程中使用它们,但您可能在将来的某个时候需要它们,因此请将它们保存在安全的地方。
- 去S3部分做一个bucket。它必须有一个唯一的 名字,所以我通常只是把日期放在最后就行了。例如,您可以将其命名为 "my-sample-app-bucket-20160126"。一旦您 已创建您的存储桶,单击名称,然后单击属性。 知道 "Region" 你的桶在什么地方对你来说很重要。 找到它, 并记下它。稍后你会用到它。
- 您的主帐户可能拥有对所有内容的完全权限,因此我们不要使用它在两个网络服务之间传输随机数据。如果它泄露出去,你可能会损失很多钱。我们将创建一个有限的用户。 在IAM部分新建一个User。我将其命名为"fog",因为那是处理发送和接收的云服务软件。创建它时,您可以选择显示 and/or 下载与新用户关联的密钥。重要的是你把这个放在安全的地方 和安全的地方。它不会进入您的代码,因为那可能会 最终出现在其他人可以看到的存储库中。另外,不要给这个 新用户密码,因为它不会登录到 AWS 仪表板。
- 新建一个群组。我叫我的 "s3railsbucket"。这是 将分配权限。将 "fog" 添加到该组。
- 转到“政策”部分。单击 "Create Policy",然后单击 select“创建您的 Own Policy”。给它起一个以 "Allow" 开头的名称,这样它就会显示在附近 策略列表的顶部。这是一个巨大的清单。这是我所做的:
策略名称: AllowFullAccessToMySampleAppBucket20160126
说明:允许远程write/delete访问名为
my-sample-app-bucket-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/*"
]
}
]
}
- 返回组部分,select您创建的组,然后添加 您对群组的新政策。
AWS 配置到此结束。我不需要制定政策来允许 "fog" 列出存储桶的内容,尽管我尝试了大多数教程 说那是必要的。我认为只有当你想要一个用户时才有必要 可以通过仪表板登录。
现在进行 Heroku 配置。这些东西被输入到你的 命令提示符,就像 'heroku run rake db:migrate' 之类的。这是 在其中输入您从之前创建的 "fog" 用户那里获得的 实际 访问密钥和秘密密钥。
$ 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
更改为您的实际区域代码。 link 在编写本教程时有效:
http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
如果这不起作用,Google "AWS S3 region codes"。
完成所有这些并仔细检查代码中的错误后,我得到了 Heroku 与 AWS 合作存储图片!