当前位置: 首页 > Web前端 > HTML

国内没有最强权限管理,不接受反驳!

时间:2023-03-29 12:31:19 HTML

介绍在使用COS的过程中,你一定遇到过这些问题:如何限制用户访问ip?如何限制上传文件大小?如何只允许使用https协议的请求?如何只允许列出指定目录下的对象?以上所有的问题,都可以用一把最强的武器来彻底解决!PolicyCondition——在设置权限策略时指定有效条件,限制用户请求仅在指定条件下通过。COS目前支持11个条件键,是目前国内支持条件键数量最多的对象存储产品。未来我们将持续加入对更多条件键的支持,打造国内最强大的权限管理。背景知识:什么是保单条件?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所在的网段,则条件判断为真。{"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个条件键是什么?目前国内云厂商普遍支持通过PolicyCondition对ip和vpc进行限制。COS此次发布的条件键的亮点在于,条件键的支持范围得到了扩展,包括Content-Type、Content-Length等用户多次提出限制的请求头和请求参数。下表列出了COS目前支持的所有条件键。cosconditionkeymeaningtypeqcs:ip检查请求源的ip网段IPqcs:vpc检查请求源的vpcidStringcos:secure-transport检查请求是否适用于https协议Booleancos:prefix检查请求参数前缀。例如,只允许列出桶中指定目录(前缀)下的对象。Stringcos:response-content-type检查请求参数response-content-type,用于设置响应中Content-Type头的值。Stringcos:x-cos-acl检查请求头x-cos-acl,用于设置和修改对象和桶ACL。Stringcos:x-cos-storage-class查看请求头x-cos-storage-class,用于指定存储类型或上传对象时修改对象的存储类型。Stringcos:x-cos-forbid-overwrite勾选请求头x-cos-forbid-overwrite,使用请求头x-cos-forbid-overwrite禁止上传对象时覆盖同名文件。Stringcos:versionid查看请求参数versionId,表示对象的版本号。下载对象(GetObject)或删除对象(DeleteObject)时,可以使用versionId指定要操作的对象版本。Stringcos:content-length检查请求头:Content-Length,即RFC2616中定义的HTTP请求内容长度(字节)Numericcos:content-type检查请求头:Content-Type,即HTTP请求内容类型(MIME)在RFC2616中定义。字符串实践:PolicyCondition最佳实践!PolicyCondition的使用非常灵活,条件运算符、条件键、条件值的不同组合往往会有不同的使用效果。这里我们选取了cos:secure-transport,cos:content-type,cos:content-length和cos:versionid四个conditionkeys作为例子,向大家展示了conditionkeys的最佳实践。更多最佳实践请参考COS官网文档:https://cloud.tencent.com/doc...备注:qcs:ip,vpc:requester_vpc,cos:content-type条件键全区域支持,等条件Key仅支持成都、广州、上海、雅加达、圣保罗、弗吉尼亚、东京、首尔,其他地区陆续支持。只允许使用https协议的请求通过(cos:secure-transport)条件键cos:secure-transport可以使用条件键cos:secure-transport限制请求使用https协议。示例一:下载请求需要使用https协议。假设主账户(uin:100000000001)拥有存储桶examplebucket-1250000000。下面bucketpolicy的意思是只授权子用户(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测试添加上述bucket策略后,通过curl测试下载对象测试:只有通过https协议请求才会返回200OK;http协议请求会返回403Forbiddencurl-XGET-v-H"Host:examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com"-H"Authorization:Hereisthesignature""https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test"imagecurl-XGET-v-H"主机:examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com"-H"授权:这里是签名""http://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test"图片限制上传文件类型(cos:content-type)背景知识:请求头Content-TypeRFC2616中定义的HTTP请求内容类型(MIME),如application/xml或image/jpegconditionkeycos:content-type使用conditionkeycos:content-type修改请求Content-限制Typeheader示例2:限制上传对象(PutObject)的Content-Type为"image/jpeg"假设主账户(uin:100000000001)拥有桶examplebucket-1250000000,可以通过通过cos:content-lengthconditionkey限制子用户(uin:100000000002)上传请求的Content-Length头的具体内容下面bucketpolicy的意思是:限制使用PutObject上传对象必须携带Content-Type头,Content-Type的值为“image/jpeg”。我需要注意的是,string_equal要求请求中必须携带Content-Type头,Content-Type的值必须与指定值完全一致。在实际请求中,需要显式指定请求的Content-Type头。否则,当你的请求没有携带Content-Type头时,请求会失败;另外,当你使用某些工具发起请求时没有指定Content-Type,该工具可能会自动为你添加一个意想不到的header。Content-Type标头也可能导致请求失败。注意:string_equal和strin_equal_if_exist的区别:条件运算符是否包含_if_exist的区别在于没有条件键对应的请求头/请求参数时如何处理请求。Without_if_exist的条件运算符,比如string_equal,当请求没有对应的请求头/参数时,默认命中条件为False。条件运算符包括_if_exist,比如string_equal_if_exist,当请求没有对应的请求头/参数时,默认命中条件为True。{"声明":[{"主体":{"qcs":["qcs::cam::uin/100000000001:uin/100000000002"]},"效果":"允许","动作":["名称/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测试添加上述bucketpolicy后,使用PutObject上传对象时,Content-Type标头必须是“image/jpeg”;正确的请求会返回200OK,没有Content-Typeheader或header值不是image/jpeg的请求会返回403Forbiddencurl-XPUT-v-H"Host:examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com"-H"Content-Type:image/jpeg"-H"Authorization:Hereisthesignature""http://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test2.jpeg"-T./test2.jpegimagecurl-XPUT-v-H"Host:examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com"-H"Authorization:Hereisthesignature""http://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test2.jpeg"-T./test2.jpeg图片限制上传文件大小(cos:content-length)请求头Content-LengthRFC2616定义的HTTP请求内容长度(字节)。当PUT和POST请求中经常使用条件键cos:content-length上传object时,可以使用条件键cos:content-length限制请求头Content-Length,从而限制上传Object文件大小,所以可以更灵活的管理存储空间,避免上传过大或过小的文件浪费存储空间和网络带宽。在下面两个例子中,假设主账户(uin:100000000001)拥有存储桶examplebucket-1250000000,子用户(uin:100000000002)可以使用cos:content-length条件键来限制Content-的大小上传请求的长度头。示例3:限制请求头Content-Length的最大值限制PutObject和PostObject上传请求必须携带Content-Length头,且该头的值不能大于100。{"语句":[{"动作":["name/cos:PutObject","name/cos:PostObject"],"条件":{"numeric_less_than_equal":{"cos:content-length":100}},"Effect":"Allow","Principal":{"qcs":[“qcs::cam::uin/100000000001:uin/100000000002”]},“Resource”:[“qcs::cos:ap-广州: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,请求通过,返回200OK。curl-XPUT-v-H"Host:examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com"-H"Authorization:Hereisthesignature""http://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test"-T./test3test4的文件大小为145字节。它是通过curl命令上传的。Content-Length为145,请求被拒绝,返回403Forbidden。curl-XPUT-v-H"Host:examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com"-H"Authorization:Hereisthesignature""http://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test"-T./test4图片只允许用户获取指定版本号的对象。请求参数versionId请求参数versionId表示对象的版本号。下载对象(GetObject)或删除对象(DeleteObject)时,可以使用请求参数versionId指定要操作的对象版本。当没有versionId请求参数时,请求默认作用于对象的最新版本。当versionId请求参数为空字符串时,相当于没有versionId的请求参数。versionId请求参数是字符串“null”。对于未启用版本控制的桶中上传的对象,启用版本控制后,这些对象的版本号统一为字符串“null”conditionkeycos:versionidconditionkeycos:versionid用于限制请求参数versionId。示例4:只允许用户获取指定版本号的对象假设主账号(uin:100000000001)拥有存储桶examplebucket-1250000000,需要授权其子用户(uin:100000000002)只允许子用户获取获取具有指定版本号的对象。采用如下桶策略后,当子用户(uin:100000000002)发起下载对象请求时,只有携带versionid参数且versionid的值为版本号“MTg0NDUxMDQ0MzA5ODY1ODc2OTQ”,请求才会成功。{"语句":[{"动作":["name/cos:GetObject"],"条件":{"string_equal":{"cos:versionid":"MTg0NDUxMDQ0MzA5ODY1ODc2OTQ"}},"效果":"允许","Principal":{"qcs":["qcs::cam::uin/100000000001:uin/100000000002"]},"Resource":["qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*”]}],"version":"2.0"}将上述bucketpolicy添加到命令行curl测试后,只有版本号为MTg0NDUxMDQ0MzA5ODY1ODc2OTQ的下载请求会通过并返回200OK;如果版本号不是MTg0NDUxMDQ0MzA5ODY1ODc2OTQ,请求将被拒绝并返回403Forbidden。curl-XGET-v-H"Host:examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com"-H"Authorization:Hereisthesignature""http://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test?versionId=MTg0NDUxMDQ0MzA5ODY1ODc2OTQ"imagecurl-XGET-v-H"Host:examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com"-H"Authorization:hereisthesignature""http:///examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/test"图片—完—