全部產品
Search
文件中心

:ACL許可權控制

更新時間:Jul 20, 2024

當您需要允許多個使用者操作MaxCompute對象(專案、表等資源)時,MaxCompute支援通過ACL(Access Control Lists)方式授予使用者或角色對指定對象執行指定操作的許可權,可以先為角色授權,再將角色綁定至使用者,簡單高效地實現多個使用者的許可權控制。本文為您介紹MaxCompute支援的ACL授權命令,並提供授權樣本供參考。

背景資訊

ACL許可權控製為白名單授權機制,即允許使用者或角色對指定對象執行指定操作。ACL許可權控制方式簡單明了,可實現精準授權。

建立MaxCompute專案後,ACL許可權控制功能開關預設為開啟狀態。專案所有者(Project Owner)可以在MaxCompute專案中執行set CheckPermissionUsingACL=true|false;命令,開啟或關閉ACL許可權控制功能。

ACL許可權控制適用於如下情境。

情境

說明

授權人

授權操作入口

為使用者授權

直接為單個使用者授予對指定對象執行單個或多個操作的許可權。

請參見許可權一覽表的支援的授權人列。

基於角色為使用者授權

直接為單個角色授予對指定對象執行單個或多個操作的許可權,然後再將角色綁定至多個使用者,使用者即可具備角色的許可權。

更多建立角色及將角色綁定至使用者的資訊,請參見角色規劃為使用者綁定角色

說明

角色存在的意義是為了更好的系統管理使用者,通常不會存在為多個角色授予相同對象的相同操作許可權的情況。

前提條件

使用ACL許可權控制方案前,請您確認已記錄好如下資訊:

  • 被授權人的帳號或角色名稱,且帳號或角色已添加至MaxCompute專案。阿里雲帳號格式為ALIYUN$<account_id>,RAM使用者帳號格式為 RAM$<account_id>:<RAM使用者UID>,RAM角色帳號格式為`RAM$<account_id>:role/<RAM角色名稱>`

    您可以通過MaxCompute用戶端執行list users;list roles;命令擷取帳號或角色資訊。

    如果需要新增使用者或角色,請參見使用者規劃與管理角色規劃

  • 授權物件類型、對象名稱及操作。

    更多個物件類型及操作資訊,請參見MaxCompute許可權

使用限制

ACL許可權控制功能的使用限制如下:

  • ACL許可權控制只支援對已存在的對象、被授權人進行授權,可以避免刪除並重建同名對象所帶來的安全風險。

  • ACL許可權控制不支援通過[with grant option]子句授權。例如當使用者A授權使用者B可以訪問某個對象時,使用者B無法將許可權進一步授權給使用者C。

  • ACL授權為白名單(Allow)授權,不支援黑名單(Deny)授權。

注意事項

使用ACL許可權控制功能的注意事項如下:

  • 如果刪除了對象,MaxCompute會自動撤銷與該對象關聯的所有ACL授權資訊。

  • 當一個使用者被移除後,與該使用者有關的授權仍然會被保留。一旦該使用者以後被再次添加到該專案時,該使用者的歷史授權存取權限將被重新啟用。如果需要徹底清除使用者的許可權資訊,請參見徹底清除被刪除使用者遺留的許可權資訊

命令格式

ACL許可權控制命令格式如下:

  • ACL授權

    grant <actions> on <object_type> <object_name> 
    [(<column_list>)] to <subject_type> <subject_name> 
    [privilegeproperties("conditions" = "<conditions>", "expires"="<days>")];
  • 撤銷ACL授權

    revoke <actions> on <object_type> <object_name> 
    [(<column_list>)] from <subject_type> <subject_name>;
  • 列層級許可權控制

    grant <actions> on table <table_name> (<column_list>) to <subject_type> <subject_name>;
    revoke <actions> on table <table_name> (<column_list>) from <subject_type> <subject_name>;

參數說明如下。

參數名稱

是否必填

說明

actions

指定被授予的操作許可權名稱。單次授權可以指定單個或多個操作。

當有多個操作時,多個操作名稱之間使用英文逗號(,)分隔。操作取值請參見MaxCompute許可權

object_type

