為確保MaxCompute專案資料的安全性,專案所有者或者具備授權許可權的使用者需要對專案內成員的許可權進行合理管控,確保許可權不會過大也不會過小。本文為您介紹MaxCompute的許可權管理案例。
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控制台,在左上方選擇地區。
在左側導覽列單擊工作區 > 專案管理。
在專案管理頁面,單擊目標專案操作列的管理。
在角色許可權頁簽,單擊新增專案層級角色。
在建立角色對話方塊,建立資源操作類(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控制台,在左上方選擇地區。
在左側導覽列單擊工作區 > 專案管理。
在專案管理頁面,單擊目標專案操作列的管理。
在角色許可權頁簽,單擊新增專案層級角色。
在建立角色對話方塊,建立資源操作類(Resource)角色,填寫角色名稱和Policy授權策略。
Policy內容如下:
{ "Version": "1", "Statement": [{ "Effect": "Deny", "Action": "odps:Drop", "Resource": "acs:odps:*:projects/<project_name>/tables/tb_*" }] }
在角色許可權頁簽,單擊建立角色操作列的成員管理,將目標阿里雲帳號或RAM使用者添加至建立角色。
通過Policy以角色方式授權
情境說明:
授權使用者
a****@aliyunid.com
只能在2018-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":"2018-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控制台,在左上方選擇地區。
在左側導覽列單擊工作區 > 專案管理。
在專案管理頁面,單擊目標專案操作列的管理。
在角色許可權頁簽,單擊新增專案層級角色。
在建立角色對話方塊,建立資源操作類(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":"2018-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使用者添加至建立角色。
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_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的帳號。