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