指定被授予的物件類型,即客體。單次授權只能指定一個客體。

客體取值請參見MaxCompute許可權

object_name

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

  • 專案名稱:您可以登入MaxCompute控制台,左上方切換地區後,即可在專案管理頁簽擷取具體的MaxCompute專案名稱。查詢類型為Project時,只能查詢當前Project的資訊。

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

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

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

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

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

說明

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

column_list

僅當object_type為Table,且需要對錶進行列層級許可權控制時,需要配置該參數。單次授權可以指定單個或多個列名,列名之間使用英文逗號(,)分隔。

說明

該參數實現的是對指定表的指定列的Describe、Select、Alter、Update、Drop、ShowHistory、ALL許可權進行控制。如果表的列設定了敏感等級,可通過Label許可權控制功能,通過敏感等級標籤對訪問敏感性資料的許可權進行控制。

privilegeproperties

conditions

從請求訊息來源及訪問方式等維度進行許可權控制。格式為"<var_name> <Operation> 常量" and "<var_name> <Operation> 常量" and ...,支援的var_nameOperation列表,請參見Conditions

days

指定許可權到期時間,單位為天。未指定該參數時,許可權預設長期有效。指定該參數時,許可權到期後,MaxCompute會自動清除許可權資訊。

subject_type

指定被授權人的類型。取值範圍如下:

  • USER:阿里雲帳號或RAM使用者

  • ROLE:角色

subject_name

指定被授權的使用者帳號或角色名稱。單次授權只能指定一個使用者或角色。格式如下:

  • 阿里雲帳號:ALIYUN$<account_id>

  • RAM使用者: RAM$<account_id>:<RAM使用者UID>

  • RAM角色:`RAM$<account_id>:role/<RAM角色名稱>`

您可以通過MaxCompute用戶端執行list users;list roles;命令擷取使用者帳號或角色名稱。

Conditions

conditions支援的var_nameOperation列表如下。

var_name

類型

Operation

說明

acs:UserAgent

STRING

  • StringEquals:=

  • StringNotEquals:<>

  • StringLike:like

  • StringNotLike:not like

發送請求時的用戶端UserAgent。

acs:Referer

STRING

發送請求時的HTTP referer。

acs:SourceIp

IP Address

  • IpAddress:in (...)

  • NotIpAddress:not in (...)

發送請求時的用戶端IP地址。

acs:SecureTransport

BOOLEAN

  • True

  • False

發送請求是否使用了安全通道,如HTTPS。

acs:CurrentTime

DATEANDTIME

  • DateEquals:=

  • DateNotEquals:<>

  • DateLessThan:<

  • DateLessThanEquals:<=

  • DateGreaterThan:>

  • DateGreaterThanEquals:>=

Web Server接收到請求的時間,以ISO 8601格式表示,如2012-11-11T23:59:59Z。

ACL許可權控制樣本

