HBase訪問控制標(biāo)簽(ACL)

2018-05-04 13:40 更新

HBase訪問控制標(biāo)簽(ACL)

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

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

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

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

了解訪問級(jí)別

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

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

可能的范圍是:

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

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

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

高級(jí)管理員

Global

訪問,創(chuàng)建

管理群集并允許訪問初級(jí)管理員。

初級(jí)管理員

Global

創(chuàng)建

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

表管理員

Table

訪問

從操作的角度維護(hù)一個(gè)表格。

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

Table

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

Web應(yīng)用程序

Table

讀,寫

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

實(shí)現(xiàn)細(xì)節(jié)

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

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

服務(wù)器端配置

  1. 請(qǐng)先參考基本的服務(wù)器端配置中的步驟。
  2. 通過在hbase-site.xml中設(shè)置以下屬性來安裝和配置AccessController協(xié)處理器。這些屬性包含一個(gè)類的列表。
    如果您使用AccessController以及VisibilityController,則AccessController必須首先位于列表中,因?yàn)樵谶@兩個(gè)組件都處于活動(dòng)狀態(tài)時(shí),VisibilityController會(huì)將其系統(tǒng)表上的訪問控制委派給AccessController。有關(guān)將兩者一起使用的示例,請(qǐng)參閱安全性配置示例。
    <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設(shè)置為privacy來啟用傳輸安全性。這需要HBase 0.98.4或更高版本。
  3. 在Hadoop namenode的core-site.xml中設(shè)置Hadoop組映射器。這是一個(gè)Hadoop文件,不是HBase文件。根據(jù)您的網(wǎng)站需求進(jìn)行定制。以下是一個(gè)例子:
    <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. 或者,啟用早期的評(píng)估策略。在HBase 0.98.0之前,如果用戶沒有被授予訪問列族或至少一個(gè)列限定符的權(quán)限,則會(huì)引發(fā)AccessDeniedException。HBase 0.98.0刪除了這個(gè)異常,以便允許單元級(jí)別的異常授予。要恢復(fù)HBase 0.98.0-0.98.6中的舊行為,請(qǐng)?jiān)趆base-site.xml中將hbase.security.access.early_out設(shè)置為true。在HBase 0.98.6中,默認(rèn)返回true。
  5. 分發(fā)您的配置并重新啟動(dòng)群集以使更改生效。
  6. 要測(cè)試您的配置,請(qǐng)以給定用戶身份登錄HBase Shell,并使用該whoami命令報(bào)告您的用戶所屬的組。在此示例中,用戶被報(bào)告為該services組的成員。
    hbase> whoami
    service (auth:KERBEROS)
        groups: services

Administration

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

  1. 用戶和組管理,在您的目錄中,用戶和組在HBase的外部維護(hù)。
  2. 授予對(duì)名稱空間,表格,列族或單元格的訪問權(quán)限
    授權(quán)語句有幾種不同類型的語法。第一個(gè)也是最熟悉的是,表和列族是可選的:
    grant 'user', 'RWXCA', 'TABLE', 'CF', 'CQ'
    組和用戶以相同的方式被授予訪問權(quán)限,但組前綴有一個(gè)@符號(hào)。以相同的方式,表和名稱空間以相同的方式指定,但名稱空間前綴有一個(gè)@符號(hào)。
    也可以在單個(gè)語句中針對(duì)同一資源授予多個(gè)權(quán)限,如本例中所示。第一個(gè)子語句將用戶映射到ACL,第二個(gè)子語句指定資源。
    HBase Shell支持在單元級(jí)授予和撤銷訪問權(quán)限用于測(cè)試和驗(yàn)證支持,不應(yīng)將其用于生產(chǎn)使用,因?yàn)樗粫?huì)將權(quán)限應(yīng)用于尚不存在的單元。應(yīng)用單元級(jí)別權(quán)限的正確方法是在存儲(chǔ)值時(shí)在應(yīng)用程序代碼中執(zhí)行此操作。
    ACL粒度和評(píng)估順序ACL,從最小粒度到最細(xì)粒度進(jìn)行評(píng)估,當(dāng)達(dá)到授予權(quán)限的ACL時(shí),評(píng)估將停止。這意味著單元ACL不會(huì)以較小的粒度覆蓋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>是一個(gè)包含任何或所有“RWXCA”的字符串,但只有R和W在單元范圍內(nèi)有意義。
    • <scanner-specification>是'scan'shell命令使用的掃描器(scan)規(guī)范語法和約定。有關(guān)掃描儀規(guī)格的一些示例,請(qǐng)發(fā)出以下HBase Shell命令。
      hbase> help "scan"
      如果您需要啟用單元格acl,則hbase-site.xml中的hfile.format.version選項(xiàng)應(yīng)該大于或等于3,并且hbase.security.access.early_out選項(xiàng)應(yīng)設(shè)置為false。此示例授予'testuser'用戶讀取的訪問權(quán)限以及對(duì)'developers'組進(jìn)行讀/寫訪問,'pii'列中與過濾器匹配的單元格。
      hbase> grant 'user', \
        { '@developers' => 'RW', 'testuser' => 'R' }, \ 
        { COLUMNS => 'pii', FILTER => "(PrefixFilter ('test'))" }
      
                          
      shell將運(yùn)行具有給定條件的掃描器,用新的ACL重寫找到的單元格,并將其存儲(chǔ)回其確切的坐標(biāo)。
    示例-API:以下示例顯示如何在表級(jí)別授予訪問權(quán)限
    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;
        }
      });
    }
    要在單元級(jí)別授予權(quán)限,可以使用以下Mutation.setACL方法:
    Mutation.setACL(String user, Permission perms)
    Mutation.setACL(Map<String, Permission> perms)
    具體而言,此示例向名為user1的用戶提供對(duì)特定Put操作中所包含的任何單元格的讀取權(quán)限:
    put.setACL(“user1”, new Permission(Permission.Action.READ))
  3. 從名稱空間,表,列系列或單元中撤消訪問控制
    revoke命令和API是授權(quán)命令A(yù)PI的雙胞胎,他們的語法是完全一樣的。唯一的例外是您無法撤銷單元級(jí)別的權(quán)限。您只能撤銷先前已授予的訪問權(quán)限,并且revoke語句與顯式拒絕資源不同。
    HBase Shell支持授予和撤銷訪問權(quán)限用于測(cè)試和驗(yàn)證支持,不應(yīng)將其用于生產(chǎn)使用,因?yàn)樗粫?huì)將權(quán)限應(yīng)用于尚不存在的單元。應(yīng)用單元級(jí)權(quán)限的正確方法是在存儲(chǔ)值時(shí)在應(yīng)用程序代碼中執(zhí)行此操作。
    示例:撤銷對(duì)表的訪問
    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. 顯示用戶的有效權(quán)限
    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)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)