全部產品
Search
文件中心

MaxCompute:資料保護機制

更新時間:Jun 19, 2024

在實際業務處理過程中,使用者可能會同時具備多重專案的存取權限,此時會存在資料在專案間流轉的安全問題。MaxCompute提供了資料保護機制,支援對資料流出行為進行控制,為專案資料的安全性提供保障。本文為您介紹MaxCompute的資料保護機制以及開啟資料保護機制後資料的流出策略。

背景資訊

部分公司對資料安全非常敏感,例如,只允許員工在公司內部進行操作、禁用公司所有電腦上的USB儲存介面。這樣做的目的是禁止員工將敏感性資料泄漏出去。在MaxCompute專案中,也會存在使用者將資料流出到專案之外的安全問題。

假設使用者Alice可以同時訪問Project1和Project2,Alice擁有訪問Project1.table1的Select許可權,同時也擁有在Project2中CreateTable的許可權。在該情況下,如果未設定任何資料保護機制,Alice可以執行如下語句將Project1.table1的資料流出到Project2中,該操作存在資料泄露風險。

create table project2.table2 as select * from project1.table1;

基於上述樣本可知,同時在多個MaxCompute專案中擁有存取權限的使用者,可以執行在許可權範圍內允許的跨專案資料操作來流出專案的資料。MaxCompute已提供資料保護機制能力,如果專案中的資料敏感度很高,則需要專案所有者自行設定資料保護機制。

MaxCompute專案的資料保護機制預設為關閉狀態。專案所有者可以在專案中執行set projectProtection=true;命令開啟資料保護機制,專案中的資料流向會得到控制,資料只能流入,不能流出。

注意事項

開啟資料保護機制後,您需要注意:

  • 跨專案的資料訪問操作將失效,因為該操作違背了資料保護機制。如果需要打破機制,例如允許部分資料流出到其他專案,MaxCompute提供了資料流出策略一:設定Exception Policy資料流出策略二:設定TrustedProject兩種方案供您選擇。

  • 資料保護機制是對資料流向的控制,而不是對資料存取權限的控制。只有在使用者具備資料存取權限的前提下,控制資料流向才有意義。

  • 基於Package跨專案訪問資源機制與資料保護機制是正交的(相互獨立),但在功能上是相互制約的。在MaxCompute中,Package資源分享優先於資料保護機制。即如果某個對象已通過Package方式為其他專案使用者授予存取權限,那麼該對象不受資料保護機制的限制。

資料流出策略一:設定Exception Policy

專案所有者需要提前規劃Exception Policy,允許指定使用者將指定對象的資料流出至指定專案,所有符合Exception Policy中描述的情形都可以打破資料保護機制。

設定方法

在開啟專案資料保護機制的同時,配置Exception Policy。完成配置後,您可以通過show SecurityConfiguration;命令查看Exception Policy資訊。設定Exception Policy的命令如下。

set ProjectProtection=true with exception <policyfile>;

policyfile為Exception Policy檔案,內容格式如下,您需要將該檔案以TXT格式儲存在MaxCompute用戶端安裝路徑的bin目錄下。

    {
    "Version": "1",
    "Statement":
    [{
        "Effect":"Allow",
        "Principal":"<Principal>",
        "Action":["odps:<Action1>[, <Action2>, ...]"],
        "Resource":"acs:odps:*:<Resource>",
        "Condition":{
            "StringEquals": {
                "odps:TaskType":["<Tasktype>"]
            }
        }
    }]
    }

參數

說明

Effect

固定取值為Allow,表示允許資料流出。

Principal

表示允許執行資料流出操作的阿里雲帳號或RAM使用者帳號。

Action

表示允許執行的資料流出操作。各類型對象的操作取值資訊,請參見專案及專案內對象許可權一覽表

Resource

表示允許資料流出的專案及對象。格式為projects/<project_name>/{tables|resources|functions|instances}/<name>更多個物件取值資訊,請參見專案及專案內對象許可權一覽表

Tasktype

表示允許執行的作業類型。取值可以為DT(Tunnel)、SQL、MapReduce。

配置範例