假設Bob@aliyun.com(帳號ID:5527xxxxxxxx5788)是test_project_a的專案所有者,Allen(UID:1652xxxxxxxxxx1538)、Alice(UID:2763xxxxxxxxxx1649)、Tom(UID:3874xxxxxxxxxx1850)是隸屬於Bob@aliyun.com的RAM使用者。以MaxCompute用戶端操作為例,授權樣本如下:

  • 樣本一:為使用者授權

    在專案test_project_a中建立表sale_detail,並為使用者Allen授予表的讀取中繼資料(Describe)和讀取表資料(Select)許可權。命令樣本如下。

    --Bob進入專案test_project_a。
    use test_project_a; 
    --建立一張分區表sale_detail。
    create table if not exists sale_detail
    (
    shop_name     string,
    customer_id   string,
    total_price   double
    )
    partitioned by (sale_date string, region string);
    --將使用者Allen添加為專案成員。
    add user RAM$5527xxxxxxxx5788:1652xxxxxxxxxx1538;
    --為Allen授予許可權。
    grant Describe, Select on table sale_detail to USER RAM$5527xxxxxxxx5788:1652xxxxxxxxxx1538;
    --查看使用者Allen的授權結果。
    show grants for RAM$5527xxxxxxxx5788:1652xxxxxxxxxx1538; 
    --授權結果如下。
    Authorization Type: ACL
    [user/RAM$5527xxxxxxxx5788:1652xxxxxxxxxx1538]
    A       projects/test_project_a/tables/sale_detail: Describe | Select
  • 樣本二:為使用者授權

    在樣本一中建立的表sale_detail基礎上,為使用者Alice授予表sale_detail中shop_name和customer_id兩列的所有操作許可權。命令樣本如下。

    --Bob進入專案test_project_a。
    use test_project_a; 
    --將使用者Alice添加為專案成員。
    add user RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649;
    --為Alice授予列層級控制許可權。
    grant All on table sale_detail (shop_name, customer_id) to USER RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649;
    --查看使用者Alice的授權結果。
    show grants for RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649; 
    --授權結果如下。
    Authorization Type: ACL
    [user/RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649]
    A       projects/test_project_a/tables/sale_detail/customer_id: All
    A       projects/test_project_a/tables/sale_detail/shop_name: All
  • 樣本三:為使用者撤銷授權

    基於樣本一、二,撤銷對使用者Allen、Alice的授權。命令樣本如下。

    --Bob進入專案test_project_a。
    use test_project_a; 
    --撤銷Allen授權。
    revoke Describe, Select on table sale_detail (shop_name, customer_id) from USER RAM$5527xxxxxxxx5788:1652xxxxxxxxxx1538;
    --撤銷Alice授權。
    revoke All on table sale_detail (shop_name, customer_id) from USER RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649;
    --查看使用者Allen的撤銷授權結果。許可權列表無Describe, Select許可權資訊。
    show grants for RAM$5527xxxxxxxx5788:1652xxxxxxxxxx1538; 
    --查看使用者Alice的撤銷授權結果。許可權列表無All許可權資訊。
    show grants for RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649; 

  • 樣本四:基於角色為多個使用者授予相同許可權

    為Alice、Tom及另一阿里雲帳號Lily@aliyun.com(帳號ID:5638xxxxxxxx6899)授予在專案test_project_a中建立執行個體、建立資源、建立函數、建立表以及查看專案所有物件類型的許可權。命令樣本如下。

    --Bob進入專案test_project_a。
    use test_project_a; 
    --將使用者Alice、Tom、Lily@aliyun.com添加為專案成員。
    add user RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649;
    add user RAM$5527xxxxxxxx5788:3874xxxxxxxxxx1850;
    add user ALIYUN$5638xxxxxxxx6899;
    --建立角色Worker。
    create role Worker; 
    --為使用者綁定角色Worker。
    grant Worker TO RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649; 
    grant Worker TO RAM$5527xxxxxxxx5788:3874xxxxxxxxxx1850; 
    grant Worker TO ALIYUN$5638xxxxxxxx6899; 
    --為角色Worker授予在專案test_project_a中建立執行個體、建立資源、建立函數、建立表以及查看專案所有物件類型的許可權。
    grant CreateInstance, CreateResource, CreateFunction, CreateTable, List on project test_project_a TO ROLE Worker;
    --查看使用者Lily的授權結果。
    show grants for ALIYUN$5638xxxxxxxx6899; 
    --授權結果如下。表明使用者Lily已經具備上述許可權。
    [roles]
    worker
    
    Authorization Type: ACL
    [role/worker]
    A       projects/test_project_a: CreateTable | CreateResource | CreateInstance | CreateFunction | List
  • 樣本五:為多個使用者撤銷基於角色授予的相同許可權

    基於樣本三,撤銷對使用者Alice、Tom、Lily@aliyun.com的授權。命令樣本如下。

    --Bob進入專案test_project_a。
    use test_project_a; 
    --收回使用者Alice、Tom、Lily@aliyun.com綁定的角色Worker。
    revoke Worker from RAM$5527xxxxxxxx5788:2763xxxxxxxxxx1649;
    revoke Worker from RAM$5527xxxxxxxx5788:3874xxxxxxxxxx1850;
    revoke Worker from ALIYUN$5638xxxxxxxx6899;
    --查看使用者Lily的撤銷授權結果。許可權列表無Worker資訊。
    show grants for ALIYUN$5638xxxxxxxx6899; 

後續指引

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