jos*_*ber 5 python amazon-s3 boto amazon-web-services
我最近创建了一个新的AWS账户(我们称之为"账户A")并在该账户中创建了一个S3桶(我们称之为"桶"),上传文件foo.txt.以下建议 从 在 互联网,我成立了我认为是最宽松的政策桶可能(应该允许任何用户的任何类型的访问):
{
"Version": "2012-10-17",
"Id": "PolicyABCDEF123456",
"Statement": [
{
"Sid": "StmtABCDEF123456",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucketa/*",
"arn:aws:s3:::bucketa"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
为帐户A创建IAM用户("身份和访问管理 - >用户 - >创建新用户"并创建一个用户"为每个用户生成一个访问密钥"后)并将该用户的凭据存储在〜/ .boto中,使用boto S3界面的简单脚本可以访问上传的文件foo.txt:
import boto
conn = boto.connect_s3()
b = conn.get_bucket("bucketa", validate=False)
k = boto.s3.key.Key(b)
k.key = "foo.txt"
print len(k.get_contents_as_string())
# 9
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个新的AWS账户(让我们称之为"账户B"),并按照相同的步骤,将IAM凭证存储在.boto文件中并运行相同的python脚本.但是在这种情况下,执行该行时会出现403错误print len(k.get_contents_as_string()):
Traceback (most recent call last):
File "access.py", line 7, in <module>
print len(k.get_contents_as_string())
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 1775, in get_contents_as_string
response_headers=response_headers)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 1643, in get_contents_to_file
response_headers=response_headers)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 1475, in get_file
query_args=None)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 1507, in _get_file_internal
override_num_retries=override_num_retries)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 343, in open
override_num_retries=override_num_retries)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 291, in open_read
self.resp.reason, body)
boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>7815726085F966F2</RequestId><HostId>EgFfldG4FoA5csuUVEKBq15gg3QQlQbPyqnyZjc2fp5DewlqDZ4F4HNjXYWQtBl5MUlSyLAOeKA=</HostId></Error>
Run Code Online (Sandbox Code Playgroud)
为什么账户B无法访问桶,尽管它非常宽松的存储桶策略?是否需要设置其他权限才能启用其他AWS账户的公共访问权限?
注意:我已经排除了帐户B的.boto文件中的无效凭据作为罪魁祸首,通过从帐户B创建具有相同存储桶策略的S3存储桶桶("bucketa"在两行中替换为"bucketb"); 在这种情况下,我可以使用帐户B的凭据访问bucketb,但在使用Bucket A的凭据时会收到相同的403错误.
您拥有的策略允许匿名用户访问存储桶。但是,如果您的帐户B不是匿名用户,则它是经过身份验证的AWS用户,并且如果您希望该用户具有访问权限,则需要在策略中显式授予它。或者,您可以在boto中匿名访问它:
conn = boto.connect_s3(anon=True)
Run Code Online (Sandbox Code Playgroud)
这应该够了吧。可能不言而喻,但我不会原样保留该政策。它将允许任何人将他们想要的任何东西倾倒到水桶中。
| 归档时间: |
|
| 查看次数: |
2308 次 |
| 最近记录: |