我有两个帐户(ACC-1
和ACC-2
)。ACC-1
承载一个API,用于处理文件上载到ACC-1
的存储桶中(我们称之为Upload
)。上传触发SNS转换图像或转码视频。结果文件被放入ACC-1
(output
)中的另一个桶中,这将再次触发SNS。然后,我将文件(作为ACC-1
userAPI
)复制到ACC-2
(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/*"
}
]
}
ACC-1
中的API
用户策略
{
"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/*"
]
}
]
}
我使用aws-sdk for nodejs复制文件,并将ACL设置为bucket-owner-full-control
,以便ACC-2
的用户可以访问Content
中复制的文件,尽管ACC-1
的API
用户仍然是文件的所有者。
这一切都很好--文件存储在Content
桶中,桶所有者和API
用户可以访问这些文件。
来自content
bucket的文件对其他所有人都是私有的,应该通过Cloudfront发行版提供服务。
我为web创建了一个新的Cloudfront发行版,并使用了以下设置:
{
"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/*"
}
]
}
但是,当我使用Cloudfront URL时,试图从folder1
文件夹中的content
桶访问文件是不起作用的:
❌ https://abcdef12345.cloudfront.net/test1.jpg
返回403“拒绝访问”。
如果我将一个文件(test2.jpg
)从ACC-2
直接上载到content/folder1
并尝试访问它,它可以工作...!?
✅ https://abcdef12345.cloudfront.net/test2.jpg
除了拥有不同的所有者之外,test1.jpg
和test2.jpg
似乎完全相同。
我做错了什么?
正如@michael-sqlbot在回答中指出的,这是预期的行为。
一种可能的解决方案是使用ACC-2
帐户的凭据执行到最终存储桶的复制,因此对象的所有者将始终是ACC-2
。这样做至少有两种选择:
1)使用临时凭据和AssuseRole AWS STS API:在ACC-2
中创建一个IAM角色,该角色具有足够的权限执行到Content
存储桶的复制(PutObject
和PutObjectACL
),然后从ACC-1
API调用AWS STS AssuseRole,通过假设IAM角色获取临时凭据,并使用这些临时访问密钥执行复制。这是最安全的方法。
2)使用访问密钥:您可以在ACC-2
中创建IAM用户,为其生成常规访问密钥,并将这些密钥处理到ACC-1
中,因此ACC-1
使用这些“永久”凭据来执行复制。从安全角度来看,跨AWS帐户分发访问密钥不是一个好主意,AWS不鼓励您这样做,但这肯定是可能的。此外,从可维护性的角度来看,也可能是一个问题-因为ACC-1
应该以非常安全的方式存储访问密钥,而ACC-2
应该经常旋转访问密钥。
我有两个AWS账户。帐户1有一个CloudSearch域,我需要从帐户2中的Lambda函数查询该域。我遵循了一个教程,在Account1中创建一个允许跨帐户访问的角色。 因此,在帐户1中,我有一个角色,如下所示: 此角色有一个受信任的实体,即帐户2,我可以在IAM控制台中该角色的受信任实体部分下看到正确的帐户ID。 在帐户2中,我创建了一个Lambda函数,其执行角色如下所示: 我的Lambda
问题内容: 我正在尝试从数据库中获取记录。但我正面临拒绝访问的问题。我尝试了在堆栈溢出中提到的其他解决方案,例如向用户授予特权。 访问数据库的代码: 错误的堆栈跟踪: 在这种情况下可能是什么问题。我尝试创建一个新的数据库,但是也没有用。 问题答案: 问题是授予表根用户的权限。’root’@’%’没有任何权限。.就像我以前用作连接地址一样,因此它给出了拒绝访问错误.. 是IP地址的通配符。所以mys
我在PC上使用WAMP服务器2.2。在phpMyAdmin(5.5.24)中,我编辑了“root”用户(带有“localhost”主机),并给它一个密码“root”。这是一个很大的错误,我正试图挽回。现在,当我转到localhost/phpmyadmin/时,我得到了左侧的数据库菜单,但是主框架有一个错误,它是: 我尝试将用户的密码改回无密码;我尝试修改config.inc.php文件以添加新密码
问题内容: 为了在具有许多参数的表单中发布AJAX表单,我使用一种解决方案:创建一个,通过POST将表单发布到其中,然后访问的内容。具体来说,我正在访问这样的内容: 我对其进行了测试,并且效果良好。 在某些页面上,我开始出现“访问被拒绝”错误。据我所知,如果iframe是从同一域提供的,则不应发生这种情况。 我很确定它以前可以正常工作。有人知道吗? 如果我不够清楚:我要发布到 同一域 。因此,这不
问题内容: 凭据正确,数据库名称正确,MySQL用户设置正确且具有所有特权,我有“ username’@’%’和’username’@’localhost’的条目,我可以通过命令行连接到该用户正确地,以及通过mysql工作台。换句话说,除了我的Java应用程序无法连接之外,所有内容均应按其应有的方式工作并按应有的方式进行设置。 我做了3次干净的MySQL卸载和安装,没有重启,没有重启,试图以roo
问题内容: 这个问题已经在这里有了答案 : MySQL错误1045(28000):拒绝用户’bill’@’localhost’的访问(使用密码:是) (37个答案) 7个月前关闭。 因此,我创建了一个新用户 授予他所有特权: 到目前为止没有错误。然后,我尝试连接到数据库: 并得到一个错误: 我尝试了FLUSH PRIVILEGES,删除并重新创建用户-没有效果。我究竟做错了什么? 问题答案: 错误