W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
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)進行不同類型的操作。
可能的范圍是:
訪問級別和作用域的組合創(chuàng)建了可授予用戶的可能訪問級別的矩陣。在生產(chǎn)環(huán)境中,根據(jù)執(zhí)行特定工作所需的內(nèi)容來考慮訪問級別很有用。以下列表描述了一些常見類型的HBase用戶的適當訪問級別。重要的是不要授予比給定用戶執(zhí)行其所需任務所需的更多訪問權限。
在當前的實現(xiàn)中,具有Admin權限的全局管理員可以在桌上授予自己Read和Write權限并獲得對該表的數(shù)據(jù)的訪問權限。出于這個原因,只向?qū)嶋H需要的受信任用戶授予全局管理員權限。另請注意,具有Create權限的全局管理員可以在ACL表上執(zhí)行Put操作,模擬授予或吊銷并繞過對全局管理權限的授權檢查。由于這些問題,請謹慎授予全局管理員特權。
級別 | 范圍 | 權限 | 描述 |
---|---|---|---|
高級管理員 |
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í)行操作。 |
單元級ACL使用標簽(tag)實現(xiàn)(請參閱HBase:標簽)。為了使用單元級別的ACL,您必須使用HFile v3和HBase 0.98或更高版本。
<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或更高版本。<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>
hbase> whoami
service (auth:KERBEROS)
groups: services
管理任務可以從HBase Shell或通過API執(zhí)行。
grant 'user', 'RWXCA', 'TABLE', 'CF', 'CQ'
組和用戶以相同的方式被授予訪問權限,但組前綴有一個@符號。以相同的方式,表和名稱空間以相同的方式指定,但名稱空間前綴有一個@符號。
hbase> grant '@admins', 'RWXCA'
Namespace:
hbase> grant'service','RWXCA','@ test-NS'
hbase> grant 'service', 'RWXCA', 'user'
hbase> grant '@developers', 'RW', 'user', 'i'
hbase> grant 'service, 'RW', 'user', 'i', 'foo'
grant <table>, \
{ '<user-or-group>' => \
'<permissions>', ... }, \
{ <scanner-specification> }
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重寫找到的單元格,并將其存儲回其確切的坐標。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))
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;
}
});
}
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<?>) {
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");
}
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: