為確保MaxCompute專案資料的安全性,專案所有者或者具備授權許可權的使用者需要合理管控專案內成員的許可權。本文介紹MaxCompute的許可權管理案例。
許可權評估優先順序概述
Deny 優先於 Allow
Project Owner 和 Super_Administrator 不受限制
ACL 授權和 Policy 授權獨立評估,Condition 僅約束所在 Policy
Policy許可權控制案例
通過Policy以角色方式允許某些使用者執行操作
情境說明:
對部分專案成員進行許可權控制,允許建立表、Resource檔案上傳、Function建立、任務執行並只允許讀以
t_app_開頭的表。操作步驟:
通過MaxCompute用戶端實現
建立新角色:
create role <role_name>;role_name為角色名稱。
準備Policy指令碼,並放置檔案在MaxCompute用戶端檔案所在的
bin目錄下,指令檔名稱為policy_1.json、內容如下:{ "Statement": [ { "Action": ["odps:List", "odps:CreateTable", "odps:CreateInstance", "odps:CreateResource", "odps:CreateFunction"], "Effect": "Allow", "Resource": ["acs:odps:*:projects/<project_name>"]}, { "Action": ["odps:*"], "Effect": "Allow", "Resource": [ "acs:odps:*:projects/<project_name>/tables/t_app_*", "acs:odps:*:projects/<project_name>/registration/functions/*", "acs:odps:*:projects/<project_name>/instances/*", "acs:odps:*:projects/<project_name>/resources/*"]}], "Version": "1"}project_name為MaxCompute專案名稱。
授權。
--給新建立的角色授權 put policy policy_1.json on role <role_name>; --把角色授權給目標使用者 grant <role_name> to <user_name>;user_name為授權目標使用者的帳號,阿里雲帳號格式為
ALIYUN$阿里雲帳號,RAM使用者帳號格式為RAM$歸屬阿里雲帳號:RAM使用者名稱。
通過控制台實現
登入MaxCompute控制台,在左上方選擇地區。
在左側導覽列,選擇。
在项目管理頁面,單擊目標專案操作列的管理。
在项目配置頁面,選擇角色权限頁簽。
單擊新增项目级别角色,建立支援MaxCompute相關許可權的專案角色。
在彈出的新建角色對話方塊,建立資源操作類(Resource)角色,填寫角色名称和Policy授權策略。
Policy內容如下:
{ "Statement": [ { "Action": ["odps:List", "odps:CreateTable", "odps:CreateInstance", "odps:CreateResource", "odps:CreateFunction"], "Effect": "Allow", "Resource": ["acs:odps:*:projects/<project_name>"]}, { "Action": ["odps:*"], "Effect": "Allow", "Resource": [ "acs:odps:*:projects/<project_name>/tables/t_app_*", "acs:odps:*:projects/<project_name>/registration/functions/*", "acs:odps:*:projects/<project_name>/instances/*", "acs:odps:*:projects/<project_name>/resources/*"]}], "Version": "1"}選擇目標專案層級角色,單擊操作列的成员管理。選擇需授權的阿里雲主帳號或RAM使用者,單擊確定完成授權。若首次授權時未能搜尋到對應帳號,可下方手动添加成员地區添加。
通過Policy以角色方式禁止某使用者執行操作
情境說明:在業務需求上有些表非常重要,不允許某些帳號刪除同時要求杜絕誤刪,假設這些表名都是以
tb_開頭,通過Policy授權方式實現。操作步驟:
通過MaxCompute用戶端實現
建立新角色。
create role <role_name>;role_name為角色名稱。
準備Policy指令碼,並放置檔案在MaxCompute用戶端檔案所在的
bin目錄下,指令檔名稱為policy_2.json內容如下:{ "Version": "1", "Statement": [{ "Effect": "Deny", "Action": "odps:Drop", "Resource": "acs:odps:*:projects/<project_name>/tables/tb_*" }] }project_name為MaxCompute專案名稱。
授權。
--給新建立的角色授權 put policy policy_2.json on role <role_name>; --把角色授權給目標使用者 grant <role_name> to <user_name>;user_name為授權目標使用者的帳號,阿里雲帳號格式為
ALIYUN$阿里雲帳號,RAM使用者帳號格式為RAM$歸屬阿里雲帳號:RAM使用者名稱。
通過控制台實現
登入MaxCompute控制台,在左上方選擇地區。
在左側導覽列,選擇。
在项目管理頁面,單擊目標專案操作列的管理。
在项目配置頁面,選擇角色权限頁簽。
單擊新增项目级别角色,建立支援MaxCompute相關許可權的專案角色。
在彈出的新建角色對話方塊,建立資源操作類(Resource)角色,填寫角色名称和Policy授權策略。
Policy內容如下:
{ "Version": "1", "Statement": [{ "Effect": "Deny", "Action": "odps:Drop", "Resource": "acs:odps:*:projects/<project_name>/tables/tb_*" }] }選擇目標專案層級角色,單擊操作列的成员管理。選擇需授權的阿里雲主帳號或RAM使用者,單擊確定完成授權。若首次授權時未能搜尋到對應帳號,可下方手动添加成员地區添加。
通過Policy以角色方式授權
Policy 的 Condition 僅約束該 Policy 本身授與權限,不影響通過 ACL(GRANT 命令)或角色繼承獲得的許可權。
如果使用者同時擁有其他不帶條件的許可權來源(如 admin 角色、直接 ACL 授權),Condition 中的 IP 限制不會生效。
樣本一:
情境說明:
授權使用者
a****@aliyunid.com只能在2026-11-11 23:59:59這個時間點之前、只能從10.32.180.0/23這個IP段提交請求、只允許在專案空間test_project中執行CreateInstance、CreateTable和List操作且禁止刪除test_project下的任何錶。操作步驟:
通過MaxCompute用戶端實現
建立新角色:
create role policy_3;準備Policy指令碼,並放置檔案在MaxCompute用戶端檔案所在的
bin目錄下,指令檔名稱為policy_3.json內容如下:{ "Version": "1", "Statement": [{ "Effect":"Allow", "Action":["odps:CreateTable","odps:CreateInstance","odps:List"], "Resource":"acs:odps:*:projects/<project_name>", "Condition":{ "DateLessThan": { "acs:CurrentTime":"2026-11-11T23:59:59Z" }, "IpAddress": { "acs:SourceIp":"10.32.180.0/23" } } }, { "Effect":"Deny", "Action":"odps:Drop", "Resource":"acs:odps:*:projects/<project_name>/tables/*" }] }project_name為MaxCompute專案名稱。
授權。
--給新建立的角色授權 put policy policy_3.json on role policy_3; --把角色授權給目標使用者 grant policy_3 to ALIYUN$a****@aliyunid.com;
通過控制台實現
登入MaxCompute控制台,在左上方選擇地區。
在左側導覽列,選擇。
在项目管理頁面,單擊目標專案操作列的管理。
在项目配置頁面,選擇角色权限頁簽。
單擊新增项目级别角色,建立支援MaxCompute相關許可權的專案角色。
在彈出的新建角色對話方塊,建立資源操作類(Resource)角色,填寫角色名称和Policy授權策略。
Policy內容如下:
{ "Version": "1", "Statement": [{ "Effect":"Allow", "Action":["odps:CreateTable","odps:CreateInstance","odps:List"], "Resource":"acs:odps:*:projects/<project_name>", "Condition":{ "DateLessThan": { "acs:CurrentTime":"2026-11-11T23:59:59Z" }, "IpAddress": { "acs:SourceIp":"10.32.180.0/23" } } }, { "Effect":"Deny", "Action":"odps:Drop", "Resource":"acs:odps:*:projects/<project_name>/tables/*" }] }在项目配置頁面,選擇角色权限頁簽。
選擇目標專案層級角色,單擊操作列的成员管理。選擇需授權的阿里雲主帳號或RAM使用者,單擊確定完成授權。若首次授權時未能搜尋到對應帳號,可下方手动添加成员地區添加。
樣本二:通過 Deny Policy 強制 IP 存取控制
情境說明:限制某些使用者只能從指定 IP 段訪問,無論該使用者通過何種方式獲得了許可權。
核心思路:建立一個 Deny Policy,拒絕非指定 IP 段的所有請求。由於 Deny 優先於
Allow,即使使用者通過 ACL 或其他角色獲得了許可權,從非指定 IP 訪問時仍會被拒絕。
Policy內容如下:
{ "Version": "1", "Statement": [{ "Effect": "Deny", "Action": "odps:*", "Resource": "acs:odps:*:projects/<project_name>/*", "Condition": { "NotIpAddress": { "acs:SourceIp": "10.32.180.0/23" } } }] }
Package授權案例
基於Package跨專案訪問資源
情境說明:
業務分析人員需要查看生產表,但是不允許查看生產任務代碼,需要將多個生產專案的部分表開放給業務分析人員。
解決方案:
需要查生產表但是又不能查看生產任務,那麼需要單獨建立一個分析專案。可以通過在多個生產專案建立Package把需要開放的表添加到Package中,在分析專案中安裝Package並授權給分析人員,如此可以減少成員管理成本,無需在所有生產專案中添加分析人員,同時保證這些分析人員只能在分析專案中查看部分生產表。
本文以在生產專案(Project_a)中建立Package(Package_test),然後將生產表(table_a)加入到Package,在分析專案(Project_analyze)中安裝Package並授權給分析人員(A*****@aliyunid.com)查詢為例,講解Package授權操作步驟。
操作步驟:
在生產專案中建立Package:
USE Project_a; CREATE PACKAGE Package_test;生產專案中向Package中添加需要分享的資源:
ADD TABLE table_a TO PACKAGE Package_test;生產專案許可分析專案空間使用Package 。
ALLOW PROJECT Project_analyze TO INSTALL PACKAGE Package_test;分析專案安裝Package:
USE Project_analyze; INSTALL PACKAGE Project_a.Package_test;Package授權給分析人員:
GRANT read ON package Package_test TO USER ALIYUN$A*****@aliyunid.com;分析人員查詢表中資料:
SELECT * FROM Project_a.table_a;
基於Package跨阿里雲帳號訪問資源
情境說明
同一家企業,由於內部成本以及其他業務需要,不同部門各自使用阿里雲帳號開通使用MaxCompute,但是部門之間業務有資料互動需求,同時出於資料安全考慮期望達到許可權最小化,即每個使用方的成員只能有許可權讀取提供方具體某些表的資料,因此需要實現不同阿里雲帳號之間的資料許可權細粒度管理。
說明不同阿里雲帳號間不能添加各自的RAM使用者到其他阿里雲帳號下的MaxCompute專案空間中,即阿里雲帳號A不能把阿里雲帳號B的RAM使用者添加到A作為Owner的Project中。
如果僅僅是Table、Resource、Function的讀許可權授予,可以考慮Package方式實現跨專案跨阿里雲帳號資源共用。
解決方案
假設有阿里雲帳號A的專案空間(Project_a)、阿里雲帳號B的專案空間(Project_b),Project_a中表
t1、t2需要給阿里雲帳號B的RAM使用者b_user1授讀許可權,Project_a中表t3給B的RAM使用者b_user2授讀許可權。重要阿里雲帳號之間資料通過授權可以互動,但是若通過DataWorks使用MaxCompute,跨阿里雲帳號的DataWorks專案空間任務是不可互連的,即任務之間不可配置調度依賴。
操作步驟
阿里雲帳號A進入Project_a,建立名稱為
a_to_b_pkg的Package,並把Project_a中的表t1、t2、t3都加入到a_to_b_pkg中。USE Project_a; CREATE PACKAGE a_to_b_pkg; ADD table t1 TO PACKAGE a_to_b_pkg; ADD table t2 TO PACKAGE a_to_b_pkg; ADD table t3 TO PACKAGE a_to_b_pkg;允許阿里雲帳號B的Project_b專案安裝
a_to_b_pkg。ALLOW PROJECT Project_b TO INSTALL PACKAGE a_to_b_pkg;阿里雲帳號B進入Project_b專案安裝
a_to_b_pkg。INSTALL PACKAGE Project_a.a_to_b_pkg;將Package中的表分別授權給阿里雲帳號B的RAM使用者。
add user ram$B:b_user1; add user ram$B:b_user2; GRANT Describe , Select ON TABLE t1 TO USER ram$B:b_user1 PRIVILEGEPROPERTIES ("refobject" = "true", "refproject"="project_a", "package"="project_a.a_to_b_pkg");--將package裡的t1表授權給b_user1 GRANT Describe , Select ON TABLE t2 TO USER ram$B:b_user1 PRIVILEGEPROPERTIES ("refobject" = "true", "refproject"="project_a", "package"="project_a.a_to_b_pkg");--將package裡的t2表授權給b_user1 GRANT Describe , Select ON TABLE t3 TO USER ram$B:b_user2 PRIVILEGEPROPERTIES ("refobject" = "true", "refproject"="project_a", "package"="project_a.a_to_b_pkg");--將package裡的t3表授權給b_user2
基於Package實現行層級許可權控制
情境說明:
ProjectA中的
table_order表是所有商家的訂單交易資訊表,該表需要開放給商家查看,但是每個商家只能查看對應自己店鋪的訂單交易資訊。解決方案:
table_order表中有商家id,可以根據商家id過濾,給各個商家唯讀自己的資料,因此需要行層級的許可權控制。MaxCompute本身不支援行層級的許可權控制,但是可以在table_order表下遊單獨給每個商家建立獨立的視圖(View),將View通過Package賦權給對應的商家,這種方式可以滿足行層級許可權控制。操作步驟:
在ProjectA中為各個商家建立對應視圖:
CREATE VIEW <viewname> as select * from table_order WHERE sellerid='xxxx';viewname為自訂設定的視圖名稱。
在ProjectA中建立Package,通過Package資源共用方式將View授權給商家:
create package <packagename>; add table <viewname> to package <packagename>; allow project <Projectname_seller> to install package <packagename>;packagename為自訂設定的Package名稱;Projectname_seller為商家的MaxCompute專案名稱。
商家專案內安裝Package並使用View。
USE <Projectname_seller>; install package <ProjectA>.<packagename>; grant read on package <ProjectA>.<packagename> to user <username>; select * from <ProjectA>.<viewname>;username為商家專案中具體需要查詢View的帳號。