網頁

2022/5/3

AWS 設定S3 bucket policy不可讀取檔案物件

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 - 限填AllowDeny,表示允許或拒絕對資源(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物件的管理員使用者變成無法讀取。


沒有留言:

張貼留言