【问题标题】:How change S3 file ownership while cross-account uploading如何在跨账户上传时更改 S3 文件所有权
【发布时间】:2023-05-10 08:12:01
【问题描述】:

我有一个应用程序将一些文件上传(复制)到另一个 AWS 账户中的 S3 存储桶,我使用 AWS SDK (Nodejs) 中的 copyObject 命令

var params = {
      Bucket: "MyBucket_AccountB", 
      CopySource: encodeURI('/Accunt_A_Bocket/file.png'),
      Key: "file.png",
      ACL: 'bucket-owner-full-control'
     };
s3.copyObject(params, function(err, datas) {
    if (err) console.log(err, err.stack); // an error occurred
    else     console.log(datas);           // successful response
});

这段代码,从不同的 AWS 账户运行,比如说,AWS_ACCOUNT_A,并将文件上传到AWS_ACCOUNT_B 中的 S3 存储桶问题是,当它将文件上传到这个存储桶时,这些文件的所有权,仍然是AWS_ACCOUNT_A

我想知道在上传文件时如何将文件的所有权授予AWS_ACCOUNT_B。这里有人可以给我一些指导吗?

更新:

我使用了这个政策:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "Permissions",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::MY_ACCOUNT_B_ID:root"
        },
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::MYBUCKET_IN_ACCOUNT_A",
            "arn:aws:s3:::MYBUCKET_IN_ACCOUNT_A/*"
        ]
    }
]
}

但上传的文件仍归Account_A所有,我是否在政策中做错了什么?

【问题讨论】:

  • 你昨天问了同样的问题,得到了正确答案:*.com/questions/51510472/…。如果此答案不符合您的目标,请修改您的问题,使其更具体。
  • 那个问题是关于其他一些问题,由你给出的答案解决了,这是不同的,更多的是在编码部分。
  • 您的代码在哪里运行(云、桌面等)?请记住,您不授予 S3 对象的所有权。所有者由您使用的凭据确定。使用正确的 IAM 账户凭证。这意味着您必须使用账户 B 的凭证将文件复制到账户 B 的存储桶中以将所有者设置为账户 B。账户 B 的凭证将需要对账户 A 的存储桶的权限(读取权限)。
  • @John Hanley 我的代码在 EC2 中运行,但我应该如何在代码中使用假设规则?我不明白这部分
  • 在这种情况下,您不需要使用 AssumeRole。在账户 A 的 S3 存储桶中创建允许账户 B 读取对象的策略。不需要代码,只需一个存储桶策略。当您从帐户 A 复制对象时,请记住使用帐户 B 凭据。Internet 上有很多示例。这是来自 AWS 的一个:docs.aws.amazon.com/AmazonS3/latest/dev/…

标签: amazon-web-services amazon-s3 aws-sdk s3-bucket


【解决方案1】:

如果您必须将文件从账户 A 复制到账户 B,那么在写入文件之前,您应该让账户 A 在账户 B 中担任一个角色。如果由于某种原因您无法在账户 B 中担任角色来执行此操作,那么您可以设置访问权限以允许对存储桶所有者进行完全控制:

aws s3 cp --acl bucket-owner-full-control localFile s3://bucketname/path/filename

存储桶所有者可以使用以下规则强制执行此要求:

{
    "Sid": "CrossAccountWritePermissionsDenier",
    "Effect": "Deny",
    "Principal": {
        "AWS": "arn-of-account-A-pusher"
    },
    "Action": [
        "s3:PutObject"
    ],
    "Resource": [
        "arn:aws:s3:::bucketname/path/given/access/*",
        "arn:aws:s3:::bucketname/other/path/given/access/*"
    ],
    "Condition": {
        "StringNotEquals": {
            "s3:x-amz-acl": "bucket-owner-full-control"
        }
    }
}

对这种方法的一个警告是,如果您的帐户 C(读取器)也被帐户 B(存储桶所有者)授予对帐户 A(写入器)将文件推送到的路径的读取权限,那么帐户 C 将无法读取账户 A 推送的文件,因为它们实际上不属于账户 B。这是您面临的问题。

如果账户 A 在推送之前在账户 B 中承担了一个角色,那么该文件将由账户 B 拥有,因此账户 C 将能够读取它。否则,帐户 B 必须移动文件(因为帐户 B 具有完全访问权限),然后帐户 C 才能在新位置读取文件。

理论上,您可以通过将文件从存储桶所有者的角色复制到自身来更改所有权:

aws s3 cp s3://bucketname/path/filename s3://bucketname/path/filename

但是,除非您更改某些内容(例如所有者、元数据、acl 等),否则它不会让您这样做。因此,您只能从存储桶所有者的角色执行此操作,而不是从原始(非存储桶所有者)上传者的角色执行此操作。

【讨论】: