最近研究了一下怎麽用REST API的方法執行S3相關存取物件的操作,發現要API來Call S3 相關存取操作的話,在API標頭需要放入 Authorization 標頭,因為AWS需要藉由Authorization的資訊確定來存取S3 Service的API Caller是合法的AWS User,但要手刻API並在裡面加入Authorization的表頭實在不容易,也寫code去計算Authorization的結果跟Signature,所以如果只是想純粹用api 方式去存取S3 Service的話,還有另一種透過AWS CLI的s3api command來取代REST API 呼叫,效果幾乎一模一樣。
下圖是一般API 呼叫s3 service的Request Sample:
下圖是要寫code來計算Authorization的演算法:
由上可知要寫code實作Authorization的演算法還是有一點功夫要費,所以我們可以用這裡要使用的另一種快速而簡單的方法: aws s3api command 來執行S3 Service API 呼叫。
AWS 提供AWS CLI 工具讓使用者可以透過本機端的Command Line來執行AWS 相關作業,這樣就可以不用在AWS Console 執行AWS的工作,同時也可以透過Shell Script方式來執行AWS的自動化作業。
S3api 便是AWS CLI的指令集合之一,可以用API方式來調用S3 Service存取S3 的bucket/object 資源,算是非常方便的指令。
所以要執行S3api 那就要先安裝AWS CLI,一般windows常見的方式有pip install 跟msi installer ,安裝包可以自AWS官網下載,安裝過程只要下一步一直做就好,這邊就不做介紹,在安裝好AWS CLI 之後,下一步就是打開Command Line 執行aws configuration的設定。
設定 aws configuration,是要指定操作aws CLI指令的身分,該身分必須是AWS的合法註冊用戶,所以你必須先要有AWS Account才能使用 aws s3api指令。這邊也略過AWS Account 註冊過程,請自行前往AWS 註冊Account。
在註冊完AWS Account之後,就可以從AWS IAM Console取得用戶account的 AccessKeyID 和 SecretKey,這兩個參數代表AWS User身分,必須 configure 到AWS CLI 中。
首先,執行以下指令: $aws configure , 然後依要求輸入底下資訊:
- AWS Access Key ID : 你的AccesskeyID
- AWS Secret Access Key : 你的 Secretkey 密鑰
- Default Region Name : 你的default account region, ex. us-east-1
- Default Output Format : json( 空值亦可)
設定完成後,你下的s3api 指令都會以你的accesskeyid 所代表的aws authenticated account 身分來執行,所以你無法存取到不屬於該 Account 所能存取的s3 bucket或object。
例如我存取一個scd2018-test/payload.txt 檔案,就會AccessDenied,因為改object未開放給owner 以外的人存取:
$aws s3api get-object –bucket scd2018-test –key payload.txt payload.txt
- Get-object : 呼叫要get object資源的 Method
- --bucket : 目標bucket
- --key : object 名稱
- 最後是Destination : 檔案要下載到本地的payload.txt檔
底下我先嘗試列出自己的bucket 有沒有object可以給我存取, 發現有一張WP_20170530_001.jpg 檔可以存取:
$aws s3api list-objects-v2 –bucket terryliu-demo
於是我下載回來變成demo.jpg檔:
$aws s3api get-object –bucket terryliu-demo --key WP_20170530_001.jpg demo.jpg
這樣就下載成功了。
aws s3api command 是一個很強大的工具,可以針對全世界的s3 bucket/object 進行操作,也提供修改他們的permission/acl的方法,因此如果駭客知道某一特定bucket/object可以被aws authenticated user存取,他就可以透過s3api 或 一般REST API方式來存取AWS S3上別人的敏感或重要資源,因此s3 bucket/object的permission 跟acl 控管相當重要,一不小心就有可能被駭客用s3api工具竊取,不可不慎。