pky*_*eck 9 amazon-s3 amazon-web-services amazon-cloudfront
我有两个帐户(acc-1和acc-2)。
acc-1托管一个 API,用于处理文件上传到一个存储桶acc-1(我们称之为upload)。上传会触发 SNS 转换图像或转码视频。将生成的文件放入acc-1( output) 中的另一个存储桶中,这将再次触发 SNS。然后我将文件(作为用户api来自acc-1)复制到他们在acc-2( content) 中的最后一个存储桶。
content 存储桶策略 acc-2
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<ACC_1_ID>:user/api"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::content/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
api 用户政策 acc-1
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::upload/*",
"arn:aws:s3:::output/*",
"arn:aws:s3:::content/*"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我使用 nodejs 的 aws-sdk 复制文件并将 ACL 设置为bucket-owner-full-control,以便用户acc-2可以访问复制的文件,content尽管api用户acc-1仍然是文件的所有者。
这一切正常 - 文件存储在存储content桶中,存储桶所有者和api用户可以访问。
content存储桶中的文件对其他人来说是私有的,应该通过 Cloudfront 发行版提供服务。
我为 Web 创建了一个新的 Cloudfront 发行版并使用了以下设置:
源域名:content
源路径:/folder1
限制桶访问:yes
源访问身份:create new identity
授予对桶的读取权限:yes, update bucket policy
这创建了一个新的 Origin Access Identity 并将存储桶策略更改为:
content 之后的存储桶策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<ACC_1_ID>:user/api"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::content/*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <OAI_ID>"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::content/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用 Cloudfront URL 时,尝试从文件夹content内的存储桶访问文件folder1不起作用:
? https://abcdef12345.cloudfront.net/test1.jpg
Run Code Online (Sandbox Code Playgroud)
这将返回 403 '访问被拒绝'。
如果我直接test2.jpg从上传文件 ( )并尝试访问它,它会起作用......!?acc-2content/folder1
? https://abcdef12345.cloudfront.net/test2.jpg
Run Code Online (Sandbox Code Playgroud)
除了拥有不同的所有者,test1.jpg并且test2.jpg看起来完全相同。
我究竟做错了什么?
不幸的是,这是预期的行为。OAI 无法访问由不同账户拥有(创建)的对象,因为bucket-owner-full-control使用了一个不寻常的“完整”定义,该定义不包括对您自己的 AWS 账户之外的委托人的存储桶策略授权——并且 OAI 的规范用户在技术上是在您的 AWS 账户之外.
如果另一个 AWS 账户将文件上传到您的存储桶,则该账户是这些文件的所有者。存储桶策略仅适用于存储桶所有者拥有的文件。这意味着,如果另一个账户将文件上传到您的存储桶,则不会针对这些文件评估您为 OAI 创建的存储桶策略。
小智 4
正如@Michael - sqlbot 在他的回答中指出的那样,这是预期的行为。
一种可能的解决方案是使用帐户中的凭据执行到最终存储桶的复制acc-2,因此对象的所有者将始终是acc-2. 至少有两种选择:
1)使用临时凭证和 AssumeRole AWS STS API:您创建一个acc-2具有足够权限的 IAM 角色来执行到存储桶的复制content(PutObject和PutObjectAcl),然后从acc-1API 中调用 AWS STS AssumeRole 以通过代入 IAM 角色来获取临时凭证,并使用这些临时访问密钥执行复制。这是最安全的方法。
2) 使用访问密钥:您可以在 中创建 IAM 用户acc-2,为其生成常规访问密钥,并将这些密钥处理到acc-1,以便acc-1使用这些“永久”凭证来执行复制。从安全角度来看,跨 AWS 账户分发访问密钥并不是一个好主意,而且 AWS 不鼓励您这样做,但这当然是可能的。此外,从可维护性的角度来看也可能是一个问题 - 因为acc-1应该以非常安全的方式存储访问密钥并且acc-2应该稍微频繁地轮换访问密钥。
| 归档时间: |
|
| 查看次数: |
3424 次 |
| 最近记录: |