# 保護 Apache HBase
> 報告安全漏洞
>
> 為了保護現有的 HBase 安裝免受攻擊,請**不要**使用 JIRA 報告與安全相關的錯誤。相反,將您的報告發送到郵件列表 [private@hbase.apache.org](mailto:private@hbase.apache.org) ,允許任何人發送郵件,但限制誰可以閱讀它們。該列表中的某個人將與您聯系以跟進您的報告。 |
>
> HBase 遵守 Apache Software Foundation 關于報告的漏洞的政策,可在 [http://apache.org/security/](http://apache.org/security/) 上找到。
>
> 如果您希望發送加密報告,可以使用為常規 ASF 安全列表提供的 GPG 詳細信息。這可能會增加報告的響應時間。
HBase 提供了保護 HBase 的各種組件和方面的機制,以及它與 Hadoop 基礎架構的其余部分以及 Hadoop 之外的客戶端和資源的關系。
## 59.對 Web UI 使用安全 HTTP(HTTPS)
默認 HBase 安裝為主服務器和區域服務器的 Web UI 使用不安全的 HTTP 連接。要改為啟用安全 HTTP(HTTPS)連接,請在 _hbase-site.xml_ 中將`hbase.ssl.enabled`設置為`true`。這不會更改 Web UI 使用的端口。要更改給定 HBase 組件的 Web UI 端口,請在 hbase-site.xml 中配置該端口的設置。這些設置是:
* `hbase.master.info.port`
* `hbase.regionserver.info.port`
> 如果啟用 HTTPS,則客戶端應避免使用非安全 HTTP 連接。
>
> 如果啟用安全 HTTP,客戶端應使用`https://` URL 連接到 HBase。使用`http://` URL 的客戶端將收到`200`的 HTTP 響應,但不會接收任何數據。記錄以下異常:
>
> ```
> javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
> ```
>
> 這是因為相同的端口用于 HTTP 和 HTTPS。
>
> HBase 將 Jetty 用于 Web UI。如果不修改 Jetty 本身,似乎不可能將 Jetty 配置為在同一主機上將一個端口重定向到另一個端口。有關更多信息,請參閱 Nick Dimiduk 對此 [Stack Overflow](http://stackoverflow.com/questions/20611815/redirect-from-http-to-https-in-jetty) 線程的貢獻。如果您知道如何在不打開 HTTPS 的第二個端口的情況下解決這個問題,那么補丁將受到贊賞
## 60.使用 SPNEGO 進行 Web UI 的 Kerberos 身份驗證
可以通過使用 _hbase-site.xml_ 中的`hbase.security.authentication.ui`屬性配置 SPNEGO 來啟用對 HBase Web UI 的 Kerberos 身份驗證。啟用此身份驗證要求 HBase 還配置為對 RPC 使用 Kerberos 身份驗證(例如`hbase.security.authentication` = `kerberos`)。
```
<property>
<name>hbase.security.authentication.ui</name>
<value>kerberos</value>
<description>Controls what kind of authentication should be used for the HBase web UIs.</description>
</property>
<property>
<name>hbase.security.authentication</name>
<value>kerberos</value>
<description>The Kerberos keytab file to use for SPNEGO authentication by the web server.</description>
</property>
```
存在許多用于為 Web 服務器配置 SPNEGO 身份驗證的屬性:
```
<property>
<name>hbase.security.authentication.spnego.kerberos.principal</name>
<value>HTTP/_HOST@EXAMPLE.COM</value>
<description>Required for SPNEGO, the Kerberos principal to use for SPNEGO authentication by the
web server. The _HOST keyword will be automatically substituted with the node's
hostname.</description>
</property>
<property>
<name>hbase.security.authentication.spnego.kerberos.keytab</name>
<value>/etc/security/keytabs/spnego.service.keytab</value>
<description>Required for SPNEGO, the Kerberos keytab file to use for SPNEGO authentication by the
web server.</description>
</property>
<property>
<name>hbase.security.authentication.spnego.kerberos.name.rules</name>
<value></value>
<description>Optional, Hadoop-style `auth_to_local` rules which will be parsed and used in the
handling of Kerberos principals</description>
</property>
<property>
<name>hbase.security.authentication.signature.secret.file</name>
<value></value>
<description>Optional, a file whose contents will be used as a secret to sign the HTTP cookies
as a part of the SPNEGO authentication handshake. If this is not provided, Java's `Random` library
will be used for the secret.</description>
</property>
```
## 61.安全客戶端訪問 Apache HBase
較新版本的 Apache HBase(&gt; = 0.92)支持客戶端的可選 SASL 身份驗證。另見 Matteo Bertozzi 關于[了解 Apache HBase 中用戶認證和授權的文章](https://blog.cloudera.com/blog/2012/09/understanding-user-authentication-and-authorization-in-apache-hbase/)。
介紹如何設置 Apache HBase 和客戶端以連接到安全的 HBase 資源。
### 61.1。先決條件
Hadoop 身份驗證配置
要使用強身份驗證運行 HBase RPC,必須將`hbase.security.authentication`設置為`kerberos`。在這種情況下,還必須在 core-site.xml 中將`hadoop.security.authentication`設置為`kerberos`。否則,您將對 HBase 使用強身份驗證,但不會對底層 HDFS 使用強身份驗證,這將取消任何好處。
Kerberos KDC
您需要有一個有效的 Kerberos KDC。
### 61.2。用于安全操作的服務器端配置
首先,請參閱 [security.prerequisites](#security.prerequisites) 并確保您的基礎 HDFS 配置是安全的。
將以下內容添加到群集中每臺服務器上的`hbase-site.xml`文件中:
```
<property>
<name>hbase.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.token.TokenProvider</value>
</property>
```
部署這些配置更改時,需要完全關閉并重新啟動 HBase 服務。
### 61.3。用于安全操作的客戶端配置
首先,請參閱[先決條件](#security.prerequisites)并確保您的基礎 HDFS 配置是安全的。
將以下內容添加到每個客戶端上的`hbase-site.xml`文件中:
```
<property>
<name>hbase.security.authentication</name>
<value>kerberos</value>
</property>
```
在 2.2.0 版之前,客戶端環境必須通過`kinit`命令從 KDC 或 keytab 登錄到 Kerberos,然后才能與 HBase 集群進行通信。
從 2.2.0 開始,客戶端可以在`hbase-site.xml`中指定以下配置:
```
<property>
<name>hbase.client.keytab.file</name>
<value>/local/path/to/client/keytab</value>
</property>
<property>
<name>hbase.client.keytab.principal</name>
<value>foo@EXAMPLE.COM</value>
</property>
```
然后,應用程序可以自動執行登錄和憑據續訂作業,而不會受到客戶端干擾。
它是可選功能,客戶端升級到 2.2.0,只要保持`hbase.client.keytab.file`和`hbase.client.keytab.principal`未設置,它仍然可以保留舊版本中的登錄和憑證更新邏輯。
請注意,如果客戶端和服務器端站點文件中的`hbase.security.authentication`不匹配,則客戶端將無法與群集通信。
將 HBase 配置為安全 RPC 后,可以選擇配置加密通信。為此,請將以下內容添加到每個客戶端上的`hbase-site.xml`文件中:
```
<property>
<name>hbase.rpc.protection</name>
<value>privacy</value>
</property>
```
此配置屬性也可以基于每個連接進行設置。將其設置在`Table`提供的`Configuration`中:
```
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
conf.set("hbase.rpc.protection", "privacy");
try (Connection connection = ConnectionFactory.createConnection(conf);
Table table = connection.getTable(TableName.valueOf(tablename))) {
.... do your stuff
}
```
對于加密通信,預計性能損失約為 10%。
### 61.4。用于安全操作的客戶端配置 - Thrift Gateway
將以下內容添加到每個 Thrift 網關的`hbase-site.xml`文件中:
```
<property>
<name>hbase.thrift.keytab.file</name>
<value>/etc/hbase/conf/hbase.keytab</value>
</property>
<property>
<name>hbase.thrift.kerberos.principal</name>
<value>$USER/_HOST@HADOOP.LOCALDOMAIN</value>
<!-- TODO: This may need to be HTTP/_HOST@<REALM> and _HOST may not work.
You may have to put the concrete full hostname.
-->
</property>
<!-- Add these if you need to configure a different DNS interface from the default -->
<property>
<name>hbase.thrift.dns.interface</name>
<value>default</value>
</property>
<property>
<name>hbase.thrift.dns.nameserver</name>
<value>default</value>
</property>
```
分別用 _$ USER_ 和 _$ KEYTAB_ 替換相應的憑證和密鑰表。
為了使用 Thrift API 主體與 HBase 交互,還需要將`hbase.thrift.kerberos.principal`添加到`_acl_`表中。例如,要給 Thrift API 主體,`thrift_server`,管理訪問權限,這樣的命令就足夠了:
```
grant 'thrift_server', 'RWCA'
```
有關 ACL 的更多信息,請參閱[訪問控制標簽(ACL)](#hbase.accesscontrol.configuration)部分
Thrift 網關將使用提供的憑證對 HBase 進行身份驗證。 Thrift 網關本身不會執行任何身份驗證。通過 Thrift 網關進行的所有客戶端訪問都將使用 Thrift 網關的憑證并享有其特權。
### 61.5。配置 Thrift 網關以代表客戶端進行身份驗證
[安全操作的客戶端配置 - Thrift Gateway](#security.client.thrift) 描述了如何使用固定用戶對 Thrift 客戶端進行 HBase 認證。作為替代方案,您可以將 Thrift 網關配置為代表客戶端對 HBase 進行身份驗證,并使用代理用戶訪問 HBase。這在用于 Thrift 1 的 [HBASE-11349](https://issues.apache.org/jira/browse/HBASE-11349) 和用于 Thrift 2 的 [HBASE-11474](https://issues.apache.org/jira/browse/HBASE-11474) 中實施。
> Thrift Framed Transpor 的限制
>
> 如果您使用框架式傳輸,則無法利用此功能,因為此時 SASL 不適用于 Thrift 框架傳輸。
要啟用它,請執行以下操作。
1. 按照[安全操作的客戶端配置 - Thrift Gateway](#security.client.thrift) 中所述的步驟,確保 Thrift 在安全模式下運行。
2. 確保 HBase 配置為允許代理用戶,如 [REST 網關模擬配置](#security.rest.gateway)中所述。
3. 在運行 Thrift 網關的每個群集節點的 _hbase-site.xml_ 中,將屬性`hbase.thrift.security.qop`設置為以下三個值之一:
* `privacy` - 身份驗證,完整性和機密性檢查。
* `integrity` - 身份驗證和完整性檢查
* `authentication` - 僅驗證身份驗證
4. 重新啟動 Thrift 網關進程以使更改生效。如果節點正在運行 Thrift,則`jps`命令的輸出將列出`ThriftServer`進程。要在節點上停止 Thrift,請運行命令`bin/hbase-daemon.sh stop thrift`。要在節點上啟動 Thrift,請運行命令`bin/hbase-daemon.sh start thrift`。
### 61.6。配置 Thrift 網關以使用`doAs`功能
[配置 Thrift 網關以代表客戶端進行身份驗證](#security.gateway.thrift)描述如何配置 Thrift 網關以代表客戶端對 HBase 進行身份驗證,以及如何使用代理用戶訪問 HBase。此方法的局限性在于,使用一組特定憑據初始化客戶端后,它無法在會話期間更改這些憑據。 `doAs`功能提供了一種使用同一客戶端模擬多個主體的靈活方式。此功能在 [HBASE-12640](https://issues.apache.org/jira/browse/HBASE-12640) 中針對 Thrift 1 實施,但目前不適用于 Thrift 2。
**要啟用`doAs`功能**,請將以下內容添加到每個 Thrift 網關的 _hbase-site.xml_ 文件中:
```
<property>
<name>hbase.regionserver.thrift.http</name>
<value>true</value>
</property>
<property>
<name>hbase.thrift.support.proxyuser</name>
<value>true/value>
</property>
```
**要在使用`doAs`模擬時允許代理用戶**,請將以下內容添加到每個 HBase 節點的 _hbase-site.xml_ 文件中:
```
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hadoop.proxyuser.$USER.groups</name>
<value>$GROUPS</value>
</property>
<property>
<name>hadoop.proxyuser.$USER.hosts</name>
<value>$GROUPS</value>
</property>
```
看看[演示客戶端](https://github.com/apache/hbase/blob/master/hbase-examples/src/main/java/org/apache/hadoop/hbase/thrift/HttpDoAsClient.java),了解如何在客戶端使用此功能。
### 61.7。用于安全操作的客戶端配置 - REST 網關
將以下內容添加到每個 REST 網關的`hbase-site.xml`文件中:
```
<property>
<name>hbase.rest.keytab.file</name>
<value>$KEYTAB</value>
</property>
<property>
<name>hbase.rest.kerberos.principal</name>
<value>$USER/_HOST@HADOOP.LOCALDOMAIN</value>
</property>
```
Substitute the appropriate credential and keytab for _$USER_ and _$KEYTAB_ respectively.
REST 網關將使用提供的憑據通過 HBase 進行身份驗證。
為了使用 REST API 主體與 HBase 交互,還需要將`hbase.rest.kerberos.principal`添加到`_acl_`表。例如,要給出 REST API 主體,`rest_server`,管理訪問權限,這樣的命令就足夠了:
```
grant 'rest_server', 'RWCA'
```
For more information about ACLs, please see the [Access Control Labels (ACLs)](#hbase.accesscontrol.configuration) section
HBase REST 網關支持 [SPNEGO HTTP 身份驗證](https://hadoop.apache.org/docs/stable/hadoop-auth/index.html),以便客戶端訪問網關。要為客戶端訪問啟用 REST 網關 Kerberos 身份驗證,請將以下內容添加到每個 REST 網關的`hbase-site.xml`文件中。
```
<property>
<name>hbase.rest.support.proxyuser</name>
<value>true</value>
</property>
<property>
<name>hbase.rest.authentication.type</name>
<value>kerberos</value>
</property>
<property>
<name>hbase.rest.authentication.kerberos.principal</name>
<value>HTTP/_HOST@HADOOP.LOCALDOMAIN</value>
</property>
<property>
<name>hbase.rest.authentication.kerberos.keytab</name>
<value>$KEYTAB</value>
</property>
<!-- Add these if you need to configure a different DNS interface from the default -->
<property>
<name>hbase.rest.dns.interface</name>
<value>default</value>
</property>
<property>
<name>hbase.rest.dns.nameserver</name>
<value>default</value>
</property>
```
用 _$ KEYTAB_ 替換 HTTP 的密鑰表。
HBase REST 網關支持不同的'hbase.rest.authentication.type':simple,kerberos。您還可以通過實現 Hadoop AuthenticationHandler 來實現自定義身份驗證,然后將完整的類名指定為“hbase.rest.authentication.type”值。有關更多信息,請參閱 [SPNEGO HTTP 身份驗證](https://hadoop.apache.org/docs/stable/hadoop-auth/index.html)。
### 61.8。 REST 網關模擬配置
默認情況下,REST 網關不支持模擬。它代表客戶端訪問 HBase,就像上一節中配置的用戶一樣。對于 HBase 服務器,所有請求都來自 REST 網關用戶。實際用戶不詳。您可以打開模擬支持。通過模擬,REST 網關用戶是代理用戶。 HBase 服務器知道每個請求的實際/真實用戶。所以它可以應用適當的授權。
要打開 REST 網關模擬,我們需要配置 HBase 服務器(主服務器和區域服務器)以允許代理用戶;配置 REST 網關以啟用模擬。
要允許代理用戶,請將以下內容添加到每個 HBase 服務器的`hbase-site.xml`文件中:
```
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hadoop.proxyuser.$USER.groups</name>
<value>$GROUPS</value>
</property>
<property>
<name>hadoop.proxyuser.$USER.hosts</name>
<value>$GROUPS</value>
</property>
```
用 _$ USER_ 替換 REST 網關代理用戶,用 _$ GROUPS_ 替換允許的組列表。
要啟用 REST 網關模擬,請將以下內容添加到每個 REST 網關的`hbase-site.xml`文件中。
```
<property>
<name>hbase.rest.authentication.type</name>
<value>kerberos</value>
</property>
<property>
<name>hbase.rest.authentication.kerberos.principal</name>
<value>HTTP/_HOST@HADOOP.LOCALDOMAIN</value>
</property>
<property>
<name>hbase.rest.authentication.kerberos.keytab</name>
<value>$KEYTAB</value>
</property>
```
Substitute the keytab for HTTP for _$KEYTAB_.
## 62\. Apache HBase 的簡單用戶訪問
Newer releases of Apache HBase (>= 0.92) support optional SASL authentication of clients. See also Matteo Bertozzi’s article on [Understanding User Authentication and Authorization in Apache HBase](https://blog.cloudera.com/blog/2012/09/understanding-user-authentication-and-authorization-in-apache-hbase/).
介紹如何設置 Apache HBase 和客戶端,以便用戶輕松訪問 HBase 資源。
### 62.1。簡單與安全訪問
以下部分顯示如何設置簡單用戶訪問權限。簡單的用戶訪問不是一種安全的 HBase 操作方法。此方法用于防止用戶犯錯誤。它可用于在開發系統上模擬訪問控制,而無需設置 Kerberos。
此方法不用于防止惡意或黑客攻擊。要使 HBase 對這些類型的攻擊安全,您必須配置 HBase 以確保安全操作。請參閱[安全客戶端訪問 Apache HBase](#hbase.secure.configuration) 部分并完成其中描述的所有步驟。
### 62.2。先決條件
沒有
### 62.3。用于簡單用戶訪問操作的服務器端配置
Add the following to the `hbase-site.xml` file on every server machine in the cluster:
```
<property>
<name>hbase.security.authentication</name>
<value>simple</value>
</property>
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
<name>hbase.coprocessor.region.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>
```
對于 0.94,將以下內容添加到群集中每臺服務器計算機上的`hbase-site.xml`文件中:
```
<property>
<name>hbase.rpc.engine</name>
<value>org.apache.hadoop.hbase.ipc.SecureRpcEngine</value>
</property>
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
```
A full shutdown and restart of HBase service is required when deploying these configuration changes.
### 62.4。用于簡單用戶訪問操作的客戶端配置
Add the following to the `hbase-site.xml` file on every client:
```
<property>
<name>hbase.security.authentication</name>
<value>simple</value>
</property>
```
For 0.94, add the following to the `hbase-site.xml` file on every server machine in the cluster:
```
<property>
<name>hbase.rpc.engine</name>
<value>org.apache.hadoop.hbase.ipc.SecureRpcEngine</value>
</property>
```
Be advised that if the `hbase.security.authentication` in the client- and server-side site files do not match, the client will not be able to communicate with the cluster.
#### 62.4.1。簡單用戶訪問操作的客戶端配置 - Thrift Gateway
Thrift 網關用戶需要訪問權限。例如,要給 Thrift API 用戶,`thrift_server`,管理訪問權限,這樣的命令就足夠了:
```
grant 'thrift_server', 'RWCA'
```
For more information about ACLs, please see the [Access Control Labels (ACLs)](#hbase.accesscontrol.configuration) section
The Thrift gateway will authenticate with HBase using the supplied credential. No authentication will be performed by the Thrift gateway itself. All client access via the Thrift gateway will use the Thrift gateway’s credential and have its privilege.
#### 62.4.2。用于簡單用戶訪問操作的客戶端配置 - REST 網關
REST 網關將使用提供的憑據通過 HBase 進行身份驗證。 REST 網關本身不會執行任何身份驗證。通過 REST 網關進行的所有客戶端訪問都將使用 REST 網關的憑證并具有其特權。
REST 網關用戶需要訪問權限。例如,要給 REST API 用戶,`rest_server`,管理訪問權限,這樣的命令就足夠了:
```
grant 'rest_server', 'RWCA'
```
For more information about ACLs, please see the [Access Control Labels (ACLs)](#hbase.accesscontrol.configuration) section
客戶端應該可以通過 SPNEGO HTTP 身份驗證以傳遞方式通過 REST 網關對 HBase 群集進行身份驗證。這是未來的工作。
## 63.保護對 HDFS 和 ZooKeeper 的訪問
安全 HBase 需要安全的 ZooKeeper 和 HDFS,以便用戶無法訪問和/或修改 HBase 下的元數據和數據。 HBase 使用 HDFS(或配置文件系統)來保存其數據文件以及預寫日志(WAL)和其他數據。 HBase 使用 ZooKeeper 存儲一些操作元數據(主地址,表鎖,恢復狀態等)。
### 63.1。保護 ZooKeeper 數據
ZooKeeper 具有可插入的身份驗證機制,可以使用不同的方法從客戶端進行訪問。 ZooKeeper 甚至可以同時允許經過身份驗證和未經身份驗證的客戶端。可以通過為每個 znode 提供訪問控制列表(ACL)來限制對 znode 的訪問。 ACL 包含兩個組件,即身份驗證方法和主體。 ACL 不是按層次強制執行的。有關詳細信息,請參閱 [ZooKeeper 程序員指南](https://zookeeper.apache.org/doc/r3.3.6/zookeeperProgrammers.html#sc_ZooKeeperPluggableAuthentication)。
HBase 守護進程通過 SASL 和 kerberos 向 ZooKeeper 進行身份驗證(請參閱 [SASL 身份驗證與 ZooKeeper](#zk.sasl.auth) )。 HBase 設置 znode ACL,以便只有 HBase 用戶和配置的 hbase 超級用戶(`hbase.superuser`)可以訪問和修改數據。如果 ZooKeeper 用于服務發現或與客戶端共享狀態,HBase 創建的 znode 也將允許任何人(無論身份驗證)讀取這些 znode(clusterId,主地址,元位置等),但只允許 HBase 用戶可以修改它們。
### 63.2。保護文件系統(HDFS)數據
管理中的所有數據都保存在文件系統的根目錄下(`hbase.rootdir`)。應限制對文件系統中的數據和 WAL 文件的訪問,以便用戶無法繞過 HBase 層,并從文件系統中查看底層數據文件。 HBase 假定使用的文件系統(HDFS 或其他)分層次地強制執行權限。如果未提供對文件系統(授權和身份驗證)的充分保護,則 HBase 級別授權控制(ACL,可見性標簽等)毫無意義,因為用戶始終可以從文件系統訪問數據。
HBase 將類似 posix 的權限 700(`rwx------`)強制執行到其根目錄。這意味著只有 HBase 用戶可以讀取或寫入 FS 中的文件。可以通過在 hbase-site.xml 中配置`hbase.rootdir.perms`來更改默認設置。需要重新啟動活動主服務器,以便更改已使用的權限。對于 1.2.0 之前的版本,您可以檢查是否已提交 HBASE-13780,如果沒有,則可以根據需要手動設置根目錄的權限。使用 HDFS,命令將是:
```
sudo -u hdfs hadoop fs -chmod 700 /hbase
```
如果使用其他`hbase.rootdir`,則應更改`/hbase`。
在安全模式下,應配置 SecureBulkLoadEndpoint 并將其用于將從 MR 作業創建的用戶文件正確處理到 HBase 守護程序和 HBase 用戶。用于批量加載的分布式文件系統中的暫存目錄(`hbase.bulkload.staging.dir`,默認為`/tmp/hbase-staging`)應具有(模式 711 或`rwx—?x—?x`),以便用戶可以訪問在該父目錄下創建的暫存目錄,但不能做任何其他操作。有關如何配置 SecureBulkLoadEndPoint 的信息,請參閱[安全批量加載](#hbase.secure.bulkload)。
## 64.保護對數據的訪問
在 HBase 客戶端和服務器進程和網關之間配置安全身份驗證后,您需要考慮數據本身的安全性。 HBase 提供了幾種保護數據的策略:
* 基于角色的訪問控制(RBAC)使用熟悉的角色范例控制哪些用戶或組可以讀取和寫入給定的 HBase 資源或執行協處理器端點。
* 可見性標簽,允許您標記單元格并控制對標記單元格的訪問,以進一步限制誰可以讀取或寫入數據的某些子集。可見性標簽存儲為標簽。有關詳細信息,請參閱 [hbase.tags](#hbase.tags) 。
* 在 HFiles 和 WAL 中對底層文件系統上的靜態數據進行透明加密。這可以保護您的靜態數據免受可以訪問底層文件系統的攻擊者的攻擊,而無需更改客戶端的實現。它還可以防止來自不正確處理的磁盤的數據泄漏,這對于法律和法規合規性而言非常重要。
下面討論每個功能的服務器端配置,管理和實現細節,以及任何性能權衡。最后給出了一個示例安全配置,以顯示所有這些功能一起使用,因為它們可能位于真實場景中。
> HBase 的所有安全方面都在積極發展并迅速發展。您應采用任何策略來保護數據的安全性。此外,其中一些功能仍處于開發的實驗階段。要利用其中的許多功能,您必須運行 HBase 0.98+并使用 HFile v3 文件格式。
>
> 保護敏感文件
>
> 本節中的幾個過程要求您在群集節點之間復制文件。復制密鑰,配置文件或包含敏感字符串的其他文件時,請使用安全方法(如`ssh`)以避免泄露敏感數據。
過程:基本服務器端配置
1. 通過在 _hbase-site.xml_ 中將`hfile.format.version`設置為 3 來啟用 HFile v3。這是 HBase 1.0 和更新版本的默認值。
```
<property>
<name>hfile.format.version</name>
<value>3</value>
</property>
```
2. 為 RPC 和 ZooKeeper 啟用 SASL 和 Kerberos 身份驗證,如 [security.prerequisites](#security.prerequisites) 和 [SASL 身份驗證與 ZooKeeper](#zk.sasl.auth) 中所述。
### 64.1。標簽
_ 標簽 _ 是 HFile v3 的一個功能。標記是一段元數據,它是單元格的一部分,與鍵,值和版本分開。標簽是一個實現細節,為其他與安全相關的功能(如單元級 ACL 和可見性標簽)提供基礎。標簽存儲在 HFiles 本身中。將來,標簽可能會用于實現其他 HBase 功能。您不需要了解很多關于標簽的信息,以便使用它們啟用的安全功能。
#### 64.1.1。實施細節
每個單元格可以包含零個或多個標記。每個標記都有一個類型和實際的標記字節數組。
就像可以對行鍵,列族,限定符和值進行編碼一樣(參見 [data.block.encoding.types](#data.block.encoding.types) ),也可以對標記進行編碼。您可以在列族的級別啟用或禁用標記編碼,默認情況下啟用它。使用`HColumnDescriptor#setCompressionTags(boolean compressTags)`方法管理列族的編碼設置。您還需要為列族啟用 DataBlockEncoder,以使標記的編碼生效。
如果還啟用了 WAL 壓縮,則可以通過在 _hbase-site.xml_ 中將`hbase.regionserver.wal.tags.enablecompression`的值設置為`true`來啟用 WAL 中每個標記的壓縮。標簽壓縮使用字典編碼。
在 RegionServers 上運行服務器端的協處理器可以對單元標記執行 get 和 set 操作。在發送讀取響應之前,標記在 RPC 層被剝離,因此客戶端不會看到這些標記。使用 WAL 加密時不支持標記壓縮。
### 64.2。訪問控制標簽(ACL)
#### 64.2.1。這個怎么運作
HBase 中的 ACL 基于用戶在組中的成員資格或從組中排除,以及給定組訪問給定資源的權限。 ACL 實現為名為 AccessController 的協處理器。
HBase 不維護專用組映射,但依賴于 _Hadoop 組映射器 _,它映射目錄(如 LDAP 或 Active Directory)和 HBase 用戶之間的實體。任何受支持的 Hadoop 組映射器都可以使用。然后,用戶將被授予針對資源(全局,名稱空間,表,單元或端點)的特定權限(讀取,寫入,執行,創建,管理)。
> 啟用 Kerberos 和訪問控制后,將對 HBase 的客戶端訪問進行身份驗證,并且除非已明確授予訪問權限,否則用戶數據將為私有。
HBase 比關系數據庫具有更簡單的安全模型,尤其是在客戶端操作方面。例如,插入(新記錄)和更新(現有記錄)之間沒有區別,因為兩者都折疊為 Put。
##### 了解訪問級別
HBase 訪問級別彼此獨立地授予,并允許在給定范圍內的不同類型的操作。
* _Read(R)_ - 可以讀取給定范圍內的數據
* _ 寫(W)_ - 可以在給定范圍內寫入數據
* _ 執行(X)_ - 可以在給定范圍內執行協處理器端點
* _Create(C)_ - 可以在給定范圍內創建表或刪除表(甚至是那些他們沒有創建的表)
* _Admin(A)_ - 可以執行集群操作,例如平衡集群或在給定范圍內分配區域
可能的范圍是:
* _ 超級用戶 _ - 超級用戶可以在任何資源上執行 HBase 中可用的任何操作。在群集上運行 HBase 的用戶是超級用戶,分配給 HMaster 上 _hbase-site.xml_ 中的配置屬性`hbase.superuser`的任何主體也是如此。
* _Global_ - 在 _global_ 范圍內授予的權限允許管理員在集群的所有表上運行。
* _ 命名空間 _ - 在 _ 命名空間 _ 范圍內授予的權限適用于給定命名空間內的所有表。
* _ 表 _ - 在 _ 表 _ 范圍內授予的權限適用于給定表中的數據或元數據。
* _ColumnFamily_ - 在 _ColumnFamily_ 范圍內授予的權限適用于該 ColumnFamily 中的單元格。
* _Cell_ - 在 _ 單元格 _ 范圍內授予的權限適用于該確切的單元格坐標(鍵,值,時間戳)。這允許政策演變以及數據。
要更改特定單元格上的 ACL,請使用新 ACL 將更新的單元格寫入原始的精確坐標。
如果您具有多版本架構并且想要更新所有可見版本上的 ACL,則需要為所有可見版本編寫新單元。該應用程序完全控制政策演變。
上述規則的例外是`append`和`increment`處理。附加和增量可以在操作中攜帶 ACL。如果操作中包含一個,則它將應用于`append`或`increment`的結果。否則,將保留要附加或遞增的現有單元格的 ACL。
訪問級別和范圍的組合創建了可以授予用戶的可能訪問級別的矩陣。在生產環境中,根據執行特定工作所需的內容來考慮訪問級別很有用。以下列表描述了一些常見類型的 HBase 用戶的適當訪問級別。重要的是不要授予比給定用戶執行所需任務所需的訪問權限更多的訪問權限。
* _ 超級用戶 _ - 在生產系統中,只有 HBase 用戶應具有超級用戶訪問權限。在開發環境中,管理員可能需要超級用戶訪問權限才能快速控制和管理群集。但是,這種類型的管理員通常應該是全局管理員而不是超級用戶。
* _ 全局管理員 _ - 全局管理員可以執行任務并訪問 HBase 中的每個表。在典型的生產環境中,管理員不應對表中的數據具有讀取或寫入權限。
* 具有管理員權限的全局管理員可以在群集上執行群集范圍的操作,例如平衡,分配或取消分配區域,或調用顯式主要壓縮。這是一個操作角色。
* 具有“創建”權限的全局管理員可以在 HBase 中創建或刪除任何表。這更像是 DBA 類型的角色。
在生產環境中,不同用戶可能只擁有管理員和創建權限之一。
| |
在當前實現中,具有`Admin`權限的全局管理員可以在表上授予自己`Read`和`Write`權限,并獲得對該表數據的訪問權限。因此,僅向實際需要它們的受信任用戶授予`Global Admin`權限。
另請注意,具有`Create`權限的`Global Admin`可以對 ACL 表執行`Put`操作,模擬`grant`或`revoke`并繞過`Global Admin`權限的授權檢查。
由于這些問題,請謹慎授予`Global Admin`權限。
|
* _ 命名空間管理員 _ - 具有`Create`權限的命名空間管理員可以在該命名空間內創建或刪除表,并獲取和恢復快照。具有`Admin`權限的命名空間管理員可以對該命名空間中的表執行拆分或主要壓縮等操作。
* _ 表管理員 _ - 表管理員只能對該表執行管理操作。具有`Create`權限的表管理員可以從該表創建快照或從快照還原該表。具有`Admin`權限的表管理員可以對該表執行拆分或主要壓縮等操作。
* _ 用戶 _ - 用戶可以讀取或寫入數據,或兩者兼而有之。如果給予`Executable`權限,用戶還可以執行協處理器端點。
| 職稱 | 范圍 | 權限 | 描述 |
| --- | --- | --- | --- |
| 高級管理員 | 全球 | 訪問,創建 | 管理群集并授予初級管理員訪問權限。 |
| 初級管理員 | Global | 創建 | 創建表并提供對表管理員的訪問權限。 |
| 表管理員 | 表 | 訪問 | 從操作的角度維護表。 |
| 數據分析師 | Table | 讀 | 從 HBase 數據創建報告。 |
| Web 應用程序 | Table | 讀,寫 | 將數據放入 HBase 并使用 HBase 數據執行操作。 |
ACL 矩陣
有關 ACL 如何映射到特定 HBase 操作和任務的更多詳細信息,請參閱[附錄 acl 矩陣](#appendix_acl_matrix)。
##### 實施細節
單元級 ACL 使用標簽實現(參見[標簽](#hbase.tags))。要使用單元級 ACL,您必須使用 HFile v3 和 HBase 0.98 或更高版本。
1. HBase 創建的文件由運行 HBase 進程的操作系統用戶擁有。要與 HBase 文件進行交互,您應該使用 API??或批量加載工具。
2. HBase 不會在 HBase 內部模擬“角色”。相反,可以為組名授予權限。這允許通過組成員身份對角色進行外部建模。通過 Hadoop 組映射服務在 HBase 外部創建和操作組。
##### 服務器端配置
1. 作為先決條件,執行[過程:基本服務器端配置](#security.data.basic.server.side)中的步驟。
2. 通過在 _hbase-site.xml_ 中設置以下屬性來安裝和配置 AccessController 協處理器。這些屬性采用類列表。
> 如果將 AccessController 與 VisibilityController 一起使用,則 AccessController 必須位于列表的第一位,因為兩個組件都處于活動狀態,VisibilityController 會將其系統表的訪問控制委托給 AccessController。有關同時使用兩者的示例,請參見[安全配置示例](#security.example.config)。
```
<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 文件。根據您網站的需求進行自定義。以下是一個例子。
```
<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>(&(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 之前,如果未授予用戶訪問列族或至少列限定符的權限,則會拋出 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. 分發配置并重新啟動群集以使更改生效。
6. 要測試您的配置,請以給定用戶身份登錄 HBase Shell,并使用`whoami`命令報告您的用戶所屬的組。在此示例中,用戶被報告為`services`組的成員。
```
hbase> whoami
service (auth:KERBEROS)
groups: services
```
##### 管理
管理任務可以從 HBase Shell 或通過 API 執行。
> API 示例
>
> 下面的許多 API 示例都來自源文件 _hbase-server / src / test / java / org / apache / hadoop / hbase / security / access / TestAccessController.java_ 和 _hbase-server / src / test / java / org / apache / hadoop / hbase / security / access / SecureTestUtil.java_ 。
>
> 這些示例以及它們的源文件都不是公共 HBase API 的一部分,僅供參考。有關使用說明,請參閱官方 API。
1. 用戶和組管理
用戶和組在您的目錄中維護在 HBase 外部。
2. 授予對命名空間,表,列族或單元格的訪問權限
grant 語句有幾種不同類型的語法。第一個,也是最熟悉的,如下所示,表和列族是可選的:
```
grant 'user', 'RWXCA', 'TABLE', 'CF', 'CQ'
```
組和用戶以相同的方式被授予訪問權限,但組的前綴為`@`符號。同樣,表和名稱空間以相同的方式指定,但名稱空間以`@`符號為前綴。
也可以在單個語句中為同一資源授予多個權限,如本示例所示。第一個子句將用戶映射到 ACL,第二個子子句指定資源。
> HBase Shell 支持在單元級別授予和撤銷訪問權限,用于測試和驗證支持,不應用于生產用途,因為它不會將權限應用于尚不存在的單元格。應用單元級權限的正確方法是在存儲值時在應用程序代碼中執行此操作。
ACL 粒度和評估順序
ACL 從最小粒度到最細粒度進行評估,當達到授予權限的 ACL 時,評估將停止。這意味著單元 ACL 不會以較小的粒度覆蓋 ACL。
例 14\. HBase Shell
* 全球:
```
hbase> grant '@admins', 'RWXCA'
```
* 命名空間:
```
hbase> grant 'service', 'RWXCA', '@test-NS'
```
* 表:
```
hbase> grant 'service', 'RWXCA', 'user'
```
* 專欄系列:
```
hbase> grant '@developers', 'RW', 'user', 'i'
```
* 列限定符:
```
hbase> grant 'service, 'RW', 'user', 'i', 'foo'
```
* 細胞:
授予單元 ACL 的語法使用以下語法:
```
grant <table>, \
{ '<user-or-group>' => \
'<permissions>', ... }, \
{ <scanner-specification> }
```
* 是用戶名或組名,如果是組,則以`@`為前綴。
* 是包含任何或所有“RWXCA”的字符串,但只有 R 和 W 在細胞范圍內有意義。
* _<scanner-specification></scanner-specification>_ 是'scan'hell 命令使用的掃描器規范語法和約定。有關掃描程序規范的一些示例,請發出以下 HBase Shell 命令。
```
hbase> help "scan"
```
如果需要啟用 cell acl,則 hbase-site.xml 中的 hfile.format.version 選項應大于或等于 3,并且 hbase.security.access.early_out 選項應設置為 false。此示例授予讀取權限訪問“testuser”用戶以及“pii”列中與過濾器匹配的單元格上的“開發人員”組的讀/寫訪問權限。
```
hbase> grant 'user', \
{ '@developers' => 'RW', 'testuser' => 'R' }, \
{ COLUMNS => 'pii', FILTER => "(PrefixFilter ('test'))" }
```
shell 將運行具有給定條件的掃描程序,使用新 ACL 重寫找到的單元格,并將它們存儲回其精確坐標。
例 15\. 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)
```
具體來說,此示例為特定 Put 操作中包含的任何單元格上的`user1`用戶提供讀取權限:
```
put.setACL(“user1”, new Permission(Permission.Action.READ))
```
3. 從命名空間,表,列系列或單元格撤消訪問控制
`revoke`命令和 API 是 grant 命令和 API 的雙胞胎,語法完全相同。唯一的例外是您無法在單元級別撤消權限。您只能撤消先前已授予的訪問權限,并且`revoke`語句與顯式拒絕資源不同。
> HBase Shell 對授予和撤銷訪問權限的支持用于測試和驗證支持,不應用于生產用途,因為它不會將權限應用于尚不存在的單元格。應用單元級權限的正確方法是在存儲值時在應用程序代碼中執行此操作。
示例 16.撤銷對表的訪問
```
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
```
例 17\. 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<?>) {
List<?> results = (List<?>) 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");
}
}
```
### 64.3。可見性標簽
可見性標簽控件可用于僅允許與給定標簽關聯的用戶或主體讀取或訪問具有該標簽的單元。例如,您可以標記單元格`top-secret`,并僅將該標簽的訪問權限授予`managers`組。可見性標簽使用標簽實現,標簽是 HFile v3 的一項功能,允許您按單元格存儲元數據。標簽是一個字符串,標簽可以通過使用邏輯運算符(&amp;,|或!)并使用括號進行分組來組合成表達式。 HBase 不會對基本格式良好的表達式進行任何形式的驗證。可見性標簽本身沒有任何意義,可用于表示敏感度級別,權限級別或任何其他任意語義含義。
如果用戶的標簽與單元格的標簽或表達式不匹配,則拒絕用戶訪問該單元格。
在 HBase 0.98.6 及更新版本中,可見性標簽和表達式支持 UTF-8 編碼。使用`org.apache.hadoop.hbase.security.visibility.VisibilityClient`類提供的`addLabels(conf, labels)`方法創建標簽并通過 Scan 或 Get 在 Authorizations 中傳遞標簽時,標簽可以包含 UTF-8 字符,以及通常在可見性標簽中使用的邏輯運算符,具有普通的 Java 表示法,無需任何轉義方法。但是,當您通過 Mutation 傳遞 CellVisibility 表達式時,如果使用 UTF-8 字符或邏輯運算符,則必須使用`CellVisibility.quote()`方法將表達式括起來。參見`TestExpressionParser`和源文件 _hbase-client / src / test / java / org / apache / hadoop / hbase / client / TestScan.java_ 。
用戶在 Put 操作期間向單元格添加可見性表達式。在默認配置中,用戶無需訪問標簽即可使用標簽標記單元格。此行為由配置選項`hbase.security.visibility.mutations.checkauths`控制。如果將此選項設置為`true`,則用戶正在修改的標簽必須與用戶關聯,否則突變將失敗。在獲取或掃描期間確定用戶是否被授權讀取標記的單元格,并且過濾掉用戶不被允許讀取的結果。這會導致相同的 I / O 損失,就像返回結果一樣,但會降低網絡負載。
在刪除操作期間也可以指定可見性標簽。有關可見性標簽和刪除的詳細信息,請參閱 [HBASE-10885](https://issues.apache.org/jira/browse/HBASE-10885) 。
當 RegionServer 首次收到請求時,用戶的有效標簽集將構建在 RPC 上下文中。用戶與標簽關聯的方式是可插入的。默認插件通過添加到“獲取”或“掃描”的“授權”中指定的標簽,并根據主叫用戶的經過身份驗證的標簽列表檢查這些標簽。當客戶端傳遞未對用戶進行身份驗證的標簽時,默認插件會刪除它們。您可以通過`Get#setAuthorizations(Authorizations(String,…?))`和`Scan#setAuthorizations(Authorizations(String,…?));`方法傳遞用戶身份驗證標簽的子集。
可以以與用戶相同的方式向組授予可見性標簽。組以@符號為前綴。在檢查用戶的可見性標簽時,服務器將包括用戶所屬的組的可見性標簽以及用戶自己的標簽。當使用 API?? `VisibilityClient#getAuths`或 Shell 命令`get_auths`為用戶檢索可見性標簽時,我們將返回專門為該用戶添加的標簽,而不是組級標簽。
可見性標簽訪問檢查由 VisibilityController 協處理器執行。您可以使用接口`VisibilityLabelService`提供自定義實現和/或控制可見性標簽與單元格一起存儲的方式。有關示例,請參閱源文件 _hbase-server / src / test / java / org / apache / hadoop / hbase / security / visibility / TestVisibilityLabelsWithCustomVisLabService.java_ 。
可見性標簽可與 ACL 一起使用。
> 必須先明確定義標簽,然后才能在可見性標簽中使用它們。請參閱下面的示例,了解如何執行此操作。
>
> 目前無法確定哪些標簽已應用于單元格。有關詳細信息,請參見 [HBASE-12470](https://issues.apache.org/jira/browse/HBASE-12470) 。
>
> 可見性標簽目前不適用于超級用戶。
| 表達 | 解釋 |
| --- | --- |
| |
```
fulltime
```
|允許訪問與全時標簽關聯的用戶。 | |
```
!public
```
|允許訪問與公共標簽無關的用戶。 | |
```
( secret | topsecret ) & !probationary
```
|允許訪問與 secret 或 topsecret 標簽關聯且與試用標簽無關的用戶。 |
#### 64.3.1。服務器端配置
1. As a prerequisite, perform the steps in [Procedure: Basic Server-Side Configuration](#security.data.basic.server.side).
2. 通過在 _hbase-site.xml_ 中設置以下屬性來安裝和配置 VisibilityController 協處理器。這些屬性采用類名列表。
```
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.visibility.VisibilityController</value>
</property>
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.security.visibility.VisibilityController</value>
</property>
```
> 如果同時使用 AccessController 和 VisibilityController 協處理器,則 AccessController 必須位于列表的第一位,因為兩個組件都處于活動狀態,VisibilityController 會將其系統表的訪問控制委托給 AccessController。
3. 調整配置
默認情況下,用戶可以使用任何標簽標記單元格,包括與之無關的標簽,這意味著用戶可以放置他無法讀取的數據。例如,即使用戶未與該標簽相關聯,用戶也可以用(假設的)'topsecret'標簽標記單元格。如果您只希望用戶能夠使用與之關聯的標簽標記單元格,請將`hbase.security.visibility.mutations.checkauths`設置為`true`。在這種情況下,如果使用與用戶無關的標簽,則突變將失敗。
4. Distribute your configuration and restart your cluster for changes to take effect.
#### 64.3.2。管理
可以使用 HBase Shell 或 Java API 執行管理任務。為了定義可見性標簽列表并將標簽與用戶關聯,HBase Shell 可能更簡單。
> API Examples
>
> 本節中的許多 Java API 示例都來自源文件 _hbase-server / src / test / java / org / apache / hadoop / hbase / security / visibility / TestVisibilityLabels.java_ 。有關更多上下文,請參閱該文件或 API 文檔。
>
> 這些示例以及它們的源文件都不是公共 HBase API 的一部分,僅供參考。有關使用說明,請參閱官方 API。
1. 定義可見性標簽列表
HBase Shell
```
hbase> add_labels [ 'admin', 'service', 'developer', 'test' ]
```
示例 18\. Java API
```
public static void addLabels() throws Exception {
PrivilegedExceptionAction<VisibilityLabelsResponse> action = new PrivilegedExceptionAction<VisibilityLabelsResponse>() {
public VisibilityLabelsResponse run() throws Exception {
String[] labels = { SECRET, TOPSECRET, CONFIDENTIAL, PUBLIC, PRIVATE, COPYRIGHT, ACCENT,
UNICODE_VIS_TAG, UC1, UC2 };
try {
VisibilityClient.addLabels(conf, labels);
} catch (Throwable t) {
throw new IOException(t);
}
return null;
}
};
SUPERUSER.runAs(action);
}
```
2. 將標簽與用戶關聯
HBase Shell
```
hbase> set_auths 'service', [ 'service' ]
```
```
hbase> set_auths 'testuser', [ 'test' ]
```
```
hbase> set_auths 'qa', [ 'test', 'developer' ]
```
```
hbase> set_auths '@qagroup', [ 'test' ]
```
* .Java API
```
public void testSetAndGetUserAuths() throws Throwable {
final String user = "user1";
PrivilegedExceptionAction<Void> action = new PrivilegedExceptionAction<Void>() {
public Void run() throws Exception {
String[] auths = { SECRET, CONFIDENTIAL };
try {
VisibilityClient.setAuths(conf, auths, user);
} catch (Throwable e) {
}
return null;
}
...
```
1. 清除用戶標簽
HBase Shell
```
hbase> clear_auths 'service', [ 'service' ]
```
```
hbase> clear_auths 'testuser', [ 'test' ]
```
```
hbase> clear_auths 'qa', [ 'test', 'developer' ]
```
```
hbase> clear_auths '@qagroup', [ 'test', 'developer' ]
```
* .Java API
```
...
auths = new String[] { SECRET, PUBLIC, CONFIDENTIAL };
VisibilityLabelsResponse response = null;
try {
response = VisibilityClient.clearAuths(conf, auths, user);
} catch (Throwable e) {
fail("Should not have failed");
...
}
```
1. 將標簽或表達式應用于單元格
標簽僅在寫入數據時應用。標簽與給定版本的單元格相關聯。
HBase Shell
```
hbase> set_visibility 'user', 'admin|service|developer', { COLUMNS => 'i' }
```
```
hbase> set_visibility 'user', 'admin|service', { COLUMNS => 'pii' }
```
```
hbase> set_visibility 'user', 'test', { COLUMNS => [ 'i', 'pii' ], FILTER => "(PrefixFilter ('test'))" }
```
* 注意:HBase Shell 支持對單元格應用標簽或權限,用于測試和驗證支持,不應用于生產用途,因為它不會將標簽應用于尚不存在的單元格。應用單元格級別標簽的正確方法是在存儲值時在應用程序代碼中執行此操作。
* .Java API
```
static Table createTableAndWriteDataWithLabels(TableName tableName, String... labelExps)
throws Exception {
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Table table = NULL;
try {
table = TEST_UTIL.createTable(tableName, fam);
int i = 1;
List<Put> puts = new ArrayList<Put>();
for (String labelExp : labelExps) {
Put put = new Put(Bytes.toBytes("row" + i));
put.add(fam, qual, HConstants.LATEST_TIMESTAMP, value);
put.setCellVisibility(new CellVisibility(labelExp));
puts.add(put);
i++;
}
table.put(puts);
} finally {
if (table != null) {
table.flushCommits();
}
}
```
#### 64.3.3。用標簽讀取單元格
當您發出掃描或獲取時,HBase 使用您的默認授權集來過濾掉您無權訪問的單元格。超級用戶可以使用`set_auths` HBase Shell 命令或 [VisibilityClient.setAuths()](https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/security/visibility/VisibilityClient.html#setAuths-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-java.lang.String-)方法為給定用戶設置默認授權集。
您可以在掃描或獲取期間通過傳遞 HBase Shell 中的 AUTHORIZATIONS 選項或 [Scan.setAuthorizations()](https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Scan.html#setAuthorizations-org.apache.hadoop.hbase.security.visibility.Authorizations-)方法(如果使用 API??)指定其他授權。此授權將與您的默認設置組合作為附加過濾器。它將進一步過濾您的結果,而不是給您額外的授權。
HBase Shell
```
hbase> get_auths 'myUser'
hbase> scan 'table1', AUTHORIZATIONS => ['private']
```
示例 19\. Java API
```
...
public Void run() throws Exception {
String[] auths1 = { SECRET, CONFIDENTIAL };
GetAuthsResponse authsResponse = null;
try {
VisibilityClient.setAuths(conf, auths1, user);
try {
authsResponse = VisibilityClient.getAuths(conf, user);
} catch (Throwable e) {
fail("Should not have failed");
}
} catch (Throwable e) {
}
List<String> authsList = new ArrayList<String>();
for (ByteString authBS : authsResponse.getAuthList()) {
authsList.add(Bytes.toString(authBS.toByteArray()));
}
assertEquals(2, authsList.size());
assertTrue(authsList.contains(SECRET));
assertTrue(authsList.contains(CONFIDENTIAL));
return null;
}
...
```
#### 64.3.4。實現您自己的可見性標簽算法
解釋為給定的 get / scan 請求驗證的標簽是可插入的算法。
您可以使用屬性`hbase.regionserver.scan.visibility.label.generator.class`指定自定義插件或插件。第一個`ScanLabelGenerator`的輸出將是下一個的輸出,直到列表的結尾。
在 [HBASE-12466](https://issues.apache.org/jira/browse/HBASE-12466) 中實現的默認實現加載了兩個插件,`FeedUserAuthScanLabelGenerator`和`DefinedSetFilterScanLabelGenerator`。參見[用標簽讀取細胞](#reading_cells_with_labels)。
#### 64.3.5。將可見性標記復制為字符串
如上面部分所述,接口`VisibilityLabelService`可用于實現在單元格中存儲可見性表達式的不同方式。啟用了復制的群集還必須將可見性表達式復制到對等群集。如果`DefaultVisibilityLabelServiceImpl`用作`VisibilityLabelService`的實現,則所有可見性表達式將根據存儲在標簽表中的每個可見性標簽的序數轉換為相應的表達式。在復制期間,可見細胞也復制,基于序數的表達完整。對等群集可能沒有相同的`labels`表,其可見性標簽具有相同的序數映射。在這種情況下,復制序數是沒有意義的。如果復制發生在將可見性表達式作為字符串傳輸的情況下會更好。要將可見性表達式作為字符串復制到對等集群,請創建`RegionServerObserver`配置,該配置基于`VisibilityLabelService`接口的實現而工作。下面的配置允許將可見性表達式作為字符串復制到對等集群。更多詳細信息,請參見 [HBASE-11639](https://issues.apache.org/jira/browse/HBASE-11639) 。
```
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.coprocessor.regionserver.classes</name>
<value>org.apache.hadoop.hbase.security.visibility.VisibilityController$VisibilityReplication</value>
</property>
```
### 64.4。靜態數據的透明加密
HBase 提供了一種機制,用于保護靜態數據,HFiles 和 WAL,它們駐留在 HDFS 或其他分布式文件系統中。雙層體系結構用于靈活且非侵入式的密鑰輪換。 “透明”意味著客戶端不需要進行任何實現更改。寫入數據時,會對其進行加密。讀取時,按需解密。
#### 64.4.1。這個怎么運作
管理員為群集配置主密鑰,該密鑰存儲在每個受信任的 HBase 進程可訪問的密鑰提供程序中,包括管理工作站上的 HMaster,RegionServers 和客戶端(如 HBase Shell)。默認密鑰提供程序與 Java KeyStore API 以及支持它的任何密鑰管理系統集成在一起。其他自定義密鑰提供程序實現是可能密鑰檢索機制在 _hbase-site.xml_ 配置文件中配置。主密鑰可以存儲在集群服務器上,受安全 KeyStore 文件保護,或者存儲在外部密鑰服務器上,或者存儲在硬件安全模塊中。 HBase 進程通過配置的密鑰提供程序根據需要解析此主密鑰。
接下來,可以在每個列族的模式中指定加密使用,方法是創建或修改列描述符以包含兩個附加屬性:要使用的加密算法的名稱(當前僅支持“AES”),還可以選擇數據密鑰使用群集主密鑰包裝(加密)。如果沒有為 ColumnFamily 顯式配置數據密鑰,HBase 將為每個 HFile 創建一個隨機數據密鑰。這提供了替代方案的安全性的逐步改進。除非您需要提供顯式數據密鑰,例如在使用給定數據密鑰生成用于批量導入的加密 HFile 的情況下,否則僅在 ColumnFamily 模式元數據中指定加密算法,并讓 HBase 按需創建數據密鑰。每列族鍵有助于低影響增量鍵旋轉,并減少關鍵材料的任何外部泄漏范圍。包裝的數據密鑰存儲在 ColumnFamily 模式元數據中,并存儲在列系列的每個 HFile 中,使用集群主密鑰加密。在列系列配置為加密后,任何新的 HFile 都將被加密寫入。要確保加密所有 HFile,請在啟用此功能后觸發主要壓縮。
當 HFile 打開時,數據密鑰從 HFile 中提取,用集群主密鑰解密,并用于解密 HFile 的其余部分。如果主密鑰不可用,HFile 將無法讀取。如果遠程用戶以某種方式獲得對 HFile 數據的訪問,因為 HDFS 權限有所失效,或者來自不適當的丟棄媒體,則無法解密數據密鑰或文件數據。
也可以加密 WAL。即使 WAL 是瞬態的,在基礎文件系統受到損害的情況下,有必要加密 WALEdits 以避免繞過加密列族的 HFile 保護。啟用 WAL 加密后,無論相關的 HFile 是否加密,所有 WAL 都會被加密。
#### 64.4.2。服務器端配置
此過程假定您使用的是默認的 Java 密鑰庫實現。如果您使用的是自定義實現,請檢查其文檔并進行相應調整。
1. 使用`keytool`實用程序為 AES 加密創建適當長度的密鑰。
```
$ keytool -keystore /path/to/hbase/conf/hbase.jks \
-storetype jceks -storepass **** \
-genseckey -keyalg AES -keysize 128 \
-alias <alias>
```
將 __**__ 替換為密鑰庫文件的密碼,將<alias>替換為 HBase 服務帳戶的用戶名或任意字符串。如果使用任意字符串,則需要配置 HBase 才能使用它,如下所述。指定適當的密鑰大小。不要為密鑰指定單獨的密碼,但在出現提示時按<kbd>返回</kbd>。</alias>
2. 在密鑰文件上設置適當的權限,并將其分發給所有 HBase 服務器。
上一個命令在 HBase _conf /_ 目錄中創建了一個名為 _hbase.jks_ 的文件。設置此文件的權限和所有權,以便只有 HBase 服務帳戶用戶可以讀取該文件,并將密鑰安全地分發給所有 HBase 服務器。
3. 配置 HBase 守護進程。
在區域服務器上的 _hbase-site.xml_ 中設置以下屬性,以配置 HBase 守護程序以使用由 KeyStore 文件支持的密鑰提供程序或檢索集群主密鑰。在下面的示例中,用密碼替換 __**__。
```
<property>
<name>hbase.crypto.keyprovider</name>
<value>org.apache.hadoop.hbase.io.crypto.KeyStoreKeyProvider</value>
</property>
<property>
<name>hbase.crypto.keyprovider.parameters</name>
<value>jceks:///path/to/hbase/conf/hbase.jks?password=****</value>
</property>
```
默認情況下,HBase 服務帳戶名稱將用于解析群集主密鑰。但是,您可以使用任意別名(在`keytool`命令中)存儲它。在這種情況下,請將以下屬性設置為您使用的別名。
```
<property>
<name>hbase.crypto.master.key.name</name>
<value>my-alias</value>
</property>
```
您還需要確保您的 HFile 使用 HFile v3,以便使用透明加密。這是 HBase 1.0 以后的默認配置。對于以前的版本,請在 _hbase-site.xml_ 文件中設置以下屬性。
```
<property>
<name>hfile.format.version</name>
<value>3</value>
</property>
```
(可選)您可以使用其他密碼提供程序,Java Cryptography Encryption(JCE)算法提供程序或自定義 HBase 密碼實現。
* JCE:
* 安裝簽名的 JCE 提供程序(支持 128 位密鑰的`AES/CTR/NoPadding`模式)
* 將它以最高優先級添加到 JCE 站點配置文件 _ $ JAVA _HOME / lib / security / java.security_ 。
* 更新 _hbase-site.xml_ 中的`hbase.crypto.algorithm.aes.provider`和`hbase.crypto.algorithm.rng.provider`選項。
* 自定義 HBase 密碼:
* 實施`org.apache.hadoop.hbase.io.crypto.CipherProvider`。
* 將實現添加到服務器類路徑。
* 更新 _hbase-site.xml_ 中的`hbase.crypto.cipherprovider`。
4. 配置 WAL 加密。
通過設置以下屬性,在每個 RegionServer 的 _hbase-site.xml_ 中配置 WAL 加密。您也可以將這些包含在 HMaster 的 _hbase-site.xml_ 中,但是 HMaster 沒有 WAL 并且不會使用它們。
```
<property>
<name>hbase.regionserver.hlog.reader.impl</name>
<value>org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogReader</value>
</property>
<property>
<name>hbase.regionserver.hlog.writer.impl</name>
<value>org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogWriter</value>
</property>
<property>
<name>hbase.regionserver.wal.encryption</name>
<value>true</value>
</property>
```
5. 配置 _hbase-site.xml_ 文件的權限。
由于密鑰庫密碼存儲在 hbase-site.xml 中,因此您需要確保只有 HBase 用戶可以使用文件所有權和權限讀取 _hbase-site.xml_ 文件。
6. 重新啟動群集。
將新配置文件分發到所有節點并重新啟動群集。
#### 64.4.3。管理
管理任務可以在 HBase Shell 或 Java API 中執行。
> Java API
>
> 本節中的 Java API 示例取自源文件 _hbase-server / src / test / java / org / apache / hadoop / hbase / util / TestHBaseFsckEncryption.java_ 。 。
>
> 這些示例以及它們的源文件都不是公共 HBase API 的一部分,僅供參考。有關使用說明,請參閱官方 API。
在列族上啟用加密
要在列族上啟用加密,可以使用 HBase Shell 或 Java API。啟用加密后,觸發主要壓縮。當主要壓縮完成時,HFiles 將被加密。
旋轉數據鍵
要旋轉數據鍵,首先更改列描述符中的 ColumnFamily 鍵,然后觸發主要壓縮。壓縮完成后,將使用新數據密鑰重新加密所有 HFile。在壓縮完成之前,舊的 HFiles 仍然可以使用舊密鑰讀取。
在使用隨機數據密鑰和指定密鑰之間切換
如果您將列族配置為使用特定鍵,并且希望返回使用該列系列的隨機生成的鍵的默認行為,請使用 Java API 更改`HColumnDescriptor`,以便不會發送任何值。鍵`ENCRYPTION_KEY`。
旋轉萬能鑰匙
要旋轉主密鑰,請先生成并分發新密鑰。然后更新 KeyStore 以包含新的主密鑰,并使用不同的別名將舊主密鑰保留在 KeyStore 中。接下來,配置回退到 _hbase-site.xml_ 文件中的舊主密鑰。
### 64.5。安全批量加載
安全模式下的批量加載比正常設置要多一些,因為客戶端必須將 MapReduce 作業生成的文件的所有權轉移到 HBase。安全批量加載由名為 [SecureBulkLoadEndpoint](https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/security/access/SecureBulkLoadEndpoint.html) 的協處理器實現,該協處理器使用由配置屬性`hbase.bulkload.staging.dir`配置的暫存目錄,默認為 _/ tmp / hbase-staging /_ 。
安全批量加載算法
* 僅限一次,創建一個可由世界遍歷并且由運行 HBase 的用戶擁有的暫存目錄(模式 711 或`rwx—?x—?x`)。此目錄的列表將類似于以下內容:
```
$ ls -ld /tmp/hbase-staging
drwx--x--x 2 hbase hbase 68 3 Sep 14:54 /tmp/hbase-staging
```
* 用戶將數據寫入該用戶擁有的安全輸出目錄。例如, _/ user / foo / data_ 。
* 在內部,HBase 創建一個全局可讀/可寫的秘密登臺目錄(`-rwxrwxrwx, 777`)。例如, _/ tmp / hbase-staging / averylongandrandomdirectoryname_ 。此目錄的名稱和位置不會向用戶公開。 HBase 管理此目錄的創建和刪除。
* 用戶使數據具有全局可讀性和全局可寫性,將其移動到隨機登臺目錄中,然后調用`SecureBulkLoadClient#bulkLoadHFiles`方法。
安全性的強度在于秘密目錄的長度和隨機性。
要啟用安全批量加載,請將以下屬性添加到 _hbase-site.xml_ 。
```
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.bulkload.staging.dir</name>
<value>/tmp/hbase-staging</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.token.TokenProvider,
org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint</value>
</property>
```
### 64.6。安全啟用
在 hbase-2.x 之后,默認的'hbase.security.authorization'發生了變化。在 hbase-2.x 之前,它默認為 true,在后來的 HBase 版本中,默認值為 false。因此,要啟用 hbase 授權,必須在 _hbase-site.xml_ 中配置以下屬性。見 [HBASE-19483](https://issues.apache.org/jira/browse/HBASE-19483) ;
```
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
```
## 65.安全配置示例
此配置示例包括對 HFile v3,ACL,可見性標簽以及靜態和 WAL 數據的透明加密的支持。所有選項都在上面的章節中單獨討論過。
示例 20\. _hbase-site.xml_ 中的示例安全設置
```
<!-- HFile v3 Support -->
<property>
<name>hfile.format.version</name>
<value>3</value>
</property>
<!-- HBase Superuser -->
<property>
<name>hbase.superuser</name>
<value>hbase,admin</value>
</property>
<!-- Coprocessors for ACLs and Visibility Tags -->
<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.visibility.VisibilityController,
org.apache.hadoop.hbase.security.token.TokenProvider</value>
</property>
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController,
org.apache.hadoop.hbase.security.visibility.VisibilityController</value>
</property>
<property>
<name>hbase.coprocessor.regionserver.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<!-- Executable ACL for Coprocessor Endpoints -->
<property>
<name>hbase.security.exec.permission.checks</name>
<value>true</value>
</property>
<!-- Whether a user needs authorization for a visibility tag to set it on a cell -->
<property>
<name>hbase.security.visibility.mutations.checkauth</name>
<value>false</value>
</property>
<!-- Secure RPC Transport -->
<property>
<name>hbase.rpc.protection</name>
<value>privacy</value>
</property>
<!-- Transparent Encryption -->
<property>
<name>hbase.crypto.keyprovider</name>
<value>org.apache.hadoop.hbase.io.crypto.KeyStoreKeyProvider</value>
</property>
<property>
<name>hbase.crypto.keyprovider.parameters</name>
<value>jceks:///path/to/hbase/conf/hbase.jks?password=***</value>
</property>
<property>
<name>hbase.crypto.master.key.name</name>
<value>hbase</value>
</property>
<!-- WAL Encryption -->
<property>
<name>hbase.regionserver.hlog.reader.impl</name>
<value>org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogReader</value>
</property>
<property>
<name>hbase.regionserver.hlog.writer.impl</name>
<value>org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogWriter</value>
</property>
<property>
<name>hbase.regionserver.wal.encryption</name>
<value>true</value>
</property>
<!-- For key rotation -->
<property>
<name>hbase.crypto.master.alternate.key.name</name>
<value>hbase.old</value>
</property>
<!-- Secure Bulk Load -->
<property>
<name>hbase.bulkload.staging.dir</name>
<value>/tmp/hbase-staging</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.token.TokenProvider,
org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint</value>
</property>
```
示例 21\. Hadoop _core-site.xml_ 中的示例組映射器
調整這些設置以適合您的環境。
```
<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> <!-- Replace with the actual password -->
</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>(&(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>
```
- HBase? 中文參考指南 3.0
- Preface
- Getting Started
- Apache HBase Configuration
- Upgrading
- The Apache HBase Shell
- Data Model
- HBase and Schema Design
- RegionServer Sizing Rules of Thumb
- HBase and MapReduce
- Securing Apache HBase
- Architecture
- In-memory Compaction
- Backup and Restore
- Synchronous Replication
- Apache HBase APIs
- Apache HBase External APIs
- Thrift API and Filter Language
- HBase and Spark
- Apache HBase Coprocessors
- Apache HBase Performance Tuning
- Troubleshooting and Debugging Apache HBase
- Apache HBase Case Studies
- Apache HBase Operational Management
- Building and Developing Apache HBase
- Unit Testing HBase Applications
- Protobuf in HBase
- Procedure Framework (Pv2): HBASE-12439
- AMv2 Description for Devs
- ZooKeeper
- Community
- Appendix