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