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

背景和动机

在现实中,有一些公司(如金融机构等)对数据安全非常敏感,比如不允许员工将工作带回家,而只允许在公司内部进行操作。而且公司的所有电脑上的USB存储接口也都是禁用的。这样做的目的是禁止员工将敏感数据泄漏出去。

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

比如,当项目空间prj1的Owner遇到可以访问prj2,而prj2又不受控制的情形时,可能会担心用户Alice将她能访问的数据转移到prj2中去。

更具体地说,假设Alice已经被您授予了访问myprj.table1的Select权限,同时Alice也被prj2的管理员授予了CreateTable的权限。

则Alice将可以通过如下的任何一种方法将数据转移到prj2中去:
  • 提交SQL:
    create table prj2.table2 as select * from myprj.table1;
  • 编写MapReduce将myprj.table1读出,并写入prj2.table2。

如果您项目空间中的数据非常敏感,绝对不允许流出到其他项目空间中去,您可以将MaxCompute上述导致数据流出的操作统统禁止。

数据保护机制

MaxCompute提供的项目空间保护机制正好可以满足上述需要。您只需要在您的项目空间中做如下设置:
set projectProtection=true;
      --设置ProjectProtection规则:数据只能流入,不能流出

设置ProjectProtection后,您的项目空间中的数据流向就会得到控制 —— 数据只能流入,不能流出。即上述的两种操作将失效,因为它们都违背了ProjectProtection规则。

默认情况下,ProjectProtection不会被设置,默认值为false。

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

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

在您的项目空间被设置了ProjectProtection之后,您可能很快就会遇到这样的需求:Alice向您提出申请,她的确需要将某张表的数据导出您的项目空间。

而且经过您的审查之后,那张表也的确没有泄漏您关心的敏感数据。为了不影响Alice的正常业务需要,MaxCompute为您提供了在ProjectProtection被设置之后的两种数据导出途径。

  • 设置Exception Policy
    Project Owner在设置ProjectProtection时可以附带一个exception策略,命令如下。
    SET ProjectProtection=true WITH EXCEPTION <policyFile>

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

    ProjectProtection是对数据流向的控制,而不是访问控制。只有在用户能访问数据的前提下,控制数据流向才是有意义的。

    示例

    允许云账号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"]
                }
            }
        }]
        }
    说明 Exception policy不是一种普通的授权方式。如果云账号Alice没有表alipay.table_test的SELECT操作权限,即使设置了上述exception policy,Alice仍然无法导出数据。
    TOC2TOU (Time-of-Check to Time-of-Use) 数据泄露问题(即Race Condition问题)的描述如下:
    • [TOC阶段] 用户A向Project Owner申请将t1导出,Project Owner对t1的数据敏感程度进行评估,PASS后通过exception policy授权A可以导出t1。
    • 恶意用户修改了t1的内容,将敏感数据写入到t1。
    • [TOU阶段] 用户A将t1的内容导出。但是,此时导出的t1并不是Project Owner审查的t1。

    关于防止出现TOC2TOU问题的建议:对于用户申请导出的表,Project Owner需要确保没有任何其他用户(含admin)能对该表进行更新(Update)操作或重建同名表操作(Drop + CreateTable)。在上述示例中,为防止出现TOC2TOU问题,建议Project Owner在第一步中以Project Owner身份创建t1的一个snapshot,设置exception policy时使用这个snapshot;并且不要授予admin角色给任何用户。

  • 设置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。如果有设置,则需要评估可能的风险。
  • 确保没有使用package数据分享。如果有设置,则需要确保package中没有敏感数据。