上传文档时拒绝访问,如何设置权限配置文件和存储桶策略?
Access denied when uploading a document, how to set permission profile and bucket policy?
我需要一些关于如何设置我的 S3 存储桶策略的指导 and/or IAM 权限配置文件。
我们的 Rails 应用程序将文件上传到存储桶,并在上传后向文档显示 links。
基本上我想启用 Block all public access ,因为它是安全的,但是在 Rails 应用程序中单击 link 时应该能够上传和打开文档。
所以我创建了一个具有此权限配置文件的 IAM 用户:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<bucket-name>",
"arn:aws:s3:::<bucket-name>"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::<bucket-name>/*",
"arn:aws:s3:::<bucket-name>/*"
]
}
]
}
然后我添加了这样的存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<iam-user>"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::<bucket-name>/*"
}
]
}
对于 "Action": "s3:*"
,我想我是在说:这个用户可以在这个存储桶上做任何事情?
这适用于打开文档,但在上传文档时我被拒绝访问。
那么我需要更改什么才能使上传文件再次正常工作?
您可以为您的文件创建 S3 pre-signed url。这将使您页面的访问者无需明确 public 即可下载它们。预签名 url 是临时的,因此您需要一种机制来重新生成过期的 url。
其他流行的选择是通过 CloudFront 公开您的文件。这样,您的存储桶不仅可以保持完全私密,而且您还可以获得全球 CDN 的好处,可以更快地为您的文件提供服务。
如果您希望授予应用程序访问 (upload/download) Amazon S3 存储桶的权限,则应在 IAM 用户或 IAM 上的 IAM 策略中授予权限 应用正在使用的角色。 不需要 同时创建存储桶策略。
这将允许该应用上传和下载内容。
当应用程序想要允许用户访问私有对象时,它应该生成一个 Amazon S3 pre-signed URL,这是一个提供对私有对象的临时访问的时间限制 URL。 URL 可以作为 link 插入到 HTML 中,甚至可以插入到标签中(例如 <img src='...'
)。这样,应用程序可以完全控制哪些用户可以访问哪些对象。
预签名 URL 也可用于将对象上传到存储桶。这样,该应用程序可以控制谁可以上传对象以及他们可以将对象放在哪里。参见:Uploading objects using presigned URLs - Amazon Simple Storage Service
我需要一些关于如何设置我的 S3 存储桶策略的指导 and/or IAM 权限配置文件。 我们的 Rails 应用程序将文件上传到存储桶,并在上传后向文档显示 links。 基本上我想启用 Block all public access ,因为它是安全的,但是在 Rails 应用程序中单击 link 时应该能够上传和打开文档。 所以我创建了一个具有此权限配置文件的 IAM 用户:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<bucket-name>",
"arn:aws:s3:::<bucket-name>"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::<bucket-name>/*",
"arn:aws:s3:::<bucket-name>/*"
]
}
]
}
然后我添加了这样的存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<iam-user>"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::<bucket-name>/*"
}
]
}
对于 "Action": "s3:*"
,我想我是在说:这个用户可以在这个存储桶上做任何事情?
这适用于打开文档,但在上传文档时我被拒绝访问。
那么我需要更改什么才能使上传文件再次正常工作?
您可以为您的文件创建 S3 pre-signed url。这将使您页面的访问者无需明确 public 即可下载它们。预签名 url 是临时的,因此您需要一种机制来重新生成过期的 url。
其他流行的选择是通过 CloudFront 公开您的文件。这样,您的存储桶不仅可以保持完全私密,而且您还可以获得全球 CDN 的好处,可以更快地为您的文件提供服务。
如果您希望授予应用程序访问 (upload/download) Amazon S3 存储桶的权限,则应在 IAM 用户或 IAM 上的 IAM 策略中授予权限 应用正在使用的角色。 不需要 同时创建存储桶策略。
这将允许该应用上传和下载内容。
当应用程序想要允许用户访问私有对象时,它应该生成一个 Amazon S3 pre-signed URL,这是一个提供对私有对象的临时访问的时间限制 URL。 URL 可以作为 link 插入到 HTML 中,甚至可以插入到标签中(例如 <img src='...'
)。这样,应用程序可以完全控制哪些用户可以访问哪些对象。
预签名 URL 也可用于将对象上传到存储桶。这样,该应用程序可以控制谁可以上传对象以及他们可以将对象放在哪里。参见:Uploading objects using presigned URLs - Amazon Simple Storage Service