全部產品
Search
文件中心

:Policy許可權控制

更新時間:Jul 20, 2024

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

指定被授予的對象的名稱。擷取方式如下:

  • 專案名稱:您可以登入MaxCompute控制台,左上方切換地區後,即可在專案管理頁簽擷取具體的MaxCompute專案名稱。

  • 表名稱:您可以通過MaxCompute用戶端執行show tables;命令擷取表或視圖名稱。

  • 資源名稱:您可以通過MaxCompute用戶端執行list resources;命令擷取資源名稱。

  • 函數名稱:您可以通過MaxCompute用戶端執行list functions;命令擷取函數名稱。

  • 執行個體名稱:您可以通過MaxCompute用戶端執行show instances;命令擷取執行個體ID。

授權對象支援以萬用字元星號(*)來表達。例如,table taobao*表示所有以taobao開頭的表。

說明

授權給ROLE支援使用萬用字元星號(*);授權給USER不支援使用萬用字元。

role_name

指定被授權的角色名稱。單次授權只能指定一個角色。

您可以通過MaxCompute用戶端執行list roles;命令擷取角色名稱。

privilegeproperties

policy

固定取值為true。表示使用Policy許可權控制方案。

allow

白名單授權必填

指定白名單授權機制。取值範圍如下:

  • true:表示允許對指定對象執行指定操作。

  • false:表示不允許對指定對象執行指定操作,即黑名單。

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授權樣本如下:

      1. 登入MaxCompute控制台,在左上方選擇地區。

      2. 在左側導覽列單擊專案管理

      3. 專案管理頁面,單擊目標專案操作列的管理

      4. 角色許可權頁簽,單擊新增專案層級角色

      5. 建立角色對話方塊,建立資源操作類(Resource)角色,填寫角色名稱和Policy授權策略。

        Policy內容如下:

        {
            "Statement":[
                {
                    "Action":[
                        "odps:Drop"
                    ],
                    "Effect":"Deny",
                    "Resource":[
                        "acs:odps:*:projects/test_project_a/tables/tb_*"
                    ]
                }
            ],
            "Version":"1"
        }
      6. 角色許可權頁簽,單擊建立角色操作列的成員管理,將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授權樣本如下:

      1. 登入MaxCompute控制台,在左上方選擇地區。

      2. 在左側導覽列單擊專案管理

      3. 專案管理頁面,單擊目標專案操作列的管理

      4. 角色許可權頁簽,單擊新增專案層級角色

      5. 建立角色對話方塊,建立資源操作類(Resource)角色,填寫角色名稱和Policy授權策略。

        Policy內容如下:

        {
            "Statement":[
                {
                    "Action":[
                        "odps:Update"
                    ],
                    "Effect":"Allow",
                    "Resource":[
                        "acs:odps:*:projects/test_project_a/tables/tb_*"
                    ]
                }
            ],
            "Version":"1"
        }
      6. 角色許可權頁簽,單擊建立角色操作列的成員管理,將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授權樣本如下:

      1. 登入MaxCompute控制台,在左上方選擇地區。

      2. 在左側導覽列單擊專案管理

      3. 專案管理頁面,單擊目標專案操作列的管理

      4. 角色許可權頁簽,單擊新增專案層級角色

      5. 建立角色對話方塊,建立資源操作類(Resource)角色,填寫角色名稱和Policy授權策略。

        Policy內容如下:

        {
            "Statement":[
                {
                    "Action":[
                        "odps:Drop"
                    ],
                    "Effect":"Deny",
                    "Resource":[
                        "acs:odps:*:projects/test_project_a/tables/*"
                    ]
                }
            ],
            "Version":"1"
        }
      6. 角色許可權頁簽,單擊建立角色操作列的成員管理,將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授權樣本如下:

      1. 登入MaxCompute控制台,在左上方選擇地區。

      2. 在左側導覽列單擊專案管理

      3. 專案管理頁面,單擊目標專案操作列的管理

      4. 角色許可權頁簽,單擊新增專案層級角色

      5. 建立角色對話方塊,建立資源操作類(Resource)角色,填寫角色名稱和Policy授權策略。

        Policy內容如下:

        {
            "Statement":[
                {
                    "Action":[
                        "odps:Describe",
                        "odps:Select"
                    ],
                    "Effect":"Allow",
                    "Resource":[
                        "acs:odps:*:projects/test_project_a/tables/*"
                    ]
                }
            ],
            "Version":"1"
        }
      6. 角色許可權頁簽,單擊建立角色操作列的成員管理,將RAM$Bob@aliyun.com:Tom添加至建立角色。

後續指引

瞭解Policy授權機制後,您可以根據實際業務需要執行授權相關操作:

相關文檔