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的權限管理常見問題,請參見權限管理常見問題。