--開啟資料保護機制並設定Exception Policy。policy_file已儲存在MaxCompute用戶端安裝路徑的bin目錄下。
set ProjectProtection=true with exception policy_file;  
--policy_file內容如下。
{
    "Version": "1",
    "Statement":
    [{
        "Effect":"Allow",
        "Principal":"ALIYUN$Alice@aliyun.com",
        "Action":["odps:Select"],
        "Resource":"acs:odps:*:projects/project_test/tables/table_test",
        "Condition":{
            "StringEquals": {
                "odps:TaskType":["DT", "SQL"]
            }
        }
    }]
    }

該Exception Policy範例表示允許Alice可以通過SQL作業對錶project_test.table_test執行SELECT操作時,將資料流出到project_test專案之外。

說明

如果Alice本身沒有表project_test.table_test的SELECT許可權,即使設定了Exception Policy,Alice仍然無法匯出資料。

注意事項

設定Exception Policy可能存在TOCTOU(Time-of-Check to Time-of-Use)資料泄露問題(即Race Condition問題):

  • 問題描述

    假設,使用者的資料流出流程如下:

    1. (TOC階段)使用者A向專案所有者申請匯出表t1的資料。專案所有者對t1的資料敏感程度進行評估,同意後通過Exception Policy設定A可以匯出t1的資料。

    2. 在使用者A匯出t1的資料前,其他使用者修改了t1的內容,將敏感性資料寫入了t1中。

    3. (TOU階段)使用者A將t1的資料匯出。但是,此時匯出的t1並不是專案所有者審查過的t1,t1中包含了敏感性資料。

  • 解決措施

    為了防止出現TOCTOU問題,對於使用者申請匯出的表,建議專案所有者確保沒有任何其他使用者能對該表執行更新(Update)操作或重建同名表操作(Drop + CreateTable)。在上述樣本中,為防止出現TOCTOU問題,建議專案所有者在第一步中建立表t1的一個快照,設定Exception Policy時使用這個快照,並且不要為任何使用者授予Admin角色。

資料流出策略二:設定TrustedProject

如果當前專案處於資料保護狀態,當需要支援向目標專案執行資料流出操作時,專案所有者可以將目標專案設定為當前專案的TrustedProject,則此行為不會被視為觸犯資料保護機制。如果多重專案之間兩兩互相設定為TrustedProject,這些專案會形成一個TrustedProject Group,資料可以在TrustedProject Group內流轉,但禁止流出到TrustedProject Group之外。

設定方法

專案所有者可以通過如下命令管理信任專案:

  • 在當前專案中添加一個TrustedProject。

     add trustedproject <project_name>;               
  • 從當前專案中移除一個TrustedProject。

     remove trustedproject <project_name>;            
  • 查看當前專案的所有TrustedProject。

     list trustedprojects;                  

實踐建議

如果要嚴格禁止資料從專案流出,在設定set projectProtection=true;之後,專案所有者還需要檢查如下配置:

  • 執行list trustedprojects; 命令,確保專案中沒有添加TrustedProject。如果有TrustedProject,則需要評估可能存在的風險,對不需要的TrustedProject執行remove trustedproject <project_name>;命令進行刪除。

  • 執行show packages; 命令,確保專案中沒有使用Package分享資料。如果有Package,則需要確保Package中沒有敏感性資料,或者對不需要的Package執行delete package <package_name>;命令進行刪除。

  • 專案保護的作用是限制資料流出受保護的專案,情境上與MaxCompute的一些可以跨專案遷移資料的功能產生交集,主要情境如下:

    • create table <其他專案空間的表> as select * from <保護空間的表>

    • insert overwrite table <其他專案空間的表> select * from <保護空間的表>

    • 使用Spark、MR、Graph、Proxima、PAI將表資料寫入其他專案的表中。

    • 使用Tunnel download(包括SDK或JDBC調用Tunnel)將MaxCompute表資料下載至本地。

    • 使用clone table命令將表資料複製到其他專案的表中。

    • 使用UDF將表資料寫入其他專案的表中。

    • 外部表格。

  • 專案空間保護是否開啟和下載許可權控制會產生組合情境,如果需要在各個情境下載,需要的許可權如下:

    • 開啟專案空間保護,開啟download控制:有download許可權可以下載,注意除download許可權之外還需要describe許可權,因為Tunnel下載前會先發起一次describe鑒權。

    • 開啟專案空間保護,關閉download控制:有select許可權和對下載行為的Exception Policy可以下載。

    • 關閉專案空間保護,開啟download控制:有download和describe許可權可以下載。

    • 關閉專案空間保護,關閉download控制:有select許可權可以下載。