HBase訪問控制標簽(ACL)

2018-05-04 13:40 更新

HBase訪問控制標簽(ACL)

HBase中的ACL基于用戶的成員身份或組中的排除,以及給定組訪問給定資源的權限。ACL是作為一個稱為AccessController的協(xié)處理器實現(xiàn)的。

HBase不維護私有組映射,但依賴于Hadoop組映射器,它映射目錄中的實體(LDAP或Active Directory)和HBase用戶。任何支持的Hadoop組映射器都將起作用。然后,針對資源(全局,名稱空間,表格,單元或端點)授予用戶特定的權限(讀取,寫入,執(zhí)行,創(chuàng)建,管理)。

啟用Kerberos和訪問控制后,客戶端對HBase的訪問將得到驗證,并且用戶數(shù)據(jù)是專用的,除非明確授予訪問權限。

與關系數(shù)據(jù)庫相比,HBase具有更簡單的安全模型,特別是在客戶端操作方面。例如,插入(新記錄)和更新(現(xiàn)有記錄)之間沒有區(qū)別,兩者都將折疊為已放置。

了解訪問級別

HBase訪問級別是相互獨立授予的,并允許在給定范圍內(nèi)進行不同類型的操作。

  • 讀取(R) - 可以讀取給定范圍的數(shù)據(jù)。
  • 寫入(W) - 可以在給定范圍寫入數(shù)據(jù)。
  • 執(zhí)行(X) - 可以在給定范圍內(nèi)執(zhí)行協(xié)處理器端點。
  • 創(chuàng)建(C) - 可以在給定范圍內(nèi)創(chuàng)建表或刪除表(甚至不創(chuàng)建它們)。
  • 管理員(A) - 可以執(zhí)行群集操作,例如在給定的范圍內(nèi)平衡群集或分配區(qū)域。

可能的范圍是:

  • 超級用戶(Superuser):Superuser可以執(zhí)行HBase中可用的任何操作,以訪問任何資源。在你的集群上運行HBase的用戶就是superuser,就像所有指定給HMaster中的hbase-site.xml的hbase.superuser配置屬性。
  • 全局(Global):在全局范圍授予的權限允許管理員對集群的所有表進行操作。
  • 命名空間(Namespace):在命名空間范圍授予的權限適用于給定名稱空間內(nèi)的所有表。
  • 表(Table):在表范圍授予的權限適用于給定表中的數(shù)據(jù)或元數(shù)據(jù)。
  • ColumnFamily:在ColumnFamily范圍內(nèi)授予的權限適用于該ColumnFamily內(nèi)的單元格。
  • 單元格(Cell):在單元格范圍內(nèi)授予的權限適用于該確切的單元格坐標(鍵,值,時間戳)(key, value, timestamp)。這允許政策與數(shù)據(jù)一起發(fā)展。
    要更改特定單元格上的ACL,請使用新ACL寫入更新后的單元格,以獲得原始坐標的精確坐標。
    如果您有多版本架構并且想要更新所有可見版本的ACL,則需要為所有可見版本編寫新的單元格。該應用程序可以完全控制政策演變。
    唯一的例外上述規(guī)則append和increment處理。追加和增量可以在操作中攜帶ACL。如果操作中包含一個,那么它將應用于appendor和increment的結果。否則,保存您正在追加或增加的現(xiàn)有單元的ACL。

訪問級別和作用域的組合創(chuàng)建了可授予用戶的可能訪問級別的矩陣。在生產(chǎn)環(huán)境中,根據(jù)執(zhí)行特定工作所需的內(nèi)容來考慮訪問級別很有用。以下列表描述了一些常見類型的HBase用戶的適當訪問級別。重要的是不要授予比給定用戶執(zhí)行其所需任務所需的更多訪問權限。

  • 超級用戶(Superusers):在生產(chǎn)系統(tǒng)中,只有HBase用戶應具有超級用戶訪問權限。在開發(fā)環(huán)境中,管理員可能需要超級用戶訪問才能快速控制和管理群集。但是,這種類型的管理員通常應該是全局管理員而不是超級用戶。
  • 全局管理員(Global Admins):全局管理員可以執(zhí)行任務并訪問HBase中的每個表。在典型的生產(chǎn)環(huán)境中,管理員不應具有對表內(nèi)數(shù)據(jù)的讀取或?qū)懭霗嘞蕖?/li>
  • 具有管理員權限的全局管理員可以在群集上執(zhí)行群集范圍的操作,例如平衡、分配或取消分配區(qū)域或調(diào)用明確的主要壓縮。這是一個操作角色。
  • 具有管理員權限的全局管理員可以創(chuàng)建或刪除HBase中的任何表。這更像是一個DBA類型的角色。在生產(chǎn)環(huán)境中,不同的用戶可能只有一個管理員權限和創(chuàng)建權限。
    在當前的實現(xiàn)中,具有Admin權限的全局管理員可以在桌上授予自己Read和Write權限并獲得對該表的數(shù)據(jù)的訪問權限。出于這個原因,只向?qū)嶋H需要的受信任用戶授予全局管理員權限。另請注意,具有Create權限的全局管理員可以在ACL表上執(zhí)行Put操作,模擬授予或吊銷并繞過對全局管理權限的授權檢查。由于這些問題,請謹慎授予全局管理員特權。
  • 命名空間管理員(Namespace Admins):具有Create權限的命名空間管理員可以在該命名空間內(nèi)創(chuàng)建或刪除表,并獲取和恢復快照。具有Admin權限的名稱空間管理員可以對該名稱空間內(nèi)的表執(zhí)行操作,例如拆分或主要壓縮。
  • 表管理員(Table Admins):表管理員只能在該表上執(zhí)行管理操作。具有Create權限的表管理員可以從該表創(chuàng)建快照或從快照中恢復該表。具有Admin權限的表管理員可以在該表上執(zhí)行操作:例如拆分或主要壓縮。
  • 用戶(Users):用戶可以讀取或?qū)懭霐?shù)據(jù),或兩者兼有。如果授予Executable權限,用戶還可以執(zhí)行協(xié)處理器端點。
訪問級別的實際示例
級別 范圍 權限 描述

高級管理員

Global

訪問,創(chuàng)建

管理群集并允許訪問初級管理員。

初級管理員

Global

創(chuàng)建

創(chuàng)建表并允許訪問表管理員。

表管理員

Table

訪問

從操作的角度維護一個表格。

數(shù)據(jù)分析師

Table

從HBase數(shù)據(jù)創(chuàng)建報告。

Web應用程序

Table

讀,寫

將數(shù)據(jù)放入HBase并使用HBase數(shù)據(jù)執(zhí)行操作。

實現(xiàn)細節(jié)

單元級ACL使用標簽(tag)實現(xiàn)(請參閱HBase:標簽)。為了使用單元級別的ACL,您必須使用HFile v3和HBase 0.98或更高版本。

  1. 由HBase創(chuàng)建的文件由運行HBase進程的操作系統(tǒng)用戶擁有。要與HBase文件交互,您應該使用API??或批量加載功能。
  2. HBase不在HBase內(nèi)部建立“roles”。相反,組名可以被授予權限。這允許通過組成員身份對角色進行外部建模。通過Hadoop組映射服務在HBase外部創(chuàng)建和操作組。

服務器端配置

  1. 請先參考基本的服務器端配置中的步驟。
  2. 通過在hbase-site.xml中設置以下屬性來安裝和配置AccessController協(xié)處理器。這些屬性包含一個類的列表。
    如果您使用AccessController以及VisibilityController,則AccessController必須首先位于列表中,因為在這兩個組件都處于活動狀態(tài)時,VisibilityController會將其系統(tǒng)表上的訪問控制委派給AccessController。有關將兩者一起使用的示例,請參閱安全性配置示例。
    <property>
      <name>hbase.security.authorization</name>
      <value>true</value>
    </property>
    <property>
      <name>hbase.coprocessor.region.classes</name>
      <value>org.apache.hadoop.hbase.security.access.AccessController, org.apache.hadoop.hbase.security.token.TokenProvider</value>
    </property>
    <property>
      <name>hbase.coprocessor.master.classes</name>
      <value>org.apache.hadoop.hbase.security.access.AccessController</value>
    </property>
    <property>
      <name>hbase.coprocessor.regionserver.classes</name>
      <value>org.apache.hadoop.hbase.security.access.AccessController</value>
    </property>
    <property>
      <name>hbase.security.exec.permission.checks</name>
      <value>true</value> 
    </property>
    
    或者,您可以通過將hbase.rpc.protection設置為privacy來啟用傳輸安全性。這需要HBase 0.98.4或更高版本。
  3. 在Hadoop namenode的core-site.xml中設置Hadoop組映射器。這是一個Hadoop文件,不是HBase文件。根據(jù)您的網(wǎng)站需求進行定制。以下是一個例子:
    <property>
      <name>hadoop.security.group.mapping</name>
      <value>org.apache.hadoop.security.LdapGroupsMapping</value>
    </property>
    
    <property>
      <name>hadoop.security.group.mapping.ldap.url</name>
      <value>ldap://server</value>
    </property>
    
    <property>
      <name>hadoop.security.group.mapping.ldap.bind.user</name>
      <value>Administrator@example-ad.local</value>
    </property>
    
    <property>
      <name>hadoop.security.group.mapping.ldap.bind.password</name>
      <value>****</value>
    </property>
    
    <property>
      <name>hadoop.security.group.mapping.ldap.base</name>
      <value>dc=example-ad,dc=local</value>
    </property>
    
    <property>
      <name>hadoop.security.group.mapping.ldap.search.filter.user</name>
      <value>(&amp;(objectClass=user)(sAMAccountName={0}))</value>
    </property>
    
    <property>
      <name>hadoop.security.group.mapping.ldap.search.filter.group</name>
      <value>(objectClass=group)</value>
    </property>
    
    <property>
      <name>hadoop.security.group.mapping.ldap.search.attr.member</name>
      <value>member</value>
    </property>
    
    <property>
      <name>hadoop.security.group.mapping.ldap.search.attr.group.name</name>
      <value>cn</value>
    </property>
  4. 或者,啟用早期的評估策略。在HBase 0.98.0之前,如果用戶沒有被授予訪問列族或至少一個列限定符的權限,則會引發(fā)AccessDeniedException。HBase 0.98.0刪除了這個異常,以便允許單元級別的異常授予。要恢復HBase 0.98.0-0.98.6中的舊行為,請在hbase-site.xml中將hbase.security.access.early_out設置為true。在HBase 0.98.6中,默認返回true。
  5. 分發(fā)您的配置并重新啟動群集以使更改生效。
  6. 要測試您的配置,請以給定用戶身份登錄HBase Shell,并使用該whoami命令報告您的用戶所屬的組。在此示例中,用戶被報告為該services組的成員。
    hbase> whoami
    service (auth:KERBEROS)
        groups: services

Administration

