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

背景信息

部分公司(如金融机构等)对数据安全非常敏感,例如不允许员工将工作带回家而只允许在公司内部进行操作、而且公司所有电脑上的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提供了数据保护机制确保敏感数据的安全。

数据保护机制

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

在项目空间中执行如下命令开启数据保护机制。
--设置ProjectProtection规则:数据只能流入,不能流出。
set projectProtection=true;

ProjectProtection默认值为false。设置ProjectProtection后,您的项目空间中的数据流向就会得到控制,数据只能流入,不能流出。跨Project的数据访问操作将失效,因为它们都违背了ProjectProtection规则。

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

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

项目空间被设置了ProjectProtection之后,MaxCompute为您提供了在ProjectProtection被设置之后的两种数据导出途径。
  • 设置Exception Policy
    Project Owner在设置ProjectProtection时可以附带一个Exception策略,命令如下。
    SET ProjectProtection=true WITH EXCEPTION <policyFile>
    这种Policy不同于Policy授权(尽管这种Policy与Policy授权语法完全一样),它只是对项目空间保护机制的例外情况的一种描述,即所有符合Policy中所描述的访问情形都可以打破ProjectProtection规则。
    说明 执行如下命令查看是否有EXCEPTION。
    show SecurityConfiguration;

    示例

    允许云账号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仍然无法导出数据。
    • odps:TaskType主要包括DT、SQL、MapReduce类型。其中DT为Tunnel(批量数据通道),包含封装Tunnel SDK,例如DataWorks的数据集成、开源的DataX。
    TOCTOU(Time-of-Check to Time-of-Use) 数据泄露问题(即Race Condition问题)的描述如下:
    1. [TOC阶段] 用户A向Project Owner申请将t1导出,Project Owner对t1的数据敏感程度进行评估,PASS后通过exception policy授权A可以导出t1。
    2. 恶意用户修改了t1的内容,将敏感数据写入到t1。
    3. [TOU阶段] 用户A将t1的内容导出。但是,此时导出的t1并不是Project Owner审查的t1。

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

  • 设置TrustedProject

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

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

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

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

实践建议

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