s3fs:AWS消息:访问被拒绝Ubuntu 11.10

s3fs:AWS消息:访问被拒绝Ubuntu 11.10,ubuntu,amazon-s3,s3fs,Ubuntu,Amazon S3,S3fs,我安装了这里描述的s3fs 然后在中创建用户bucket\u user 然后将他的accessKeyId:secretAccessKey放入/etc/passwd-s3fs中 它们是S3,我创建了一个bucket super_bucket 并制定政策: { "Version": "2008-10-17", "Statement": [ { "Sid": &quo

我安装了这里描述的s3fs

然后在中创建用户bucket\u user

然后将他的accessKeyId:secretAccessKey放入/etc/passwd-s3fs中

它们是S3,我创建了一个bucket super_bucket

并制定政策:

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AddCanned",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::234234234234:user/bucket_user"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::super_bucket/*"
        }
    ]
}
然后在我的服务器上/usr/bin/s3fs super_bucket/mnt/s3/

并收到答复:

s3fs: CURLE_HTTP_RETURNED_ERROR

s3fs: HTTP Error Code: 403

s3fs: AWS Error Code: AccessDenied

s3fs: AWS Message: Access Denied
正在使用的s3fs版本(s3fs--版本):1.61

正在使用的保险丝版本(pkg config--modversion-fuse):2.8.4

系统信息(uname-a):Linux Ubuntu-1110-oneiric-64-minimal 3.0.0-14-server#23 Ubuntu SMP周一11月21日20:49:05 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

发行版(cat/etc/issue):Ubuntu 11.10\n\l

s3fs系统日志消息(grep s3fs/var/log/syslog):空

所以我从头开始

在服务器上

nano~/.passwd-s3fs

cmd+v accessKeyId:secretAccessKey

chmod 600~/.passwd-s3fs

桶内保险单

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::super_bucket/*",
                "arn:aws:s3:::super_bucket"
            ]
        }
    ]
}
“保存”

/usr/bin/s3fs超级桶/mnt/s3/

再接


s3fs:AWS消息:访问被拒绝更新

分析 显然,在您使用的最新稳定版本1.61之前(包括该版本)存在IAM支持方面的问题,请查看详细信息,具体如下:

显然有人打电话给[] 这是确定请求的bucket之前是否存在所需的 正在尝试安装

现在,ListAllMyBucket()是一个而不是一个或,它们是
资源
语句当前唯一的目标实体,因此使用ListAllMyBucket()实际上被当前策略拒绝

解决方案 如中所述,您必须添加一个额外的策略片段,以满足您的s3fs版本相应的此要求:

"Statement": [
    {
        "Effect": "Allow",
        "Action": "s3:ListAllMyBuckets",
        "Resource": "arn:aws:s3:::*"
    }
]
或者,您可以在应用中提供的补丁后从源代码构建s3fs版本1.61,这可能解决了这个问题(不过我自己还没有测试过补丁)。很明显,更高版本可能也会包含对此的修复,请参阅

祝你好运


考虑到预期的功能(即将bucket装载为本地文件系统读/写),可能还需要访问bucket本身,而不仅仅是其中包含的对象,这些对象是单独处理的-请尝试用以下语句替换
资源
语句:

"Resource": [
    "arn:aws:s3:::super_bucket",
    "arn:aws:s3:::super_bucket/*",
]

第一个资源以bucket为目标,而后者以bucket中包含的对象为目标。

没有人说我需要在AWS IAM中设置用户策略

我可以通过指定bucket本身的
Listbuck
权限和bucket内容的
Put/get/DeleteObject
权限来实现这一点。我是通过shell脚本的方式来实现的,它试图很好地打包它。这是工作方针:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::super_bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::super_bucket/*"
            ]
        }
    ]
}
在以这种方式定义它之前,我只对bucket拥有一系列权限,而不是它的内容。虽然我能够登录到我的FTP实例,但当我尝试
put test.txt
时,我得到了一条
553无法创建文件的消息。
消息

在失败的
put
尝试期间,我在日志中看到了这一点。这是此调试命令的调试输出:

sudo /usr/local/bin/s3fs super_bucket \
-o use_cache=/tmp,iam_role="super_ftp_user",allow_other /home/super_ftp_user/ftp/files \
-o dbglevel=info -f \
-o curldbg \
-o url="https://s3-us-east-1.amazonaws.com" \
-o nonempty
输出:

[CURL DBG] * Connection #8 to host super_bucket.s3-us-east-1.amazonaws.com left intact
[INF]       curl.cpp:RequestPerform(2267): HTTP response code 200
[INF]     s3fs.cpp:create_file_object(918): [path=/test.txt][mode=100644]
[INF]       curl.cpp:PutRequest(3127): [tpath=/test.txt]
[INF]       curl.cpp:PutRequest(3145): create zero byte file object.
[INF]       curl_util.cpp:prepare_url(250): URL is https://s3-us-east-1.amazonaws.com/super_bucket/test.txt
[INF]       curl_util.cpp:prepare_url(283): URL changed is https://super_bucket.s3-us-east-1.amazonaws.com/test.txt
[INF]       curl.cpp:PutRequest(3225): uploading... [path=/test.txt][fd=-1][size=0]
[INF]       curl.cpp:insertV4Headers(2598): computing signature [PUT] [/test.txt] [] []
[INF]       curl_util.cpp:url_to_host(327): url is https://s3-us-east-1.amazonaws.com
[CURL DBG] * Found bundle for host super_bucket.s3-us-east-1.amazonaws.com: 0x7fa0d00d3c60 [can pipeline]
[CURL DBG] * Re-using existing connection! (#8) with host super_bucket.s3-us-east-1.amazonaws.com
[CURL DBG] * Connected to super_bucket.s3-us-east-1.amazonaws.com (123.456.789.012) port 443 (#8)
[CURL DBG] > PUT /test.txt HTTP/1.1
[CURL DBG] > Host: super_bucket.s3-us-east-1.amazonaws.com
[CURL DBG] > User-Agent: s3fs/1.88 (commit hash ***; OpenSSL)
[CURL DBG] > Accept: */*
[CURL DBG] > Authorization: xxxxxxx
[CURL DBG] > Content-Type: application/octet-stream
...
[CURL DBG] > Content-Length: 0
[CURL DBG] >
[CURL DBG] < HTTP/1.1 403 Forbidden
[CURL DBG] < x-amz-request-id: 1234567890
[CURL DBG] < x-amz-id-2: ******
[CURL DBG] < Content-Type: application/xml
[CURL DBG] < Transfer-Encoding: chunked
[CURL DBG] < Date: Tue, 19 Jan 2021 04:30:15 GMT
[CURL DBG] < Server: AmazonS3
[CURL DBG] * HTTP error before end of send, keep sending
[CURL DBG] <
[CURL DBG] * Connection #8 to host super_bucket.s3-us-east-1.amazonaws.com left intact
[ERR] curl.cpp:RequestPerform(2287): HTTP response code 403, returning EPERM. Body Text: <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>1234567890</RequestId><HostId>***</HostId></Error>
[INF]       cache.cpp:DelStat(578): delete stat cache entry[path=/test.txt]

如果我做这个`“Principal”:{“AWS”:“*”},`@fullpipe-yo,排除
Principal
,这样做确实是个好主意。你可能已经意识到了这一点?如果没有,您可能想签出,特别是关于
${HOME}/.passwd-s3fs
上文件系统权限的明显要求。也许您有一些我可以尝试的测试桶mount@fullpipe:请参阅我的更新答案,以进一步分析您的问题以及由此产生的可能解决方案。