S3跨帳戶儲存桶權限

S3跨帳戶儲存桶權限

與本文[0]中描述的類似,我工作的公司使用堡壘AWS帳戶來儲存IAM用戶和其他AWS帳戶來分隔不同的運作環境(生產、開發等)。這很重要的原因是我們有多個 AWS 帳戶,並且在某些特殊情況下這些 AWS 帳戶需要存取單一 S3 儲存桶。

使其正常運作的一種方法是設定儲存桶策略,允許特定 AWS 帳戶的 VPC 從 S3 終端節點存取儲存桶。

  1. 儲存桶策略data-warehouse

    {
        "Sid": "access-from-dev-VPCE",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::data-warehouse",
            "arn:aws:s3:::data-warehouse/*"
        ],
        "Condition": {
            "StringEquals": {
                "aws:sourceVpce": "vpce-d95b05b0"
            }
        }
    }
    
  2. 角色的角色策略EMRRole

     {
        "Sid": "AllowRoleToListBucket",
        "Effect": "Allow",
        "Action": "s3:ListBucket",
        "Resource": [
            "arn:aws:s3:::data-warehouse",
        ]
    },
    {
        "Sid": "AllowRoleToGetBucketObjects",
        "Effect": "Allow",
        "Action": [
            "s3:GetObject",
            "s3:GetObjectVersion"
        ],
        "Resource": "arn:aws:s3:::data-warehouse/*"
    }
    

不幸的是,除非我明確設定 ACL,否則這不起作用每個對象允許我存取的 AWS 帳戶的擁有者完全控制該物件。如果我不這樣做,我會得到:

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

我正在運行的實例 (EMR) 具有正確的角色:

[hadoop@ip-10-137-221-91 tmp]$  aws sts get-caller-identity
{
    "Account": "1234567890",
    "UserId": "AROAIGVIL6ZDI6SR87KXO:i-0eaf8a5ca52876835",
    "Arn": "arn:aws:sts::1234567890:assumed-role/EMRRole/i-0eaf8a5ca52876835"
}

儲存桶中物件的 ACLdata-warehouse如下所示:

aws s3api get-object-acl --bucket=data-warehouse --key=content_category/build=2017-11-23/part0000.gz.parquet
{
    "Owner": {
        "DisplayName": "aws+dev",
        "ID": "YXJzdGFyc3RhcnRzadc6frYXJzdGFyc3RhcnN0"
    },
    "Grants": [
        {
            "Grantee": {
                "Type": "CanonicalUser",
                "DisplayName": "aws+dev",
                "ID": "YXJzdGFyc3RhcnRzadc6frYXJzdGFyc3RhcnN0"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}

在上面的 ACL 中,devAWS 帳戶將能夠讀取該對象,但另一個 AWS 帳戶(例如prod)將能夠讀取該物件。不是能夠讀取該對象,直到他們被添加為“受讓人”。

我的問題:有沒有辦法從多個 AWS 帳戶向 S3 儲存桶讀取/寫入對象,而無需在每個單獨的對像上設定 ACL?

注意:我們使用spark使用s3a寫入s3。

[0]https://engineering.coinbase.com/you-need-more-than-one-aws-account-aws-bastions-and-assume-role-23946c6dfde3

答案1

雖然我還沒有找到針對每個物件設定 ACL 的方法,但有一種方法可以強制使用儲存桶策略在上傳時正確設定 ACL。此範例策略顯示如何允許 AWS 帳戶將物件上傳到您的儲存桶,並要求儲存桶擁有者被授予對所有上傳物件的完全控制權:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "AllowSourceAccount0123456789ToPutObjects",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::0123456789:root"
        },
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::data-warehouse/*"
    },
    {
        "Sid": "RequireAllUploadedObjectsToAssignFullControlToBucketOwner",
        "Effect": "Deny",
        "Principal": {
            "AWS": "*"
        },
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::data-warehouse/*",
        "Condition": {
            "StringNotEquals": {
                "s3:x-amz-acl": "bucket-owner-full-control"
            }
        }
    }
]

}

關鍵是明確拒絕,它會檢查x-amz-acl: bucket-owner-full-control標頭(Michael-sqlbot 在評論中提到),並在未設定標頭的情況下使任何上傳失敗。使用 AWS CLI 上傳檔案時,需要--acl 儲存桶擁有者完全控制要設置的標誌。

例子:

aws s3 cp example-file.txt s3://data-warehouse/example-file.txt --profile aws-profile-name --acl bucket-owner-full-control

希望 AWS 在某個時候能夠提供一種更優雅地處理 ACL 的方法。

相關內容