【问题标题】:boto3 Access Denied S3 put_object with correct permissionsboto3 Access Denied S3 put_object 具有正确的权限
【发布时间】:2018-10-11 17:09:49
【问题描述】:

第一次使用boto3。

我有一个使用 ACL S3FullAccess 的用户,并使用以下代码尝试上传文件;它使用 pandas DataFrame 作为源。

        s3_client = boto3.client('s3')
        io = StringIO()
        df.to_csv(io)
        response = s3_client.put_object(
            Bucket=self.bucket,
            Body=io,
            Key=self.filename
        )

这导致了这个响应

botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

所以我检查了 boto3 是否从我的 ~/.aws/credentials 文件中获取了密钥和访问密钥,它们位于 boto3 中 client.py 的第 604 行 - request_signer=self._request_signer

所以我在这里研究了SO,貌似很多人都得加个Policy文件,所以我做了如下:

{
"Version": "2012-10-17",
"Id": "Policyxxx",
"Statement": [
    {
        "Sid": "Stmtx1",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::<12 digit id>:root"
        },
        "Action": [
            "s3:GetObject",
            "s3:PutObject"
        ],
        "Resource": "arn:aws:s3:::<my-bucket>/*"
    },
    {
        "Sid": "Stmtx6",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::<12 digit id>:root"
        },
        "Action": "s3:ListBucket",
        "Resource": "arn:aws:s3:::<my-bucket>"
    }
]
}

我仍然遇到同样的错误,所以我将它添加到我的 put_object 调用中,因为 S3 存储桶使用 AES-256 加密,我认为这只是服务器端的,但没有想法,所以值得一试。

            SSECustomerKey=os.urandom(32),
            SSECustomerAlgorithm='AES256',

接下来,我删除了与 SSE 密钥相关的那些条款,意识到 AES-256 加密是服务器端的,不应该影响我的访问。

然后我尝试生成一对新的访问密钥并改用它们,结果相同。

有人知道我接下来会看什么吗,我在数百页的 AWS 文档中遗漏了什么?

【问题讨论】:

  • 您确定您的凭据设置为与存储桶的凭据相同的区域吗?

标签: python amazon-s3 boto3


【解决方案1】:

这只是在创建用户时将他们添加到几个组的情况。管理员和 EC2MFA。我不知道这意味着什么,但假设 EC2MFA 组阻止了 API 或 CLI 访问。我假设用户和 S3 端的策略组合是足够安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 2021-05-20
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多