为 Amazon S3 编写 IAM 策略和 CORS 配置
Writing an IAM policy and CORS configuration for Amazon S3
我对这一切还很陌生,但已经能够让 avatar/image 上传器在我的 Rails 应用程序中工作。用户可以将新头像上传到我的 S3 存储桶,该头像会显示在 Web 应用程序中。
为此,我不得不向用户授予 "AmazonS3FullAccess" 政策。这似乎有点太多了,因为应用程序的用户只需要写入(上传他的头像)和读取(在网页上显示头像)权限。
您是否同意编写自定义策略比使用 AmazonS3FullAccess 更好?
如果是这样,我已经尝试了下面的策略代码(取自 here),但这不起作用(尝试上传头像图像时出现 403 禁止错误)。关于如何更正此代码的任何建议?
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::mybucket"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::mybucket/*"]
}
]
}
我已经长出白发试图弄清楚正确的配置。这是一个对我有用的:
{
"Statement": [
{
"Sid": "AllowPublicRead",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:DeleteObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::mybucket/*",
"arn:aws:s3:::mybucket"
]
}
]
}
此策略应附加到适当的实体 ("Attached entity tab"),该实体可以是专门的用户。如果您需要 API/Access 密钥,请前往该用户的 "Security Credentials" 选项卡并生成一些。这使您可以更好地控制谁在使用该策略。
您还可以按照@therealprashant 在评论中的建议,通过指定 "Principal":"*" 来编辑此策略以允许匿名访问,请参阅 the docs 了解更多信息。
但您还需要设置您的 CORS 配置。
打开 S3 console,单击您的存储桶,显示其属性(右侧面板)并单击权限,您将能够编辑配置。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://*.example.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>http://example.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
根据需要添加尽可能多的 CORSRule,尤其是当您还需要 https 时。
希望对您有所帮助。
编辑
这是我现在实际使用的修改版本。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:DeleteObject",
"s3:GetObjectVersion"
],
"Resource": [
"arn:aws:s3:::mybucket/*",
"arn:aws:s3:::mybucket"
]
}
]
}
注意:在附加到 IAM 用户、组或角色的 IAM 策略中,可以省略 "principal"(就像我在这里所做的那样)。在授权期间,"principal" 被评估为策略附加到的实体。
我对这一切还很陌生,但已经能够让 avatar/image 上传器在我的 Rails 应用程序中工作。用户可以将新头像上传到我的 S3 存储桶,该头像会显示在 Web 应用程序中。
为此,我不得不向用户授予 "AmazonS3FullAccess" 政策。这似乎有点太多了,因为应用程序的用户只需要写入(上传他的头像)和读取(在网页上显示头像)权限。
您是否同意编写自定义策略比使用 AmazonS3FullAccess 更好? 如果是这样,我已经尝试了下面的策略代码(取自 here),但这不起作用(尝试上传头像图像时出现 403 禁止错误)。关于如何更正此代码的任何建议?
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::mybucket"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::mybucket/*"]
}
]
}
我已经长出白发试图弄清楚正确的配置。这是一个对我有用的:
{
"Statement": [
{
"Sid": "AllowPublicRead",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:DeleteObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::mybucket/*",
"arn:aws:s3:::mybucket"
]
}
]
}
此策略应附加到适当的实体 ("Attached entity tab"),该实体可以是专门的用户。如果您需要 API/Access 密钥,请前往该用户的 "Security Credentials" 选项卡并生成一些。这使您可以更好地控制谁在使用该策略。
您还可以按照@therealprashant 在评论中的建议,通过指定 "Principal":"*" 来编辑此策略以允许匿名访问,请参阅 the docs 了解更多信息。
但您还需要设置您的 CORS 配置。 打开 S3 console,单击您的存储桶,显示其属性(右侧面板)并单击权限,您将能够编辑配置。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://*.example.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>http://example.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
根据需要添加尽可能多的 CORSRule,尤其是当您还需要 https 时。
希望对您有所帮助。
编辑
这是我现在实际使用的修改版本。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:DeleteObject",
"s3:GetObjectVersion"
],
"Resource": [
"arn:aws:s3:::mybucket/*",
"arn:aws:s3:::mybucket"
]
}
]
}
注意:在附加到 IAM 用户、组或角色的 IAM 策略中,可以省略 "principal"(就像我在这里所做的那样)。在授权期间,"principal" 被评估为策略附加到的实体。