本文为您介绍项目空间的数据保护机制以及开启数据保护机制后数据的流出方法。

背景信息

部分公司对数据安全非常敏感,例如,不允许员工将工作带回家而只允许在公司内部进行操作、禁用公司所有电脑上的USB存储接口。这样做的目的是禁止员工将敏感数据泄漏出去。

作为MaxCompute项目空间管理员,您也会遇到不允许用户将数据转移到项目空间之外类似的安全问题 。

如下图所示,用户Alice可以同时访问Project1和Project2,则存在Alice将Project1中的敏感数据转移到Project2中去的风险。
假设Alice拥有访问myprj.table1的Select权限,同时Alice也拥有在Project2中CreateTable的权限,则Alice可以使用如下语句将Project1的数据转移到Project2。
create table prj2.table2 as select * from myprj.table1;

如果项目空间中的数据非常敏感,不允许流出到其他项目空间中去,MaxCompute提供了数据保护机制确保敏感数据的安全。

数据保护机制

同时在多个项目空间中拥有访问权限的用户,可以自由地使用任意支持跨项目空间的数据访问操作来转移项目空间的数据。如果项目空间中的数据高度敏感,则需要管理员自行设置ProjectProtection保护机制。

在项目空间中执行如下命令开启数据保护机制。
set projectProtection=true;
命令说明如下:
  • ProjectProtection默认值为false。
  • 设置ProjectProtection后,您的项目空间中的数据流向就会得到控制,数据只能流入,不能流出。
  • 跨项目空间的数据访问操作将失效,因为它们都违背了ProjectProtection规则。
  • ProjectProtection是对数据流向的控制,而不是访问控制。只有在用户能访问数据的前提下,控制数据流向才是有意义的。

开启数据保护机制后的数据流出

项目空间被设置了ProjectProtection之后,MaxCompute为您提供了两种数据流出途径:
  • 设置Exception Policy
    • 设置方法
      项目空间在设置ProjectProtection时可以附带一个Exception策略,命令如下。
      SET ProjectProtection=true WITH EXCEPTION <policyFile>

      policyFile文件示例如下。

      允许云账号Alice@aliyun.com可以通过SQL任务对表alipay.table_test执行SELECT操作时将数据流出到alipay项目空间之外。
          {
          "Version": "1",
          "Statement":
          [{
              "Effect":"Allow",
              "Principal":"ALIYUN$Alice@aliyun.com",
              "Action":["odps:Select"],
              "Resource":"acs:odps:*:projects/alipay/tables/table_test",
              "Condition":{
                  "StringEquals": {
                      "odps:TaskType":["DT", "SQL"]
                  }
              }
          }]
          }
      说明 上述代码中,odps:TaskType主要包括DT、SQL、MapReduce类型。其中DT类型为Tunnel(批量数据通道),包含封装Tunnel SDK,例如DataWorks的数据集成、开源的DataX。

      Exception Policy不是一种普通的授权方式。如果云账号Alice没有表alipay.table_test的SELECT操作权限,即使设置了上述Exception Policy,Alice仍然无法导出数据。

      Exception Policy不同于Policy授权(但是Exception Policy与Policy授权语法完全一样),它只是对项目空间保护机制的例外情况的一种描述,即所有符合Policy中所描述的访问情形都可以打破ProjectProtection规则。

      您可以执行如下命令查看是否有EXCEPTION。
      show SecurityConfiguration;
    • 此方法可能存在TOCTOU(Time-of-Check to Time-of-Use) 数据泄露问题(即Race Condition问题):
      • 问题描述:
        1. [TOC阶段] 用户A向项目空间所有者申请将t1导出,项目空间所有者对t1的数据敏感程度进行评估,同意后通过exception policy授权A可以导出t1。
        2. 恶意用户修改了t1的内容,将敏感数据写入到t1。
        3. [TOU阶段] 用户A将t1的内容导出。但是,此时导出的t1并不是项目空间所有者审查的t1。
      • 解决办法:

        为了防止出现TOCTOU问题,建议您对于用户申请导出的表,项目空间所有者需要确保没有任何其他用户(包含管理员)能对该表进行更新(Update)操作或重建同名表操作(Drop + CreateTable)。在上述示例中,为防止出现TOCTOU问题,建议项目空间所有者在第一步中创建表t1的一个快照,设置exception policy时使用这个快照,并且不要授予Admin角色给任何用户。

  • 设置TrustedProject

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

    管理TrustedProject的命令如下:
    • 查看当前项目空间中的所有TrustedProjects。
       list trustedprojects;                  
    • 在当前项目空间中添加一个TrustedProject。
       add trustedproject <projectname>;               
    • 从当前项目空间中移除一个TrustedProject。
       remove trustedproject <projectname>;            
    说明

    在MaxCompute中,基于Package的跨项目空间资源访问机制与ProjectProtection数据保护机制是正交的,但在功能上却是相互制约的。

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

实践建议

如果要防止数据从项目空间的流出,在设置ProjectProtection=true之后,还需检查如下配置:
  • 确保没有添加TrustedProject。如果有设置,则需要评估可能存在的风险。
  • 确保没有使用Package数据分享。如果有设置,则需要确保Package中没有敏感数据。