跨帐户上传时如何更改S3文件所有权

Ema*_*avi 5 amazon-s3 amazon-web-services aws-sdk s3-bucket

我有一个将一些文件上传(复制)到另一个AWS账户中的S3存储桶中的应用程序,我使用来自AWS开发工具包(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
});
Run Code Online (Sandbox Code Playgroud)

假设此代码是从另一个AWS帐户运行的,AWS_ACCOUNT_A则文件上传到中的S3存储桶AWS_ACCOUNT_B情况是,当文件上传到此存储桶时,该文件的所有权仍然是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/*"
        ]
    }
]
}
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*Man 6

如果必须将文件从帐户A复制到帐户B,则在写入文件之前,应让帐户A在帐户B中担任角色。如果由于某种原因您不能在帐户B中扮演某个角色,那么可以将访问权限设置为允许对存储桶拥有者进行完全控制:

aws s3 cp --acl bucket-owner-full-control localFile s3://bucketname/path/filename
Run Code Online (Sandbox Code Playgroud)

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

{
    "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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法的一个警告是,如果您拥有一个帐户C(读取器),并且帐户B(存储桶拥有者)还授予了帐户A(写入器)将文件推送到其中的路径的读取特权,则帐户C将无法执行读取帐户A推送的文件,因为它们实际上不是帐户B拥有的。这是您面临的问题。

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

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

aws s3 cp s3://bucketname/path/filename s3://bucketname/path/filename
Run Code Online (Sandbox Code Playgroud)

但是,除非您要进行某些更改(例如所有者,元数据,acl等),否则它将不允许您执行此操作。因此,您只能从存储桶所有者的角色执行此操作,而不能从原始(非存储桶所有者)上传者的角色执行此操作。