2015-06-09 56 views
5

我最近創建了一個新的AWS賬戶(我們稱之爲「賬戶A」),並在該賬戶中創建了一個S3存儲桶(我們稱之爲「bucketa」),上傳foo文件。文本。繼advicefromtheinternet,我成立了我認爲是最寬鬆的水桶政策可能(應該允許任何用戶的任何類型的訪問):無法使用boto訪問公有s3存儲桶中的文件

{ 
    "Version": "2012-10-17", 
    "Id": "PolicyABCDEF123456", 
    "Statement": [ 
    { 
     "Sid": "StmtABCDEF123456", 
     "Effect": "Allow", 
     "Principal": "*", 
     "Action": "s3:*", 
     "Resource": [ 
     "arn:aws:s3:::bucketa/*", 
     "arn:aws:s3:::bucketa" 
     ] 
    } 
    ] 
} 

帳戶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 

然後我創建了一個新的AWS賬戶(我們稱之爲「賬戶B」),並遵循相同的步驟,將IAM憑證存儲在.boto文件中並運行相同的Python腳本。

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> 

爲什麼帳戶B無法儘管它非常寬容的政策鬥訪問bucketa:然而,在這種情況下,執行線print len(k.get_contents_as_string())當我得到一個403錯誤?我是否需要設置其他權限以啓用其他AWS賬戶的公共訪問權限?

注:我已經用在兩條線「bucketb」取代了同一個桶政策(「bucketa」創建從帳戶B的S3存儲bucketb排除了B帳戶中的.boto文件的罪魁禍首憑據無效);在這種情況下,我可以使用帳戶B的憑據訪問bucketb,但使用桶A的憑據時會得到相同的403錯誤。

回答

4

您允許匿名用戶訪問存儲桶的策略。但是,對於您的情況,賬戶B不是匿名用戶,而是經過身份驗證的AWS用戶,如果您希望該用戶擁有訪問權限,則需要在策略中明確授予該用戶。或者,您可以只在博託訪問它匿名:

conn = boto.connect_s3(anon=True) 

這應該做的伎倆。這可能不言而喻,但我不會像現在這樣離開那個政策。它可以讓任何人把他們想要的任何東西放入桶中。