W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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ū)別,兩者都將折疊為已放置。
HBase訪問級(jí)別是相互獨(dú)立授予的,并允許在給定范圍內(nèi)進(jìn)行不同類型的操作。
可能的范圍是:
訪問級(jí)別和作用域的組合創(chuàng)建了可授予用戶的可能訪問級(jí)別的矩陣。在生產(chǎn)環(huán)境中,根據(jù)執(zhí)行特定工作所需的內(nèi)容來考慮訪問級(jí)別很有用。以下列表描述了一些常見類型的HBase用戶的適當(dāng)訪問級(jí)別。重要的是不要授予比給定用戶執(zhí)行其所需任務(wù)所需的更多訪問權(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)。
級(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í)行操作。 |
單元級(jí)ACL使用標(biāo)簽(tag)實(shí)現(xiàn)(請(qǐng)參閱HBase:標(biāo)簽)。為了使用單元級(jí)別的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設(shè)置為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
管理任務(wù)可以從HBase Shell或通過API執(zhí)行。
grant 'user', 'RWXCA', 'TABLE', 'CF', 'CQ'
組和用戶以相同的方式被授予訪問權(quán)限,但組前綴有一個(gè)@符號(hào)。以相同的方式,表和名稱空間以相同的方式指定,但名稱空間前綴有一個(gè)@符號(hào)。
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選項(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)。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))
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號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: