赞
踩
今天我们聊一聊目前几乎所有云架构下都会采购的产品服务— “对象存储COS”
随着互联网和公有云的发展,由于COS(Cloud Object Storage)提供了高容量、高可靠、低成本的存储解决方案,越来越多的企业接受对象存储,把越来越多的业务数据放到了COS上。
在数字化时代,数据逐渐成为了公司的核心资产,存储到对象存储COS上的数据安全性也越来越受到了重视,COS本身提供了一系列高安全性的防护,包括:数据加密、链路加密、权限控制、版本控制、跨地域复制等等,
腾讯云对象存储COS 详细文档:https://cloud.tencent.com/document/product/436
结合近两年互联网上出现的安全事故,我们发现COS的权限控制和管理是用户最容易造成疏漏的地方,本章将从COS的认识、权限介绍和最佳实践等方面来对COS的权限管理做分析,希望对大家理解COS的权限控制和有效管理COS的权限有所帮助。
今天内容大纲:
1. 什么是对象存储
2. 对象存储原理
3. 对象存储的相关权限
4. 权限策略判断规则
5. 权限管理最佳实践
(* 由于今天内容篇幅较长,大家可以选择关心部分阅读,或搜索阅读, 文章部分实践内容来源于腾讯COS架构师的总结分享,// 我是一个勤快的小蜜蜂 )
1. 什么是对象存储?
主流存储类型分为三种:块存储、文件存储以及对象存储
块存储主要是将裸磁盘空间整个映射给主机,按照物理卷或逻辑卷的方式存储数据。特点:速度快、保存的数据尺寸大、数据变化频率高,缺点:可扩展程度小、容量小。(其实我们日常生活中见到的硬盘,就是块存储)
文件存储,典型代表NAS。NAS是类似一个共享文件夹,用户可以通过相应的传输协议,把数据放在上面。容量相对较大,但是速度较慢。
下面说到对象存储了,大家需要知道,每天微信朋友圈或者微博,以及爆火的那些小视频app,用户上传了海量的图片或者视频,其实都在用对象存储。
对象存储,对象指的是面向对象,集合了块存储和文件存储的优点,拥有速度快、容量大等特性。并且容易搭配云计算服务,是一种新的网络存储架构。
为了更好的理解三者的差异,我们打个比方,当我们需要从目的地A出差到目的地B,我们通常有三种交通方式。1. 轿车、2. 公共汽车、3. 地铁。块存储类似于轿车,速度快,但是容量小(轿车只能乘坐几个人),并且通常是私有;文件存储类似于公共汽车,速度慢(公共汽车有站点和红绿灯需要考虑),但是容量较大(能多坐不少人),不同的人群只要在固定站点都能乘坐;对象存储类似于地铁,速度快,容量大。
2. 对象存储原理
2.1 对象数据组成结构
与块存储和文件存储管理数据的方式不同,对象存储是以对象的形式管理数据的。对象和文件最大的不同,就是在文件基础之上增加了元数据。一般情况下,对象分为三个部分:数据、元数据以及对象id。
对象的数据通常是无结构的数据,比如:图片、视频或文档等;对象的元数据则指的是对象的相关描述,比如:图片的大小、文档的拥有者等;对象id则是一个全局的唯一标识符,用来区分对象的。
2.2 对象访问方式
对象存储,访问对象的方式很方便,是通过REST接口对对象进行操作,用HTTP动词(GET、POST、PUT、DELETE等)描述操作。除此之外,还有一种访问方式,就是使用各大云商提供的客户端去操作对象。比如:Amazon的s3cmd、阿里云的osscmd/ossutil、腾讯云的coscmd等。这些客户端都是各个云商开发出来,可以以命令行的形式在操作系统中操作对象的工具,各大云商都有详细的文档说明.
正因为对象访问方式的多样性,可以直接对静态文件做上传,下载,发布任务,在云架构下几乎是百搭的存在。
2.3 对象存储优缺点
先说优点,之前大概也提了下:
可扩展性高:对象存储能够扩展数十乃至数百EB的容量,能够充分利用高密度存储;
效率高:扁平化结构,不受复杂目录系统对性能的影响;
无需迁移:对象存储是一种横向扩展系统,随着容量的增加,数据根据算法自动分布于所有的对象存储节点;
安全性高:对象存储通常凭借HTTP调用对象存储本身提供的认证密钥来提供数据访问;
访问方便:不光支持HTTP(S)协议,采用REST的API方式调用和检索数据,同样增加了NFS和SMB支持;
成本相对低:与块存储方式相比,对象存储是最具成本效益的数据存储类型,并且与云计算搭配,把对象存储的这一特性发挥的淋漓尽致。
再提缺点:
最终一致性:由于不同节点的位置不同,数据同步时可能会有一定时间的延迟或者错误;
不易做数据库:对象存储比较适合存储那些变动不大甚至不变的文件,而对于像数据库这种需要直接与存储裸盘相互映射的应用,还是块存储更合适。
首先我们先从逻辑上介绍下COS权限的分类,并对每一分类详细分析。
分为公共权限和用户权限两类:
公共权限是COS最基本的权限配置,它包括:继承权限、私有读写、公有读私有写和公有读写。它支持的配置对象和说明如下:
这里着重对Bucket(桶)支持的公有权限做下说明:
私有读写:默认创建Bucket的权限,这个是比较安全的权限配置,也是我们推荐的!
公有读私有写:若你需要公开Bucket里的数据,可以这样配置,允许任何用户不携带签名来读取Bucket里的Object。
公有读写:这个是最不安全的权限配置了,相当于你把修改数据的权限都暴露了,请谨慎配置!
COS里对存储桶的公共权限配置,在存储桶的权限管理
页面,参考下图:
用户权限,这里指的是ACL,全称:Access Control List,即权限控制列表,它是一种比较传统的权限管理方式。
与常见的Linux的ACL有所不同,对象存储的ACL有自己的控制粒度和权限集合。COS支持向每个存储桶和对象都设置关联的 ACL,支持向其他主账号、子账号和用户组,授予基本的读、写权限。
ACL 支持的 控制粒度 分类如下:
存储桶(Bucket)
对象键前缀(Prefix)
对象(Object)
ACL 支持的 权限操作组 介绍如下:
另外ACL 的管理权限还有以下限制:
仅支持对腾讯云的账户赋予权限
仅支持读对象、写对象、读 ACL、写 ACL 和全部权限等五个操作组
不支持赋予生效条件
不支持显式拒绝效力
所以通过ACL,我们可以方便的授予其他用户访问存储桶或对象的权限,比如:
与其他主账号的数据共享
示例:允许另一个主账号对某个存储桶的读取权限:
示例:授予一个子账号对某个存储桶的数据读写权限:
Get Bucket ACL:https://cloud.tencent.com/document/product/436/7733
Put Bucket ACL:https://cloud.tencent.com/document/product/436/7737
Get Object ACL:https://cloud.tencent.com/document/product/436/7744
Put Object ACL:https://cloud.tencent.com/document/product/436/7748
相比简单的COS访问权限配置,COS还支持配置较为复杂的Bucket粒度的Policy权限。
Bucket Policy权限使用 JSON 语言描述,支持向匿名身份或腾讯云任何CAM账户授予对存储桶、存储桶操作、对象或对象操作的权限。Bucket Policy权限可以用于管理该存储桶内的几乎所有操作,推荐你使用存储桶策略来管理通过 ACL 无法表述的访问策略。
Bucket Policy权限的配置界面如下:
效力:允许/禁止
用户:单击添加用户,用户类型包括:所有用户/根账号/子账号/云服务
资源:根据需要选择,默认为整个存储桶,也可指定资源
资源路径:仅指定资源时需要填写,根据需要填写,仅支持使用*做前缀匹配
操作:单击添加操作,选择所有操作,如仅需授权部分操作,也可以选择一个或多个实际需要的操作
条件:根据需要填写,如不需要可留空。当前条件名支持:IP 和 VPC ID
注意:上述用户配置中的 所有用户,一般是针对匿名用户的意思。
配置允许所有用户访问,则匿名的请求会被允许访问;
配置拒绝所有用户访问,则匿名的请求会被拒绝,携带签名的请求会以基于身份的策略进行鉴权;
当然我们可以通过API来操作和管理Bucket Policy权限,相关API文档如下:
Get Bucket Policy:https://cloud.tencent.com/document/product/436/8276
Put Bucket Policy:https://cloud.tencent.com/document/product/436/8282
Delete Bucket Policy:https://cloud.tencent.com/document/product/436/8285
更多COS Bucket Policy配置请参考:
https://cloud.tencent.com/document/product/436/12514
访问管理(Cloud Access Management,CAM)是腾讯云提供的一套 Web 服务,用于帮助客户安全地管理腾讯云账户的访问权限,资源管理和使用权限。通过 CAM,你可以创建、管理和销毁用户(组),并通过身份管理和策略管理控制哪些人可以使用哪些腾讯云资源。
参考文档:https://cloud.tencent.com/document/product/598
COS作为腾讯云的一种资源,可以通过CAM策略来管理用户、用户组对COS资源的访问权限,使得不同团队或人员能够相互协作。
首先,我们需要先了解几个关键概念:主账号、子账号和用户组。
主账号:
用户申请腾讯云账号时,系统会创建一个用于登录腾讯云服务的主账号身份
主账号默认拥有其名下所拥有的资源的完全访问权限
子账号:
子账号是由主账号创建的实体,有确定的身份 ID 和身份凭证,拥有登录腾讯云控制台的权限
子账号默认不拥有资源,必须由所属主账号进行授权
用户组:
多个相同职能的用户(子账号)的集合
可以根据业务需求创建不同的用户组,为用户组关联适当的策略,以分配不同权限
赋予子账号或用户组访问COS资源的权限,可以通过下面两种方式:
1)COS预设策略
COS提供了很多种COS资源的预设策略,可以满足你大部分的需求,这些预设策略仅仅是从COS的操作权限的粒度来做区分,比如:QcloudCOSFullAccess、QcloudCOSDataFullControl、QcloudCOSListOnly等。
可参考:https://cloud.tencent.com/document/product/598/10602
2)自定义策略
顾名思义,自定义策略就是你来根据策略语法,制定自己的规则,这个的灵活性很大,功能性也最丰富。在实践中,客户针对不同Bucket,或不同前缀的访问控制,都可以通过自定义策略来实现。
可参考:https://cloud.tencent.com/document/product/598/37739
所以基于CAM,我们可以完成更复杂的权限管理,结合用户组、子账号、COS预设策略和自定义策略,可以更灵活、更精细的来管理用户访问的COS权限,这也是我们推荐客户使用的!
CAM下配置COS相关案例请参考:
https://cloud.tencent.com/document/product/598/11068
角色(Role) 是腾讯云访问管理(Cloud Access Management,CAM)提供的拥有一组权限的虚拟身份,主要用于对角色载体授予腾讯云中服务、操作和资源的访问权限,这些权限附加到角色后,通过将角色赋予腾讯云的服务,允许服务代替用户完成对授权资源的操作。
目前腾讯云支持的 角色载体 类型为:
腾讯云账号
支持角色的腾讯云服务
从上面的描述可以看出,角色主要是用在以下两种场景:
1)授权资源访问权限给其他腾讯云主账号,而又不期望把永久访问密钥直接给对方,可以配置角色的载体为腾讯云主账号,绑定相关权限策略;
比如你期望把COS所有Buckets的只读权限授权给另一个腾讯云主账号:100000xxxx,则可以通过创建下面的角色来实现:
角色载体:腾讯云主账号100000xxxx;
角色策略:仅仅指定QcloudCOSDataReadOnly;
2)授权其他腾讯云服务访问指定资源的权限;
比如你期望通过云函数(SCF)来对COS Bucket上传对象做进一步处理,就需要SCF有创建COS触发器,拉取代码包等的权限,这时候你就可以通过创建下面的角色来实现:
角色载体:腾讯云的SCF服务;
角色策略:包含创建COS触发器,拉取代码包等的权限;
上面章节中我们提到,COS的相关权限有很多种:访问权限、Policy权限、CAM策略等,那用户的访问请求发到COS端,是按照什么规则来检查权限的呢?
首先介绍下要对访问用户分为两类:
匿名用户:不带签名的访问
认证用户:携带签名的用户,解析出对应的账号信息
而认证用户的访问策略又分如下两类:
用户组策略
用户策略
另外,COS自身的访问策略也分为两类:
存储桶和对象的ACL
存储桶的Policy
基于上面用户、访问策略和COS自身策略的分类,从流程上来看,COS端收到用户请求后的权限判断如下:
1、主账号默认有账号下所有bucket的访问权限;
2、默认所有匿名用户访问都被拒绝;
3、显式拒绝的优先级最大;
4、生效权限范围为基于身份策略和基于资源策略的并集;
权限策略详细流程请参考:https://cloud.tencent.com/document/product/436/41516
从以权限内容介绍来看,COS的权限管理这块还是非常复杂的。而很多管理员为了方便,相信会有直接配置COSFullAccess策略的冲动 -_-||,这个还请慎重,它会给你带来很大的安全隐患!
下面从管理的便捷性和数据的安全性出发,我们推荐一些COS权限的最佳实践原则。
如之前描述,CAM支持子账号和分组,那在实际使用中,为了管理的方便,我们可以根据组织规则来创建出对应的用户组和子账号,然后再做权限分配。
这里的原则是:
先创建用户组,并关联适当的COS权限
再创建子用户,把子用户添加到用户组里
比如我们期望某员工有对COS所有资源的读写权限,则可以操作如下:
创建用户组:cos-buckets-read-write-group1,然后给其关联上COS资源的read和write权限:QcloudCOSDataReadOnly和QcloudCOSDataWriteOnly;
创建子用户:cos-subuser1,并把它添加到用户组cos-buckets-read-write-group1;
把子用户的SecretId和SecretKey授予具体使用的员工;
最小权限原则是COS权限安全的最重要策略,就是针对用户的需求,授予他最小访问资源的访问权限。
把握最小权限原则,可以从下面几个方面考虑:
指定用户:针对每个子用户授予权限
指定bucket:不要随便赋予所有bucket的访问权限
指定bucket里objects的前缀:能明确只有固定资源,就通过前缀规则限制
指定操作:明确对bucket/object的操作集合,比如:GetBucket、HeadBucket、GetObject等
指定条件:明确策略生效的约束条件,比如IP地址、VPCID等
详细的原则和示例,可参考:https://cloud.tencent.com/document/product/436/38618
客户端使用 COS 时,通过固定密钥计算签名方式不能有效地控制权限,同时把永久密钥放到客户端代码中有极大的泄露风险。如若通过临时密钥方式,则可以方便、有效地解决权限控制问题。
例如,在客户端申请临时密钥过程中,可以通过设置权限策略policy字段,限制操作和资源范围,将权限限制在指定的范围内。
使用临时密钥访问COS资源的整体架构图如下:
上述架构图中各个组件的功能如下:
1、用户客户端:用户服务的客户端;
向用户服务器发送申请临时密钥请求
根据获取的临时密钥,携带签名访问COS对象存储
2、用户服务端:提供临时密钥服务;
配置永久密钥,向CAM权限系统申请临时密钥
向客户端提供临时密钥API
3、CAM权限系统:腾讯云的CAM服务;
响应用户服务端的临时密钥请求
与COS对象存储同步临时密钥
4、COS对象存储
支持临时密钥签名的访问
参考文档:https://cloud.tencent.com/document/product/436/14048
Ending
COS 目前成为企业云架构的必选产品,也请运维人员认真通过以上内容,进一步的保证企业数据上云后的权限安全工作。
当然由于篇幅问题,COS的一些应用架构实践也值得大家关注和学习,后期寒冰也会补充篇幅做介绍的。
对啦,最后也别忘了关注“寒冰大叔”,并帮忙点一个【在看】呀~
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。