1. 程式人生 > 其它 >國產最強許可權管理,沒有之一,不接受任何反駁!

國產最強許可權管理,沒有之一,不接受任何反駁!

引言

在使用 COS 的過程中,你一定遇到過這些問題:如何限制使用者訪問 ip ?如何限制上傳檔案大小?如何只允許使用了 https 協議的請求通過?如何只允許列出指定目錄下的物件?

以上這些問題,通通可以使用一把最強武器全面解決!

Policy Condition ——在設定許可權策略時指定生效條件,限制使用者請求只有在指定條件下才能通過。COS 目前已支援11個條件鍵,是國內目前支援條件鍵數量最多、最豐富的物件儲存產品。未來,我們還會繼續增加對更多條件鍵的支援,打造國產最強許可權管理。

背景知識:什麼是 Policy Condition(生效條件)?

COS 的各位資深使用者,對於使用訪問策略進行許可權管理應當並不陌生。一個完整的訪問策略包括幾個基本元素:委託人(Principal)、資源(Resource)、效力(Effect)、操作(Action)、生效條件(Condition)。

其中,生效條件支援您在授予許可權時指定條件,例如限制使用者訪問來源,攜帶指定的請求引數等。一個完整的生效條件包括以下幾個元素:條件鍵、條件操作符和條件值。

以下面這個儲存桶策略為例,使用者必須在 10.217.182.3/24 或者 111.21.33.72/24 網段才能呼叫雲 API 訪問 cos:PutObject。

其中,條件鍵為 qcs:ip ,表示條件判斷的內容是ip;

條件操作符為 ip_equal ,表示條件判斷的方法是判斷ip地址是否相等;

條件值為陣列["10.217.182.3/24","111.21.33.72/24"],表示條件判斷的規定值。若使用者處於陣列中任意一個 ip 所在的網段,條件判斷都為 true。

