AWS console設定不允許讀取S3 bucket內檔案物件的bucket policy。
事前要求
參考「AWS 建立S3 bucket並上傳檔案」建立一個S3 bucket s3-demo-bucket-202112151320
及上傳hello.txt
。
設定policy
在s3-demo-bucket-202112151320
點選[Permissions]標籤。
在[Bucket policy]點選[Edit]。
在編輯區貼上以下policy內容然後按最下面的[Save changes]儲存。
Policy JSON欄位說明:
Version
- 設定policy語法版本,目前皆為2012-10-17
。Statement
- 為policy的主元素,可為一或多個以陣列表示。必填。Sid
- Statement ID,代表此statement的自訂識別符,在policy中必須是唯一。選填。Effect
- 限填Allow
或Deny
,表示允許或拒絕對資源(Resoure
)的操作(Action
)請求。預設拒絕。Principle
- 向AWS資源/服務發起操作請求的帳戶、使用者、角色或應用程式。Bucket policy為resource-based policy,因此必填。Action
- 為資源(Resource
)可進行的操作,例如s3:GetObject
即為S3的Actions之一。Resource
- 套用policy statement的資源。
所以下面的policy statement解釋為:「定義一個辨識名為DenyAllGetObject
的polcy statement來拒絕所有AWS Principle對S3資源arn:aws:s3:::s3-demo-bucket-202112151320/*
的讀取檔案操作的請求。」
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyAllGetObject",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::s3-demo-bucket-202112151320/*"
}
]
}
完成以上設定後所有的AWS Principle皆不能讀取此bucket中的檔案物件。
這類附加在資源上的policy稱為resource-based policies。
AWS console測試
以管理員使用者下載或直接查看bucket中的hello.txt
時會出現以下Access Denied拒絕存取回應訊息。
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>HFDXMZ7326ZFER20</RequestId>
<HostId>jyhPT6meDHiX+QvCEqOyUW4KofawotUxxgrDYP/eKcHLR0kL9sB8jiyZG3iVlLyiGzIYny1j4DA=</HostId>
</Error>
Go AWS SDK測試
參考「Golang 從本機讀取AWS S3 bucket object檔案內容」中呼叫s3.Client.GetObject()
讀取bucket的hello.txt
則會發生403 Access Denied拒絕存取錯誤。
panic: operation error S3: GetObject, https response error StatusCode: 403, RequestID: 305X5ST9ZX1YBENR, HostID: qhKRks5EAWWRIb11XKfhnGNzY1LxtJqemgEtQfJt0M0nJmgRiFIO/z1ek8V4ezu3UBm/ZTRmpEw=, api error AccessDenied: Access Denied
注意雖然管理員使用者的AdministratorAccess
policy可存取幾乎所有資源,但AWS規定只要任一policy為explicit deny則會覆蓋其他的policy的allow。此範例S3 bucket的DenyAllGetObject
policy的deny覆蓋過管理員使用者的AdministratorAccess
的存取權,因此原本允許讀取S3 bucket物件的管理員使用者變成無法讀取。
沒有留言:
張貼留言