当前位置: 首页 > 知识库问答 >
问题:

AWS Cloudfront发行版基于S3 bucket,跨帐户对象的访问被拒绝

罗宪
2023-03-14

我有两个帐户(ACC-1ACC-2)。
ACC-1承载一个API,用于处理文件上载到ACC-1的存储桶中(我们称之为Upload)。上传触发SNS转换图像或转码视频。结果文件被放入ACC-1(output)中的另一个桶中,这将再次触发SNS。然后,我将文件(作为ACC-1userAPI)复制到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-1API用户仍然是文件的所有者。

这一切都很好--文件存储在Content桶中,桶所有者和API用户可以访问这些文件。

来自contentbucket的文件对其他所有人都是私有的,应该通过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.jpgtest2.jpg似乎完全相同。

我做错了什么?

共有1个答案

柳英豪
2023-03-14

正如@michael-sqlbot在回答中指出的,这是预期的行为。

一种可能的解决方案是使用ACC-2帐户的凭据执行到最终存储桶的复制,因此对象的所有者将始终是ACC-2。这样做至少有两种选择:

1)使用临时凭据和AssuseRole AWS STS API:在ACC-2中创建一个IAM角色,该角色具有足够的权限执行到Content存储桶的复制(PutObjectPutObjectACL),然后从ACC-1API调用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,删除并重新创建用户-没有效果。我究竟做错了什么? 问题答案: 错误