{
"version":"2.0",
"statement":[
{
"Principal":{
"qcs":[
"qcs::cam::uin/1250000000:uin/1250000001"
]
},
"Effect":"allow",
"Action":[
"name/cos:PutObject"
],
"Resource":[
"qcs::cos:ap-guangzhou:
uid/1250000000:examplebucket-1250000000/*"
],
"Condition":{
"ip_equal":{
"qcs:ip":[
"10.217.182.3/24",
"111.21.33.72/24"
]
}
}
}
]
}

重頭戲:COS 11個條件鍵包括哪些?
目前國內各家雲廠商比較常見的是通過 Policy Condition 支援對 ip、vpc 的限制。COS 本次釋出的條件鍵的亮點在於將條件鍵的支援範圍進行了擴充套件,包括Content-Type、Content-Length 等使用者多次提出希望進行限制的請求頭部和請求引數。下表列出了COS目前支援的所有條件鍵。

cos條件鍵

含義

型別

qcs:ip

檢查請求來源的ip網段

IP

qcs:vpc

檢查請求來源的vpc id

String

cos:secure-transport

檢查請求是否適用了https協議

Boolean

cos:prefix

檢查請求引數 prefix。例如,只允許列出儲存桶指定目錄(prefix)下的物件。

String

cos:response-content-type

檢查請求引數 response-content-type,該請求引數用於設定響應中Content-Type頭部的值。

String

cos:x-cos-acl

檢查請求頭部 x-cos-acl,該請求頭部用於設定、修改物件和儲存桶ACL。

String

cos:x-cos-storage-class

檢查請求頭部 x-cos-storage-class,該頭部用於在上傳物件時指定儲存型別或修改物件的儲存型別。

String

cos:x-cos-forbid-overwrite

檢查請求頭部 x-cos-forbid-overwrite,使用請求頭x-cos-forbid-overwrite可以在上傳物件時禁止覆蓋同名檔案。

String

cos:versionid

檢查請求引數 versionId,該請求引數表示物件的版本號,您可以在下載物件(GetObject)、刪除物件(DeleteObject)時使用通過versionId指定需要操作的物件版本。

String

cos:content-length

檢查請求頭部:Content-Length,該請求頭部為RFC 2616中定義的 HTTP 請求內容長度(位元組)。

Numeric

cos:content-type

檢查請求頭部:Content-Type,該請求頭部為RFC 2616中定義的 HTTP 請求內容型別(MIME)。

String

動手實踐:Policy Condition最佳實踐!
Policy Condition 的使用非常靈活,不同的條件操作符、條件鍵和條件值的組合往往有不同的使用效果。在這裡我們選取了cos:secure-transport、cos:content-type、cos:content-length和cos:versionid 四個條件鍵作為示例,為您展示條件鍵的最佳實踐。

更多最佳實踐可參考COS官網文件:https://cloud.tencent.com/document/product/436/71307
備註:qcs:ip、vpc:requester_vpc、cos:content-type條件鍵支援在所有地域使用,其餘條件鍵僅支援成都、廣州、上海、雅加達、聖保羅、弗吉尼亞、東京、首爾地域,其他地域將陸續支援。

只允許使用了https協議的請求通過(cos:secure-transport)
條件鍵 cos:secure-transport

您可以使用條件鍵 cos:secure-transport 限制請求必須使用https協議。

示例1:下載請求需要使用https協議

假設主賬號(uin:100000000001)擁有儲存桶examplebucket-1250000000,以下儲存桶策略的含義表示僅對由子使用者(uin:100000000002)使用了 https 協議的 GetObject 請求進行授權。

{
"version":"2.0",
"Statement":[
{
"Principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"Effect":"allow",
"Action":[
"name/cos:GetObject"
],
"Resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"Condition":{
"bool_equal":{
"cos:secure-transport":"true"
}
}
}
]
}
命令列curl測試

新增上面的儲存桶策略後,通過 curl 測試下載物件 test:只有通過 https 協議的請求會返回200 OK;http 協議的請求會返回403 Forbidden

curl -X GET -v -H "Host: examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com" -H "Authorization: 這裡是簽名" "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test"

圖片

curl -X GET -v -H "Host: examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com" -H "Authorization: 這裡是簽名" "http://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test"
圖片

限制上傳檔案的型別(cos:content-type)
背景知識:請求頭部Content-Type

RFC 2616中定義的 HTTP 請求內容型別(MIME),例如application/xml或image/jpeg。

條件鍵 cos:content-type

使用條件鍵 cos:content-type 可以對請求的 Content-Type 頭部進行限制。

示例2:限定上傳物件(PutObject)的 Content-Type 必須為“image/jpeg”

假設主賬號(uin:100000000001)擁有儲存桶examplebucket-1250000000,可以通過cos:content-length條件鍵限制子使用者(uin:100000000002)上傳請求的 Content-Length 頭的具體內容。

下面這個儲存桶策略的含義是:限制使用 PutObject 上傳物件必須攜帶Content-Type頭部,且Content-Type的值為“image/jpeg”。

需要注意的是,string_equal要求請求必須攜帶Content-Type頭部,且Content-Type 的值必須與規定值完全一致。在實際請求中,您需要明確指定請求的 Content-Type 頭部。否則,當您的請求不攜帶 Content-Type 頭部時,請求將會失敗;此外,當您使用某些工具發起請求,並未明確指定 Content-Type 時,工具可能會為您自動新增不符合預期的Content-Type頭部,也可能導致請求失敗。

注:string_equal和strin_equal_if_exist 的區別:

條件操作符是否包含_if_exist的區別在於請求不帶條件鍵對應的請求頭/請求引數時如何處理。

條件操作符沒有 _if_exist,如 string_equal,當請求不帶對應的請求頭/請求引數時,預設命中條件,即為 False。

條件操作符有 _if_exist,如 string_equal_if_exist,當請求不帶對應的請求頭/請求引數時,預設命中條件,即為 True 。

{
"Statement": [
{
"Principal": {
"qcs": [
“qcs::cam::uin/100000000001:uin/100000000002”
]
},
"Effect": "Allow",
"Action": [
"name/cos:PutObject"
],
"Resource": [
“qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/
],
"Condition": {
"string_equal": {
"cos:content-type": "image/jpeg"
}
}
},
{
"Principal": {
"qcs": [
“qcs::cam::uin/100000000001:uin/100000000002”
]
},
"Effect": "Deny",
"Action": [
"name/cos:PutObject"
],
"Resource": [
“qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/

],
"Condition": {
"string_not_equal_if_exist": {
"cos:content-type": "image/jpeg"
}
}
}
],
"version": "2.0"
}

命令列curl測試

新增上面的儲存桶策略後,使用 PutObject 上傳物件時,Content-Type 頭部必須為"image/jpeg";正確的請求會返回200 OK,未攜帶 Content-Type 頭部或頭部值不是 image/jpeg 都會返回403 Forbidden

curl -X PUT -v -H "Host: examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com" -H "Content-Type: image/jpeg" -H "Authorization: 這裡是簽名" "http://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test2.jpeg" -T ./test2.jpeg
圖片

curl -X PUT -v -H "Host: examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com" -H "Authorization: 這裡是簽名" "http://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test2.jpeg" -T ./test2.jpeg
圖片

限制上傳檔案的大小(cos:content-length)
請求頭部Content-Length

RFC 2616中定義的 HTTP 請求內容長度(位元組),在 PUT 和 POST 請求中經常使用。

條件鍵 cos:content-length

上傳物件時,可以通過條件鍵cos:content-length限制請求頭部Content-Length,進而限制上傳物件的檔案大小,以方便您更加靈活管理儲存空間,避免上傳過大、過小檔案浪費儲存空間與網路頻寬。

在下面兩個示例中,假設主賬號(uin:100000000001)擁有儲存桶examplebucket-1250000000,可以通過cos:content-length條件鍵限制子使用者(uin:100000000002)上傳請求的Content-Length頭的大小。

示例3: 限制請求頭部 Content-Length的最大值

限制 PutObject 和 PostObject 上傳請求必須攜帶 Content-Length 頭部,且這個頭部的值不得大於100。

{
"Statement": [
{
"Action": [
"name/cos:PutObject",
"name/cos:PostObject"
],
"Condition": {
"numeric_less_than_equal": {
"cos:content-length": 100
}
},
"Effect": "Allow",
"Principal": {
"qcs": [
“qcs::cam::uin/100000000001:uin/100000000002”
]
},
"Resource": [
“qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/
]
},
{
"Action": [
"name/cos:PutObject",
"name/cos:PostObject"
],
"Condition": {
"numeric_greater_than_if_exist": {
"cos:content-length": 100
}
},
"Effect": "Deny",
"Principal": {
"qcs": [
“qcs::cam::uin/100000000001:uin/100000000002”
]
},
"Resource": [
“qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/

]
}
],
"version": "2.0"
}

命令列curl測試

新增上面的儲存桶策略後,通過PutObject上傳物件,Content-Length 的值不可超過100。在這裡我們使用 curl 命令上傳物件到COS,curl 會自動計算檔案的大小(位元組數),新增 Content-Length 頭部上。

例如,test3 檔案大小為77位元組,通過 curl 命令上傳,Content-Length為77,請求通過,返回200 OK。

curl -X PUT -v -H "Host: examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com" -H "Authorization: 這裡是簽名" "http://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test" -T ./test3
圖片

test4檔案大小為145位元組,通過curl命令上傳,Content-Length為145,請求被拒絕,返回403 Forbidden。

curl -X PUT -v -H "Host: examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com" -H "Authorization: 這裡是簽名" "http://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test" -T ./test4
圖片

只允許使用者獲取指定版本號的物件
請求引數 versionId

請求引數 versionId 表示物件的版本號。您可以在下載物件(GetObject)、刪除物件(DeleteObject)時使用請求引數 versionId 指定需要操作的物件版本。

不帶 versionId 請求引數時,請求預設作用於物件的最新版本。

versionId 請求引數為一個空字串時,等同於不帶versionId請求引數時。

versionId 請求引數為字串"null"的情況。對於一個儲存桶在開啟版本控制之前上傳的物件,開啟版本控制後,這批物件的版本號統一是字串"null"

條件鍵 cos:versionid

條件鍵 cos:versionid 用於限制請求引數 versionId。

示例4:只允許使用者獲取指定版本號的物件

假設主賬號(uin:100000000001)擁有儲存桶examplebucket-1250000000,需要向其子使用者(uin:100000000002)進行授權,僅允許子使用者獲取指定版本號的物件。

採用以下儲存桶策略後,子使用者(uin:100000000002)發起下載物件請求時,只有在攜帶了versionid引數,且versionid的值為版本號“MTg0NDUxMDQ0MzA5ODY1ODc2OTQ”時,請求才會成功。

{
"Statement": [
{
"Action": [
"name/cos:GetObject"
],
"Condition": {
"string_equal": {
"cos:versionid": "MTg0NDUxMDQ0MzA5ODY1ODc2OTQ"
}
},
"Effect": "Allow",
"Principal": {
"qcs": [
“qcs::cam::uin/100000000001:uin/100000000002”
]
},
"Resource": [
“qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*”
]
}
],
"version": "2.0"
}

命令列curl測試

新增以上儲存桶策略後,只有攜帶版本號MTg0NDUxMDQ0MzA5ODY1ODc2OTQ的下載請求才會通過,返回200 OK;不帶版本號或者攜帶的版本號不是MTg0NDUxMDQ0MzA5ODY1ODc2OTQ,請求都會被拒絕,返回403 Forbidden。
curl -X GET -v -H "Host: examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com" -H "Authorization: 這裡是簽名" "http://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test?versionId=MTg0NDUxMDQ0MzA5ODY1ODc2OTQ"
圖片

curl -X GET -v -H "Host: examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com" -H "Authorization: 這裡是簽名 ""http://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test"
圖片

— END —