管理任務可以從HBase Shell或通過API執(zhí)行。

  1. 用戶和組管理,在您的目錄中,用戶和組在HBase的外部維護。
  2. 授予對名稱空間,表格,列族或單元格的訪問權限
    授權語句有幾種不同類型的語法。第一個也是最熟悉的是,表和列族是可選的:
    grant 'user', 'RWXCA', 'TABLE', 'CF', 'CQ'
    組和用戶以相同的方式被授予訪問權限,但組前綴有一個@符號。以相同的方式,表和名稱空間以相同的方式指定,但名稱空間前綴有一個@符號。
    也可以在單個語句中針對同一資源授予多個權限,如本例中所示。第一個子語句將用戶映射到ACL,第二個子語句指定資源。
    HBase Shell支持在單元級授予和撤銷訪問權限用于測試和驗證支持,不應將其用于生產(chǎn)使用,因為它不會將權限應用于尚不存在的單元。應用單元級別權限的正確方法是在存儲值時在應用程序代碼中執(zhí)行此操作。
    ACL粒度和評估順序ACL,從最小粒度到最細粒度進行評估,當達到授予權限的ACL時,評估將停止。這意味著單元ACL不會以較小的粒度覆蓋ACL。
    示例-HBase Shell
    • Global:
      hbase> grant '@admins', 'RWXCA'
    • Namespace:

      hbase> grant'service','RWXCA','@ test-NS'
    • Table:
      hbase> grant 'service', 'RWXCA', 'user'
    • Column Family:
      hbase> grant '@developers', 'RW', 'user', 'i'
    • Column Qualifier:
      hbase> grant 'service, 'RW', 'user', 'i', 'foo'
    • Cell:授予單元ACL的語法使用以下語法:
      grant <table>, \
        { '<user-or-group>' => \
          '<permissions>', ... }, \
        { <scanner-specification> }
    • <user-or-group>是用戶名或組名,前綴@為組的情況。
    • <permissions>是一個包含任何或所有“RWXCA”的字符串,但只有R和W在單元范圍內(nèi)有意義。
    • <scanner-specification>是'scan'shell命令使用的掃描器(scan)規(guī)范語法和約定。有關掃描儀規(guī)格的一些示例,請發(fā)出以下HBase Shell命令。
      hbase> help "scan"
      如果您需要啟用單元格acl,則hbase-site.xml中的hfile.format.version選項應該大于或等于3,并且hbase.security.access.early_out選項應設置為false。此示例授予'testuser'用戶讀取的訪問權限以及對'developers'組進行讀/寫訪問,'pii'列中與過濾器匹配的單元格。
      hbase> grant 'user', \
        { '@developers' => 'RW', 'testuser' => 'R' }, \ 
        { COLUMNS => 'pii', FILTER => "(PrefixFilter ('test'))" }
      
                          
      shell將運行具有給定條件的掃描器,用新的ACL重寫找到的單元格,并將其存儲回其確切的坐標。
    示例-API:以下示例顯示如何在表級別授予訪問權限
    public static void grantOnTable(final HBaseTestingUtility util, final String user,
        final TableName table, final byte[] family, final byte[] qualifier,
        final Permission.Action... actions) throws Exception {
      SecureTestUtil.updateACLs(util, new Callable<Void>() {
        @Override
        public Void call() throws Exception {
          try (Connection connection = ConnectionFactory.createConnection(util.getConfiguration());
               Table acl = connection.getTable(AccessControlLists.ACL_TABLE_NAME)) {
            BlockingRpcChannel service = acl.coprocessorService(HConstants.EMPTY_START_ROW);
            AccessControlService.BlockingInterface protocol =
              AccessControlService.newBlockingStub(service);
            AccessControlUtil.grant(null, protocol, user, table, family, qualifier, false, actions);
          }
          return null;
        }
      });
    }
    要在單元級別授予權限,可以使用以下Mutation.setACL方法:
    Mutation.setACL(String user, Permission perms)
    Mutation.setACL(Map<String, Permission> perms)
    具體而言,此示例向名為user1的用戶提供對特定Put操作中所包含的任何單元格的讀取權限:
    put.setACL(“user1”, new Permission(Permission.Action.READ))
  3. 從名稱空間,表,列系列或單元中撤消訪問控制
    revoke命令和API是授權命令API的雙胞胎,他們的語法是完全一樣的。唯一的例外是您無法撤銷單元級別的權限。您只能撤銷先前已授予的訪問權限,并且revoke語句與顯式拒絕資源不同。
    HBase Shell支持授予和撤銷訪問權限用于測試和驗證支持,不應將其用于生產(chǎn)使用,因為它不會將權限應用于尚不存在的單元。應用單元級權限的正確方法是在存儲值時在應用程序代碼中執(zhí)行此操作。
    示例:撤銷對表的訪問
    public static void revokeFromTable(final HBaseTestingUtility util, final String user,
        final TableName table, final byte[] family, final byte[] qualifier,
        final Permission.Action... actions) throws Exception {
      SecureTestUtil.updateACLs(util, new Callable<Void>() {
        @Override
        public Void call() throws Exception {
          Configuration conf = HBaseConfiguration.create();
          Connection connection = ConnectionFactory.createConnection(conf);
          Table acl = connection.getTable(util.getConfiguration(), AccessControlLists.ACL_TABLE_NAME);
          try {
            BlockingRpcChannel service = acl.coprocessorService(HConstants.EMPTY_START_ROW);
            AccessControlService.BlockingInterface protocol =
                AccessControlService.newBlockingStub(service);
            ProtobufUtil.revoke(protocol, user, table, family, qualifier, actions);
          } finally {
            acl.close();
          }
          return null;
        }
      });
    }
  4. 顯示用戶的有效權限
    HBase Shell
    hbase> user_permission 'user'
    
    hbase> user_permission '.*'
    
    hbase> user_permission JAVA_REGEX

示例-API

public static void verifyAllowed(User user, AccessTestAction action, int count) throws Exception {
  try {
    Object obj = user.runAs(action);
    if (obj != null && obj instanceof List&lt;?&gt;) {
      List&lt;?&gt; results = (List&lt;?&gt;) obj;
      if (results != null && results.isEmpty()) {
        fail("Empty non null results from action for user '" ` user.getShortName() ` "'");
      }
      assertEquals(count, results.size());
    }
  } catch (AccessDeniedException ade) {
    fail("Expected action to pass for user '" ` user.getShortName() ` "' but was denied");
  }
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號