MaxCompute的Policy許可權控制方案提供了更加複雜和靈活的使用權限設定,適合需要細粒度控制的大型企業和複雜情境。相比ACL許可權控制增加黑名單方式,即可以實現允許或禁止角色對指定對象執行指定操作,將角色綁定至使用者後,使用者權限即可生效。本文介紹MaxCompute支援的Policy授權命令,並提供授權樣本供參考。
背景資訊
Policy許可權控制支援白名單和黑名單授權機制,即允許(白名單)或禁止(黑名單)角色對指定對象執行指定操作。
該授權方式可以彌補ACL授權機制無法解決的授權問題。例如使用者已經被賦予了開發角色,預設具備刪除表的許可權,但如果需要禁止使用者執行刪除表操作,可以通過Policy方式進行授權。
建立MaxCompute專案後,Policy許可權控制功能開關預設為開啟狀態。專案所有者(Project Owner)可以在MaxCompute專案中執行set CheckPermissionUsingPolicy=true|false;
命令,開啟或關閉Policy許可權控制功能。
Policy許可權控制適用於如下情境。
情境 | 說明 | 授權人 | 授權操作入口 |
基於角色為使用者授權 | 直接為單個角色,授予允許或禁止角色對指定對象執行單個或多個操作的許可權,然後再將角色綁定至多個使用者,使用者即可具備角色的許可權。 | 請參見許可權一覽表的支援的授權人列。 | |
為被賦予內建角色的使用者通過自訂角色進行精細化授權 | 當使用者已經被賦予內建角色時,如果需要對使用者的操作許可權進行更精細化的管理,無法通過ACL許可權控制方案解決此類授權問題。此時,您可以通過Policy許可權控制方案,新增角色,允許或禁止角色操作專案中的對象,並將角色綁定至使用者後,即可實現精細化管控使用者權限。 |
前提條件
使用Policy許可權控制方案前,請您確認已記錄好如下資訊:
被授權角色的名稱,且角色已添加至MaxCompute專案。
您可以通過MaxCompute用戶端執行
list roles;
命令擷取角色資訊。如果需要新增角色,請參見角色規劃。
授權物件類型、對象名稱及操作。
更多個物件類型及操作資訊,請參見MaxCompute許可權。
使用限制
Policy許可權控制只支援對已存在的角色進行授權。
注意事項
使用Policy許可權控制功能的注意事項如下:
當白名單和黑名單授權資訊同時存在時,遵循黑名單優先原則。
Policy許可權控制允許對不存在的對象授權,當刪除對象時,與該對象關聯的Policy授權資訊不會被刪除,授權人需要注意刪除並重建同名對象所帶來的安全風險。
當一個使用者被移除後,與該使用者有關的授權仍然會被保留。一旦該使用者以後被再次添加到該專案時,該使用者的歷史授權存取權限將被重新啟用。如果需要徹底清除使用者的許可權資訊,請參見徹底清除被刪除使用者遺留的許可權資訊。
命令格式
Policy許可權控制命令格式如下:
Policy授權
grant <actions> on <object_type> <object_name> to ROLE <role_name> privilegeproperties("policy" = "true", "allow"="{true|false}"[, "conditions"= "<conditions>" ]);
撤銷Policy授權
revoke <actions> on <object_type> <object_name> from ROLE <role_name> privilegeproperties ("policy" = "true", "allow"="{true|false}");
參數說明如下。
參數名稱 | 是否必填 | 說明 | |
actions | 是 | 指定被授予的操作許可權名稱。單次授權可以指定多個操作。 當有多個操作時,多個操作名稱之間使用英文逗號(,)分隔。操作取值請參見MaxCompute許可權。 | |
object_type | 是 | 指定被授予的物件類型,即客體。單次授權只能指定一個客體。 客體取值請參見MaxCompute許可權。 | |
object_name | 是 | 指定被授予的對象的名稱。擷取方式如下:
授權對象支援以萬用字元星號(*)來表達。例如, 說明 授權給ROLE支援使用萬用字元星號(*);授權給USER不支援使用萬用字元。 | |
role_name | 是 | 指定被授權的角色名稱。單次授權只能指定一個角色。 您可以通過MaxCompute用戶端執行 | |
privilegeproperties | policy | 是 | 固定取值為true。表示使用Policy許可權控制方案。 |
allow | 白名單授權必填 | 指定白名單授權機制。取值範圍如下:
| |
conditions | 否 | 從請求訊息來源及訪問方式等維度進行許可權控制。詳細參數取值請參見Conditions。 |
Policy許可權控制樣本
假設Bob@aliyun.com是test_project_a的專案所有者,Allen、Tom是隸屬於bob@aliyun.com的RAM使用者。Allen已被賦予test_project_a專案的Admin角色。以MaxCompute用戶端操作為例,授權樣本如下:
樣本一:基於角色為使用者授權(黑名單)
禁止Tom刪除以
tb_
開頭的表。通過ACL命令實現Policy授權樣本如下:
--Bob進入專案test_project_a。 use test_project_a; --建立角色Worker。 create role Worker; --將使用者Tom添加為專案成員。 add user RAM$Bob@aliyun.com:Tom; --將角色Worker綁定至使用者Tom。 grant Worker TO RAM$Bob@aliyun.com:Tom; --禁止角色Worker刪除專案test_project_a中以tb_開頭的表。 grant Drop on table tb_* to ROLE Worker privilegeproperties("policy" = "true", "allow"="false"); --查看使用者Tom的授權結果。 show grants for RAM$Bob@aliyun.com:Tom; --授權結果如下。D表示禁止,禁止刪除以tb_開頭的表。 Authorization Type: Policy [role/worker] D projects/test_project_a/tables/tb_*: Drop
通過控制台實現Policy授權樣本如下:
登入MaxCompute控制台,在左上方選擇地區。
在左側導覽列單擊專案管理。
在專案管理頁面,單擊目標專案操作列的管理。
在角色許可權頁簽,單擊新增專案層級角色。
在建立角色對話方塊,建立資源操作類(Resource)角色,填寫角色名稱和Policy授權策略。
Policy內容如下:
{ "Statement":[ { "Action":[ "odps:Drop" ], "Effect":"Deny", "Resource":[ "acs:odps:*:projects/test_project_a/tables/tb_*" ] } ], "Version":"1" }
在角色許可權頁簽,單擊建立角色操作列的成員管理,將
RAM$Bob@aliyun.com:Tom
添加至建立角色。
樣本二:撤銷Policy授權(黑名單)
基於樣本一,撤銷對使用者Tom的授權。
--Bob進入專案test_project_a。 use test_project_a; --收回使用者Tom綁定的角色Worker。 revoke Worker from RAM$Bob@aliyun.com:Tom; --查看使用者Tom的授權結果。許可權列表無Drop許可權資訊。 show grants for RAM$Bob@aliyun.com:Tom;
樣本三:基於角色為使用者授權(白名單)
允許Tom修改以
tb_
開頭的表的資料。通過ACL命令實現Policy授權樣本如下:
--Bob進入專案test_project_a。 use test_project_a; --建立角色Worker。 create role Worker; --將使用者Tom添加為專案成員。 add user RAM$Bob@aliyun.com:Tom; --將角色Worker綁定至使用者Tom。 grant Worker TO RAM$Bob@aliyun.com:Tom; --允許角色Worker修改專案test_project_a中以tb_開頭的表的資料。 grant Update on table tb_* to ROLE Worker privilegeproperties("policy" = "true", "allow"="true"); --查看使用者Tom的授權結果。 show grants for RAM$Bob@aliyun.com:Tom; --授權結果如下。A表示允許,可以更新以tb_開頭的表的資料。 Authorization Type: Policy [role/worker] A projects/test_project_a/tables/tb_*: Update
通過控制台實現Policy授權樣本如下:
登入MaxCompute控制台,在左上方選擇地區。
在左側導覽列單擊專案管理。
在專案管理頁面,單擊目標專案操作列的管理。
在角色許可權頁簽,單擊新增專案層級角色。
在建立角色對話方塊,建立資源操作類(Resource)角色,填寫角色名稱和Policy授權策略。
Policy內容如下:
{ "Statement":[ { "Action":[ "odps:Update" ], "Effect":"Allow", "Resource":[ "acs:odps:*:projects/test_project_a/tables/tb_*" ] } ], "Version":"1" }
在角色許可權頁簽,單擊建立角色操作列的成員管理,將
RAM$Bob@aliyun.com:Tom
添加至建立角色。
樣本四:撤銷Policy授權(白名單)
基於樣本三,撤銷對使用者Tom的授權。
--Bob進入專案test_project_a。 use test_project_a; --收回使用者Tom綁定的角色Worker。 revoke Worker from RAM$Bob@aliyun.com:Tom; --查看使用者Tom的授權結果。許可權列表無Update許可權資訊。 show grants for RAM$Bob@aliyun.com:Tom;
樣本五:為具備內建角色的使用者進行精細化授權
禁止Allen刪除專案test_project_a中的所有表。
通過ACL命令實現Policy授權樣本如下:
--Bob進入專案test_project_a。 use test_project_a; --建立角色Worker。 create role Worker; --將角色Worker綁定至使用者Allen。 grant Worker TO RAM$Bob@aliyun.com:Allen; --禁止角色Worker刪除專案test_project_a中的所有表。 grant Drop on table * to ROLE Worker privilegeproperties("policy" = "true", "allow"="false"); --查看使用者Allen的授權結果。 show grants for RAM$Bob@aliyun.com:Allen; --授權結果如下。禁止刪除所有表。 [roles] role_project_admin, worker Authorization Type: Policy [role/role_project_admin] A projects/test_project_a: * A projects/test_project_a/instances/*: * A projects/test_project_a/jobs/*: * A projects/test_project_a/offlinemodels/*: * A projects/test_project_a/packages/*: * A projects/test_project_a/registration/functions/*: * A projects/test_project_a/resources/*: * A projects/test_project_a/tables/*: * A projects/test_project_a/volumes/*: * [role/worker] A projects/test_project_a/tables/tb_*: Update D projects/test_project_a/tables/*: Drop --AG中的A表示Allow,G表示With Grant Option,即允許對客體(Object)進行授權 Authorization Type: ObjectCreator AG projects/test_project_a/tables/local_test: All AG projects/test_project_a/tables/mr_multiinout_out1: All AG projects/test_project_a/tables/mr_multiinout_out2: All AG projects/test_project_a/tables/ramtest: All AG projects/test_project_a/tables/wc_in: All AG projects/test_project_a/tables/wc_in1: All AG projects/test_project_a/tables/wc_in2: All AG projects/test_project_a/tables/wc_out: All
通過控制台實現Policy授權樣本如下:
登入MaxCompute控制台,在左上方選擇地區。
在左側導覽列單擊專案管理。
在專案管理頁面,單擊目標專案操作列的管理。
在角色許可權頁簽,單擊新增專案層級角色。
在建立角色對話方塊,建立資源操作類(Resource)角色,填寫角色名稱和Policy授權策略。
Policy內容如下:
{ "Statement":[ { "Action":[ "odps:Drop" ], "Effect":"Deny", "Resource":[ "acs:odps:*:projects/test_project_a/tables/*" ] } ], "Version":"1" }
在角色許可權頁簽,單擊建立角色操作列的成員管理,將
RAM$Bob@aliyun.com:Allen
添加至建立角色。
樣本六:為具備內建角色的使用者撤銷授權
基於樣本五,撤銷對使用者Allen的授權。命令樣本如下。
--Bob進入專案test_project_a。 use test_project_a; --收回使用者Allen綁定的角色Worker。 revoke Worker from RAM$Bob@aliyun.com:Allen; --查看使用者Allen的授權結果。許可權列表無Drop許可權資訊。 show grants for RAM$Bob@aliyun.com:Allen;
樣本七:基於角色為使用者(Tom)授予查詢所有表的許可權(白名單)
通過ACL命令實現Policy授權樣本如下:
--Bob進入專案test_project_a。 use test_project_a; --建立角色Worker。 create role Worker; --將使用者Tom添加為專案成員。 add user RAM$Bob@aliyun.com:Tom; --將角色Worker綁定至使用者Tom。 grant Worker TO RAM$Bob@aliyun.com:Tom; --允許角色Worker查詢專案test_project_a中的所有表。 grant Describe,select on table * to ROLE Worker privilegeproperties("policy" = "true", "allow"="true"); --查看使用者Tom的授權結果。 show grants for RAM$Bob@aliyun.com:Tom; --授權結果如下。A表示允許,允許查詢專案test_project_a中的所有表。 Authorization Type: Policy [role/worker] A projects/test_project_a/tables/*: Describe | Select
通過控制台實現Policy授權樣本如下:
登入MaxCompute控制台,在左上方選擇地區。
在左側導覽列單擊專案管理。
在專案管理頁面,單擊目標專案操作列的管理。
在角色許可權頁簽,單擊新增專案層級角色。
在建立角色對話方塊,建立資源操作類(Resource)角色,填寫角色名稱和Policy授權策略。
Policy內容如下:
{ "Statement":[ { "Action":[ "odps:Describe", "odps:Select" ], "Effect":"Allow", "Resource":[ "acs:odps:*:projects/test_project_a/tables/*" ] } ], "Version":"1" }
在角色許可權頁簽,單擊建立角色操作列的成員管理,將
RAM$Bob@aliyun.com:Tom
添加至建立角色。
後續指引
瞭解Policy授權機制後,您可以根據實際業務需要執行授權相關操作:
相關文檔
Policy許可權控制授權實踐,請參見Policy許可權控制案例。
對具備內建角色的使用者操作許可權進行更精細化的管理,請參見基於Policy對具備內建角色的使用者進行許可權管理。
MaxCompute的許可權管理常見問題,請參見許可權管理常見問題。