共计 8157 个字符,预计需要花费 21 分钟才能阅读完成。
引言
在应用 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/doc…
备注: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 —