數據安全性是云存儲服務的重中之重。云存儲的安全機制主要需要考慮以下幾個因素:
- 如何判斷該請求方是否合法,且對目標空間有相應的訪問權限。
- 因為服務的訪問協(xié)議同時支持HTTP和HTTPS,服務端需要判斷收到的請求是否經過篡改。
- 相比上傳新資源,覆蓋文件或刪除已有資源擁有更高的風險。因此對上傳或修改動作,需要確認請求方是否擁有修改或刪除的權限。
在使用七牛云存儲服務的過程中,需要考慮安全機制的場景主要有如下幾種:
- 上傳資源
- 訪問資源
- 管理和修改資源
這三個場景需要考慮不同的安全因素,因此七牛針對性的提供了三種安全機制:上傳憑證、下載憑證和管理憑證。
因為憑證的生成需要用到SecretKey,因此該生成動作不應在不受信任的環(huán)境中進行。需要注意的是,開發(fā)者絕不能將密鑰包含在分發(fā)給最終用戶的程序中,無論是包含在配置文件中還是二進制文件中都會帶來非常大的密鑰泄漏風險。
推薦的模型如下所示:
密鑰(AccessKey/SecretKey)
密鑰用于以上幾種憑證的生成。以SecretKey為參數,配合適當的簽名算法,可以得到原始信息的數字簽名,防止內容在傳遞過程中被偽造或篡改。
密鑰通常為成對創(chuàng)建和使用,包含一個AccessKey和一個SecretKey。其中AccessKey會在傳輸中包含,而用戶必須保管好SecretKey不在網絡上傳輸以防止被竊取。若SecretKey被惡意第三方竊取,可能導致非常嚴重的數據泄漏風險。因此,如發(fā)現SecretKey被非法使用,管理員應第一時間在管理平臺上更換密鑰。
在具體描述各種憑證的詳細生成過程中我們會看到AccessKey和SecretKey是如何被使用的。
上傳憑證(UploadToken)
客戶端上傳前需要先獲取從服務端頒發(fā)的上傳憑證,并在上傳資源時將上傳憑證包含為請求內容的一部分。不帶憑證或帶非法憑證的請求將返回HTTP錯誤碼401,代表認證失敗。
生成上傳憑證時需要指定以下要素:
- 權限,指定上傳的目標空間或允許覆蓋的指定資源。
- 憑證有效期即一個符合Unix時間戳規(guī)范的數值,單位為秒。Tip因為時間戳的創(chuàng)建和驗證在不同的服務端進行(在業(yè)務服務器創(chuàng)建,在云存儲服務器驗證),因此開發(fā)者的業(yè)務服務器需要盡可能校準時間,否則可能出現憑證剛創(chuàng)建就過期等各種奇怪的問題。
- 可選擇設置的最終用戶標識ID。這是為了讓業(yè)務服務器在收到結果回調時能夠識別產生該請求的最終用戶信息。
- 可選擇設置的響應類型。
我們使用一個上傳策略(PutPolicy)來保存和傳遞這些設置。關于上傳策略和上傳憑證的生成細節(jié),請查看上傳憑證。關于上傳憑證的具體使用方法,請參見上傳過程。
下載憑證(DownloadToken)
下載私有資源的請求需要帶一個合法的下載憑證。不帶憑證或帶非法憑證的請求將返回HTTP錯誤碼401,代表認證失敗。
與上傳憑證相比,下載憑證的作用比較簡單:
- 保證請求發(fā)起者擁有對目標空間的訪問權限。
- 保證服務端收到的下載請求內容未經中途篡改,具體包括目標資源的URI和該訪問請求的有效期信息均應未受到篡改。
關于下載憑證的生成細節(jié),請查看下載憑證。關于下載憑證的具體使用方法,請參見私有資源下載。
防盜鏈
下載還有一種常見的場景,即公開資源的防盜鏈,比如禁止特定來源域名的訪問,禁止非瀏覽器發(fā)起的訪問等。
我們可以通過HTTP協(xié)議支持的Referer機制(參見HTTP Referer)來進行相應的來源識別和管理。
防盜鏈是一個系統(tǒng)設置,不影響開發(fā)工作。如發(fā)現有盜鏈情況,開發(fā)者可在開發(fā)者平臺的空間設置頁面進行相應的設置。
管理憑證(AccessToken)
在管理現有資源時(如查看資源元數據、刪除或移動資源等)通常需要帶一個合法的管理憑證。不帶憑證或帶非法憑證的管理請求將返回HTTP錯誤碼401,代表認證失敗。
管理憑證的作用與下載憑證比較類似:
- 保證請求發(fā)起者擁有對目標空間的管理權限。
- 保證服務端收到的管理請求內容未經中途篡改,具體包括代表管理動作的URI和該管理動作的參數信息均應未受到篡改。
關于管理憑證的生成細節(jié),請查看管理憑證。關于管理憑證的具體使用方法,請參見資源管理安全機制。
跨域訪問
出于安全的考慮,Web 瀏覽器從很早之前就定下“同域安全策略”的標準,默認情況下同一域名下的頁面只能向同域(包括 CNAME 域名、端口)下的 URL 發(fā)送所有類型的 HTTP 請求。而向不同域的地址發(fā)送非 GET 請求時,默認情況下只能返回同域安全策略錯誤。
對此,在發(fā)起上傳或下載請求的時候,七牛的服務會返回相應的支持跨域的 Header:
上傳(upload.qiniu.com
)
Access-Control-Allow-Headers: X-File-Name, X-File-Type, X-File-Size
Access-Control-Allow-Methods: OPTIONS, HEAD, POST
Access-Control-Allow-Origin: *
下載(.qiniudn.com
)
Access-Control-Allow-Origin: *