8

我有一个应用程序将一些文件上传(复制)到另一个 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上传到 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/*"
        ]
    }
]
}

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

4

1 回答 1

15

如果您必须将文件从账户 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 等),否则它不会让您这样做。因此,您只能从存储桶所有者的角色执行此操作,而不能从原始(非存储桶所有者)上传者的角色执行此操作。

于 2018-12-17T18:06:03.107 回答