文档

MaxCompute安全白皮书

更新时间:

法律声明

阿里云提醒您在阅读或使用本文档之前请仔细阅读、充分理解本法律声明各条款的内容。如果您阅读或使用本文档,您的阅读或使用行为将被视为对本声明全部内容的认可。

  1. 您应当通过阿里云网站或阿里云提供的其他授权通道下载、获取本文档,且仅能用于自身的合法、合规的业务活动。本文档的内容视为阿里云的保密信息,您应当严格遵守保密义务。未经阿里云事先书面同意,您不得向任何第三方披露本手册内容或提供给任何第三方使用。

  2. 未经阿里云事先书面许可,任何单位、公司或个人不得擅自摘抄、翻译、复制本文档的部分或全部内容,不得以任何方式或途径进行传播和宣传。

  3. 由于产品版本升级、调整或其他原因,本文档内容有可能变更。阿里云保留在没有任何通知或者提示的情况下对本文档的内容进行修改的权利,并保留在阿里云授权渠道中不定时发布更新后的用户文档的权利。您应当实时关注用户文档的版本变更并通过阿里云授权渠道下载、获取最新版的用户文档。

  4. 本文档仅作为用户使用阿里云产品及服务的参考性指引,阿里云以产品及服务的现状有缺陷当前功能的状态提供本文档。阿里云在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但阿里云在此明确声明对本文档内容的准确性、完整性、适用性、可靠性等不作任何明示或暗示的保证。任何单位、公司或个人因为下载、使用或信赖本文档而发生任何差错或经济损失的,阿里云不承担任何法律责任。在任何情况下,阿里云均不对任何间接性、后果性、惩戒性、偶然性、特殊性或刑罚性的损害,包括用户使用或信赖本文档而遭受的利润损失,承担责任(即使阿里云已被告知该等损失的可能性)。

  5. 阿里云网站上所有内容,包括但不限于著作、产品、图片、档案、资讯、资料、网站架构、网站画面的安排、网页设计,均由阿里云和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权、商业秘密等。非经阿里云和/或其关联公司书面同意,任何人不得擅自使用、修改、复制、公开传播、改变、散布、发行或公开发表阿里云网站、产品程序或内容。此外,未经阿里云事先书面同意,任何人不得为了任何营销、广告、促销或其他目的使用、公布或复制阿里云的名称(包括但不限于单独为或以组合形式包含阿里云Aliyun万网等阿里云和/或其关联公司品牌,上述品牌的附属标志及图案或任何类似公司名称、商号、商标、产品或服务名称、域名、图案标识、标志、标识或通过特定描述使第三方能够识别阿里云和/或其关联公司。

  6. 如若发现本文档存在任何错误,请与阿里云取得直接联系。

平台安全

账号

MaxCompute产品需要使用阿里云账号进行购买和使用。注册阿里云账号,进行实名认证后可以购买MaxCompute服务,创建密钥AccessKey可以访问MaxCompute产品。MaxCompute支持您通过阿里云账号、RAM用户或RAM角色访问MaxCompute。

MaxCompute支持RAM鉴权。RAM(Resource Access Management)是阿里云提供的资源访问控制服务。通过RAM,主账号可以创建子账号,子账号从属于主账号,所有资源都属于主账号,主账号可以将所属资源的访问权限授予子账号。

认证

用户可以在阿里云控制台中自行创建AccessKey。AccessKey由AccessKey ID和AccessKey Secret组成,其中AccessKey ID是公开的,用于标识用户身份,AccessKey Secret是秘密的,用于鉴别用户身份。当用户向MaxCompute发送请求时,首先需要将发送的请求按照MaxCompute指定的格式生成签名字符串,然后使用AccessKey Secret对签名字符串进行加密以生成请求签名。

MaxCompute收到用户请求后,会根据AccessKey ID使用正确的AccessKey Secret对签名字符串生成签名,如果和请求签名一致即认为该请求是有效的。否则,MaxCompute将拒绝处理这次请求,并返回HTTP 403错误。

授权

用户对MaxCompute资源访问分为两种,即用户主账号访问和用户子账号访问。主账号是阿里云的一个账号主体,主账号下可以包含不同的子账号以便用户灵活使用。MaxCompute支持主、子账号的权限访问策略:

  • 当用户使用主账号访问时,MaxCompute会校验该账号是否为对应资源的所有者,只有对应资源的所有者才具备访问该资源的权限。

  • 当用户使用子账号访问时,此时会触发子账号授权策略。MaxCompute会校验该子账号是否被对应主账号授予了访问该资源的权限,同时也会校验该子账号对应的主账号是否具有该资源的所有者权限。

说明

上述对主账号及子账号的描述,只是针对未进行授权操作的主账号及子账号。若主账号和子账号已通过相应的授权,则均可以获得资源权限,而不是只有资源的所有者才具备访问该资源的权限。

MaxCompute目前支持通过以下授权机制来完成对子账号的访问权限控制。

  • ACL授权:ACL是一种基于对象的授权。通过ACL授权的权限数据(即访问控制列表,Access Control List)被看作是该对象的一种子资源,只有当对象存在时,才能进行ACL授权操作,当对象被删除时,通过ACL授权的权限数据会被自动删除。ACL授权支持的授权方法是采用类似SQL92定义的GRANT/REVOKE命令进行授权,通过对应的授权命令来完成对已存在的项目空间对象的授权或撤销授权。每次权限管理操作均是对效果(授权、撤销)、对象(如表、资源等)、主体(用户或角色)、操作(读、写、删除等)的组合描述,例如允许用户zinan.tang读取表table1中的数据。

  • RAM授权:MaxCompute支持通过使用阿里云的访问控制RAM(Resource Access Management)服务授权,将您云账号下MaxCompute资源的访问及管理权限授予RAM用户和RAM角色,按需为用户分配最小权限,从而降低企业的信息安全风险。

MaxCompute还支持更多的访问权限控制机制。

  • 跨项目空间的资源分享

    假设用户是项目空间的Owner或管理员(Admin角色),用户需要申请访问用户的项目空间资源。 如果申请人属于用户的项目团队,此时建议用户使用项目空间的用户授权管理功能。但是如果申请人并不属于用户的项目团队,此时用户可以使用基于Package的跨项目空间的资源分享功能。

    Package是一种跨项目空间共享数据及资源的机制,主要用于解决跨项目空间的用户授权问题。

    使用Package之后,A项目空间管理员可以对B项目空间需要使用的对象进行打包授权(即创建Package),然后许可B项目空间安装这个Package。在B项目空间管理员安装Package之后,即可自行管理Package是否需要进一步授权给自己Project下的用户。

    Package使用方法示例如下。

    • Package创建者的操作示例如下。

      --创建Package。
      create package <pkgname>;
      **说明:
      --•仅Project的Owner有权限进行该操作。
      --•目前创建的Package名称不能超过128个字符。
      
      --添加资源到Package。
      add project_object to package package_name [with privileges privileges];
      remove project_object from package package_name;
      project_object ::= table table_name |
      instance inst_name |
      function func_name |
      resource res_name
      privileges ::= action_item1, action_item2, ...
      **说明:
      --•目前支持的对象类型不包括Project类型,即不允许通过Package在其他Project中创建对象。 
      --•添加到Package中的不仅仅是对象本身,还包括相应的操作权限。当没有通过[withprivileges privileges]来指定操作权限时,默认为只读权限, 即Describe/Select。“对象及其权限”被看作一个整体,添加后不可被更新。若有需要,只能删除和重新添加。
      --赋予其它项目空间使用权限。
      allow project <prjname> to install package <pkgname> [using label <number>];
      --撤销其它项目空间使用权限。
      disallow project <prjname> to install package <pkgname>;
      
      --删除Package。
      delete package <pkgname>;
      
      --查看Package列表。
      show packages;
      
      --查看Package详细信息。
      describe package <pkgname>;
    • Package使用者的操作示例如下。

      --安装Package。
      install package <pkgname>; 
      --说明:
      --•仅Project的Owner有权限进行该操作。
      --•对于安装Package来说,要求pkgName的格式为<projectName>.<packageName>。
      --卸载Package。
      uninstall package <pkgname>; 
      --说明: 对于卸载Package来说,要求pkgName的格式为<projectName>.<packageName>。
      --查看已创建和已安装的package列表。
      show packages;
      --查看package详细信息。
      describe package <pkgname>;

      被安装的Package是独立的MaxCompute对象类型,若要访问Package里的资源(即其他项目空间分享给用户的资源),必须拥有对该Package的Read权限。若请求者无Read权限,则需向ProjectOwner或Admin申请,ProjectOwner或Admin可以通过ACL授权机制来完成授权。

      通过ACL授权允许云账号odps_test@aliyun.com访问Package里的资源。示例如下。

      use prj2;
      install package prj1.testpkg;
      grant read on package prj1.testpackage to user
      aliyun$odps_test@aliyun.com;
  • 列级别访问控制

    基于标签的安全(LabelSecurity)是项目空间级别的一种强制访问控制策略(Mandatory Access Control,MAC),它的引入可以让项目空间管理员更加灵活地控制用户对列级别敏感数据的访问。

    LabelSecurity需要将数据和访问数据的人进行安全等级划分。一般来讲,会将数据的敏感度标记分为如下四类:

    • 0级(不保密,Unclassified)。

    • 1级(秘密,Confidential)。

    • 2级(机密,Sensitive)。

    • 3级(高度机密,HighlySensitive)。

    MaxCompute也遵循这一分类方法,ProjectOwner需要定义明确的数据敏感等级和访问许可等级划分标准。默认时所有用户的访问许可等级为0级,数据安全级别默认为0级。

    LabelSecurity对敏感数据的粒度可以支持列级别,管理员可以对表的任何列设置敏感度标记Label,一张表可以由不同敏感等级的数据列构成。而对于view,也支持和表相同的设置,即管理员可以对view设置label等级。

    View的等级和它对应的基表的label等级是独立的,在view创建时,默认的等级也是0级。

    在对数据和人分别设置安全等级标记之后,LabelSecurity的默认安全策略如下:

    • No-ReadUp:不允许用户读取敏感等级高于用户等级的数据,除非显式授权。

    • Trusted-User:允许用户写任意等级的数据,新建数据默认为0级(不保密)。

    说明
    • 在一些传统的强制访问控制系统中,为了防止数据在项目空间内部的任意分发,一般还支持更多复杂的安全策略,例如:不允许用户写敏感等级不高于用户等级的数据(No-WriteDown)。 但在MaxCompute平台中,考虑到项目空间管理员对数据敏感等级的管理成本,默认安全策略并不支持No-WriteDown,如果项目空间管理员有类似需求,可以通过修改项目空间安全配置SetObjectCreatorHasGrantPermission=false以达到控制目的。

    • 如果是为了控制数据在不同项目空间之间的流动,则可以将项目空间设置为受保护状态(ProjectProtection)。设置之后,只允许用户在项目空间内访问数据,这样可以有效防止数据流出项目空间。

    项目空间中的LabelSecurity安全机制默认是关闭的,ProjectOwner需要自行开启。需要注意, LabelSecurity安全机制一旦开启,上述的默认安全策略将被强制执行。此时,当用户访问数据表时,除了必须拥有Select权限外,还必须获得读取敏感数据的相应许可等级。

  • 数据保护机制(ProjectProtection)

    同时在多个项目空间中拥有访问权限的用户,可以自由地使用任意支持跨Project的数据访问操作来转移项目空间的数据。但是,如果项目空间中的数据非常敏感,不允许流出到其他项目空间中去,此时管理员可以使用项目空间保护机制——设置ProjectProtection,明确要求项目空间中数据只能本地循环,允许写入,不能读出。

    具体设置如下。

    set projectProtection=true;
    --设置ProjectProtection规则为数据只能流入,不能流出。
    --需要注意,默认ProjectProtection不会被设置,默认值为False,即数据保护机制按需开启。
  • 开启数据保护机制后的数据流出方法

    设置TrustedProject。若当前项目空间处于受保护状态,如果将数据流出的目标空间设置为当前空间的TrustedProject,那么目标项目空间的数据流向将不会被视为触犯ProjectProtection规则。如果多个项目空间之间两两互相设置为TrustedProject,那么这些项目空间就形成了一个TrustedProject Group,数据可以在这个Project Group内流动,但禁止流出到Project Group之外。

    管理TrustedProject的命令如下

    list trustedprojects;
    -- 查看当前project中的所有TrustedProjects。 
    add trustedproject <projectname>;
    -- 在当前project中添加一个TrustedProject。 
    remove trustedproject <projectname>;
    -- 在当前project中移除一个TrustedProject。
  • 资源分享与数据保护的关系

    在MaxCompute中,基于package的资源分享机制与ProjectProtection数据保护机制是正交的,但在功能上却是相互制约的。

    MaxCompute规定:资源分享优先于数据保护。即如果一个数据对象是通过资源分享方式授予其他项目空间用户访问,那么该数据对象将不受ProjectProtection规则的限制。

    如果要防止数据从项目空间的流出,在设置ProjectProtection=true之后,还需检查如下配置:

    • 确保没有添加trustedproject。如果有设置,则需要评估可能的风险。

    • 确保没有设置exception policy。如果有设置,则需要评估可能的风险,尤其要考虑TOC2TOU数据泄露风险。

    • 确保没有使用package数据分享。如果有设置,则需要确保package中没有敏感数据。

审计

MaxCompute会针对不同用户不同日志数据进行日志审计。在MaxCompute内部,MaxCompute提供元数据仓库存储日志数据。

元数据仓库是使用MaxCompute来分析MaxCompute自己的运行状况,将MaxCompute中的各种元信息整理汇总成MaxCompute中的表,方便用户查询和统计。包括静态数据、运行记录及安全信息等内容。

  • 静态数据:是指一旦产生就不会自动消失的数据。

  • 运行记录:表示一个任务的运行过程,该记录只会出现在一个分区中。

  • 安全信息:都来自TableStore,用于保存白名单、ACL列表等。

MaxCompute完整地记录用户的各项操作行为,并通过阿里云ActionTrail服务将用户行为日志实时推送给ActionTrail。您可以在ActionTrail中查看和检索用户行为日志,同时通过ActionTrail将日志投递到日志服务项目或指定的OSS Bucket中,满足实时审计、问题回溯分析等需求。

系统安全

MaxCompute支持多租户的使用场景,通过阿里云账号认证体系(认证方式采用AccessKey对称密钥认证技术)对于用户的每一个HTTP请求都会进行签名认证,针对不同的用户操作执行完整的权限检查,用户数据被离散存储在分布式文件系统中,共享集群的计算资源。可以同时满足多用户协同、数据共享、数据保密与安全以及资源弹性的需要,做到真正的多租户资源隔离和Serverless。

基于灵活性和扩展性的考虑,MaxCompute在SQL语言中支持了用户自定义函数,即UDF的能力,方便用户对计算行为进行扩展,同时也引入了第三方引擎,比如Spark的支持。这些对平台来说是不可信代码,可能触发非预期的系统破坏,或者有恶意用户进行攻击。MaxCompute通过轻量级的安全容器(虚拟化容器)和语言级沙箱,实现了进程级别的隔离,将不可信代码运行在安全容器内部,做到高级别的安全隔离。同时主机安全防护的Agent也能实时检测到系统发生的恶意行为,进行及时发现和止血。

沙箱保护如下图所示。

网络安全

访问控制

MaxCompute目前提供的Endpoint包含经典网络、公网和VPC网络,在网络上支持按照Project级别配置基于IP白名单的访问控制。目前MaxCompute支持的具体情况如下:

  • 经典网络、VPC网络、Internet网络三网隔离,只能访问各自对应的Endpoint及IP。

  • 没有配置VPC ID及IP白名单的Project可以被三种网络请求通过的相应域名访问,没有限制。

  • 配置了VPC ID的Project只能被对应的VPC访问。

  • 配置了IP白名单的Project只能被对应的机器访问 。

  • 对于加了代理的访问请求,以最后一跳代理IP及VPC ID进行判断 。

获取需要配置的IP地址的方式如下:

  • 如果使用MaxCompute Console(odpscmd)进行项目空间数据访问,用户可以直接获取机器的IP地址。

  • 如果使用应用系统(如DataWorks或者数据集成)进行项目空间数据访问,需要配置DataWorks或者数据集成所在的部署Server机器的IP地址(应用系统会将默认的机器IP统一添加白名单)。

  • 如果使用了代理服务器或者经过了多跳代理服务器来访问MaxCompute服务实例,需要添加的IP地址为最后一跳代理服务器的IP地址。

  • 如果是ECS机器中访问MaxCompute服务,获取到的IP地址为NAT IP。

IP地址配置时,多个IP由逗号,分割,且支持三种IP格式:

  • 单独IP地址。

  • IP地址段,由-连接。

  • 带有子网掩码的IP。

--单独IP地址。
10.32.180.8,10.32.180.9,10.32.180.10
--IP地址段。  
10.32.180.8-10.32.180.12
--带子网掩码的IP地址。
10.32.180.0/23

下面将介绍Project级别IP白名单所涉及的相关配置操作。

Project的Owner通过客户端执行命令如下。

setproject odps.security.ip.whitelist=101.132.236.134,100.116.0.0/16,101.132.236.134-101.132.236.144;
说明
  • 设置IP白名单后,只有白名单列表中的IP(console或者SDK所在的出口IP)能够访问这个Project。

  • 设置IP白名单后,您需要等待五分钟后才会生效。

IP白名单清空后,MaxCompute就认为Project关闭了白名单功能。

setproject odps.security.ip.whitelist=;

影响与效果

  • IP白名单配置之前MaxCompute服务针对访问项目空间的机器IP地址没有限制。

  • IP白名单配置之后,只有满足配置规则的IP地址及IP地址段才能访问该项目空间。在原有AccessKey ID及AccessKey Secret认证基础上叠加了IP规则的检查。

网络隔离

针对运行在安全容器中的任务,可能产生互相通信的需求。基于安全的考虑,这些通信无法构建在主机网络之上,所以MaxCompute基于安全容器构造了overlay的虚拟网络。让同一个任务的所有节点运行在同一个虚拟网络中,虚拟网络中的节点通过私网IP进行通信,无法访问主机网络。而对于用户定制化的外部网络需求,比如访问公网上的一个接口或者VPC内部的其他数据服务,MaxCompute也做了任务级别的打通。用户在作业启动时声明需要访问的网络目标,在必要的权限检查后,在作业维度上实现网络的打通。image.png

通过以上技术,MaxCompute在单一的资源池上实现了网络强多租,让更多的业务形态成为可能。基于以上安全容器和虚拟网络的隔离,MaxCompute在一个多租的集群上提供了强大的UDF的实现。相对于其他平台提供的UDF,MaxCompute在UDF的能力上限制更少,允许访问本地IO和网络的功能,能够访问用户VPC内部的数据。比如湖仓一体的场景中,可以通过创建Networklink的方式打通对用户VPC的网络访问,在创建外部数据源的时候关联Networklink后,即可在MaxCompute内部通过SQL访问外部数据。任务级别的隔离,使得MaxCompute可以在单个集群内提供混合的计算形态,除了SQL和UDF的实现外,MaxCompute还支持了内部的人工智能平台 PAI和开源的Spark引擎等。

数据安全

MaxCompute提供了独立的第三方审计师针对阿里云AICPA可信服务标准中关于安全性、可用性和机密性原则符合性描述的审计。审计报告请参见SOC 3报告

备份

阿里云提供一个扁平的线性存储空间,并在内部对线性地址进行切片,一个分片称为一个Chunk。 对于每一个Chunk,都会复制出三个副本,并将这些副本按照一定的策略存放在集群中的不同节点上,保证用户数据的可靠。

在数据存储系统中,有三类角色,分别称为Master、Chunk Server和Client。MaxCompute用户的每一个写操作经过层层转换,最终会交由Client来执行,执行过程如下:

  1. Client计算出这个写操作对应的Chunk。

  2. Client向Master查询该Chunk的三份副本的存放位置。

  3. Client根据Master返回的结果,向对应的三个Chunk Server发出写请求。

  4. 如果三份副本都写成功,Client向用户返回成功;反之,Client向用户返回失败。

Master的分布策略会综合考虑集群中所有Chunk Server的磁盘使用情况、在不同交换机机架下的分布情况、电源供电情况、及机器负载情况,尽量保证一个Chunk的三个副本分布在不同机架下的不同Chunk Server上,从而有效防止由于一个Chunk Server或一个机架的故障导致的数据不可用。

当有数据节点损坏,或者某个数据节点上的部分硬盘发生故障时,集群中部分Chunk的有效副本数会小于三。一旦发生这种情况,Master就会启动复制机制,在Chunk Server之间复制数据,保证集群中所有Chunk的有效副本数达到三份。

综上所述,对MaxCompute上的数据而言,所有用户层面的操作都会同步到底层三份副本上,无论是新增、修改还是删除数据。通过这种机制,保障用户数据的可靠性和一致性。

另外,在用户进行删除操作后,释放的存储空间由飞天分布式文件系统回收,禁止任何用户访问,同时对内容进行擦除,最大限度保证用户的数据安全性。

数据加密

MaxCompute支持通过密钥管理服务KMS(Key Management Service)对数据进行加密存储,提供数据静态保护能力,满足企业监管和安全合规需求。MaxCompute支持通过默认密钥(MaxCompute Default Key)和自带密钥(BYOK)加密或解密数据。同时,MaxCompute SQL提供了加密函数和解密函数,您可以根据实际需要选择合适的函数,对指定列进行加密或解密。

传输加密

加密数据参与计算的过程中,数据以密文进行传输,在计算端完成解密操作。针对外部产品或者客户端与MaxCompute进行数据读写的场景,由HTTPS协议保障数据传输的安全性。