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



我有一个应用程序,它将一些文件上传(复制(到另一个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所有,我在政策上做错了什么吗?

如果您必须将文件从帐户a复制到帐户B,那么在编写文件之前,您应该让帐户a在帐户B中扮演角色。如果出于某种原因,你不能在账户B中扮演一个角色来完成这项工作,那么你可以将访问权限设置为允许对bucket所有者进行完全控制:

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

bucket所有者可以通过以下规则强制执行此要求:

{
"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将能够在其新位置读取文件。

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

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

但是,它不会允许您这样做,除非您正在更改某些内容(如所有者、元数据、acl等(。因此,您只能从bucket所有者的角色执行此操作,而不能从原始(非bucket所有者(上传者的角色执行。

最新更新