在實際業務處理過程中,用戶可能會同時具備多個項目的訪問權限,此時會存在數據在項目間流轉的安全問題。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 | 表示允許數據流出的項目及對象。格式為 |
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問題):
問題描述
假設,用戶的數據流出流程如下:
(TOC階段)用戶A向項目所有者申請導出表t1的數據。項目所有者對t1的數據敏感程度進行評估,同意后通過Exception Policy設置A可以導出t1的數據。
在用戶A導出t1的數據前,其他用戶修改了t1的內容,將敏感數據寫入了t1中。
(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權限可以下載。