背景和动机

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

作为MaxCompute项目空间管理员,您是否也有类似的安全需求呢? —— “不允许用户将数据转移到项目空间之外”。

比如,当项目空间prj1的Owner遇到下图所示的这种情形时,是否会担心用户Alice将她能访问的数据转移到prj2中去呢?因为她可以访问prj2,而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被设置之后的两种数据导出途径。

  • 设置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中没有敏感数据。