h3c使用acl控制ftp訪問_HBase訪問控制標籤(ACL)
技術標籤:h3c使用acl控制ftp訪問
HBase中的ACL基於使用者的成員身份或組中的排除,以及給定組訪問給定資源的許可權。ACL是作為一個稱為AccessController的協處理器實現的。
HBase不維護私有組對映,但依賴於Hadoop組對映器,它對映目錄中的實體(LDAP或Active Directory)和HBase使用者。任何支援的Hadoop組對映器都將起作用。然後,針對資源(全域性,名稱空間,表格,單元或端點)授予使用者特定的許可權(讀取,寫入,執行,建立,管理)。
啟用Kerberos和訪問控制後,客戶端對HBase的訪問將得到驗證,並且使用者資料是專用的,除非明確授予訪問許可權。
與關係資料庫相比,HBase具有更簡單的安全模型,特別是在客戶端操作方面。例如,插入(新記錄)和更新(現有記錄)之間沒有區別,兩者都將摺疊為已放置。
瞭解訪問級別
HBase訪問級別是相互獨立授予的,並允許在給定範圍內進行不同型別的操作。
- 讀取(R) - 可以讀取給定範圍的資料。
- 寫入(W) - 可以在給定範圍寫入資料。
- 執行(X) - 可以在給定範圍內執行協處理器端點。
- 建立(C) - 可以在給定範圍內建立表或刪除表(甚至不建立它們)。
- 管理員(A) - 可以執行群集操作,例如在給定的範圍內平衡群集或分配區域。
可能的範圍是:
- 超級使用者(Superuser):Superuser可以執行HBase中可用的任何操作,以訪問任何資源。在你的叢集上執行HBase的使用者就是superuser,就像所有指定給HMaster中的hbase-site.xml的hbase.superuser配置屬性。
- 全域性(Global):在全域性範圍授予的許可權允許管理員對叢集的所有表進行操作。
- 名稱空間(Namespace):在名稱空間範圍授予的許可權適用於給定名稱空間內的所有表。
- 表(Table):在表範圍授予的許可權適用於給定表中的資料或元資料。
- ColumnFamily:在ColumnFamily範圍內授予的許可權適用於該ColumnFamily內的單元格。
- 單元格(Cell):在單元格範圍內授予的許可權適用於該確切的單元格座標(鍵,值,時間戳)(key, value, timestamp)。這允許政策與資料一起發展。 要更改特定單元格上的ACL,請使用新ACL寫入更新後的單元格,以獲得原始座標的精確座標。 如果您有多版本架構並且想要更新所有可見版本的ACL,則需要為所有可見版本編寫新的單元格。該應用程式可以完全控制政策演變。 唯一的例外上述規則append和increment處理。追加和增量可以在操作中攜帶ACL。如果操作中包含一個,那麼它將應用於appendor和increment的結果。否則,儲存您正在追加或增加的現有單元的ACL。
訪問級別和作用域的組合建立了可授予使用者的可能訪問級別的矩陣。在生產環境中,根據執行特定工作所需的內容來考慮訪問級別很有用。以下列表描述了一些常見型別的HBase使用者的適當訪問級別。重要的是不要授予比給定使用者執行其所需任務所需的更多訪問許可權。
- 超級使用者(Superusers):在生產系統中,只有HBase使用者應具有超級使用者訪問許可權。在開發環境中,管理員可能需要超級使用者訪問才能快速控制和管理群集。但是,這種型別的管理員通常應該是全域性管理員而不是超級使用者。
- 全域性管理員(Global Admins):全域性管理員可以執行任務並訪問HBase中的每個表。在典型的生產環境中,管理員不應具有對錶內資料的讀取或寫入許可權。
- 具有管理員許可權的全域性管理員可以在群集上執行群集範圍的操作,例如平衡、分配或取消分配區域或呼叫明確的主要壓縮。這是一個操作角色。
具有管理員許可權的全域性管理員可以建立或刪除HBase中的任何表。這更像是一個DBA型別的角色。在生產環境中,不同的使用者可能只有一個管理員許可權和建立許可權。在當前的實現中,具有Admin許可權的全域性管理員可以在桌上授予自己Read和Write許可權並獲得對該表的資料的訪問許可權。出於這個原因,只向實際需要的受信任使用者授予全域性管理員許可權。另請注意,具有Create許可權的全域性管理員可以在ACL表上執行Put操作,模擬授予或吊銷並繞過對全域性管理許可權的授權檢查。由於這些問題,請謹慎授予全域性管理員特權。
- 名稱空間管理員(Namespace Admins):具有Create許可權的名稱空間管理員可以在該名稱空間內建立或刪除表,並獲取和恢復快照。具有Admin許可權的名稱空間管理員可以對該名稱空間內的表執行操作,例如拆分或主要壓縮。
- 表管理員(Table Admins):表管理員只能在該表上執行管理操作。具有Create許可權的表管理員可以從該表建立快照或從快照中恢復該表。具有Admin許可權的表管理員可以在該表上執行操作:例如拆分或主要壓縮。
- 使用者(Users):使用者可以讀取或寫入資料,或兩者兼有。如果授予Executable許可權,使用者還可以執行協處理器端點。
訪問級別的實際示例
實現細節
單元級ACL使用標籤(tag)實現(請參閱HBase:標籤)。為了使用單元級別的ACL,您必須使用HFile v3和HBase 0.98或更高版本。
- 由HBase建立的檔案由執行HBase程序的作業系統使用者擁有。要與HBase檔案互動,您應該使用API或批量載入功能。
- HBase不在HBase內部建立“roles”。相反,組名可以被授予許可權。這允許通過組成員身份對角色進行外部建模。通過Hadoop組對映服務在HBase外部建立和操作組。
伺服器端配置
1、請先參考基本的伺服器端配置中的步驟。
2、通過在hbase-site.xml中設定以下屬性來安裝和配置AccessController協處理器。這些屬性包含一個類的列表。
如果您使用AccessController以及VisibilityController,則AccessController必須首先位於列表中,因為在這兩個元件都處於活動狀態時,VisibilityController會將其系統表上的訪問控制委派給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檔案。根據您的網站需求進行定製。以下是一個例子:
<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>[email protected]</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
Administration
管理任務可以從HBase Shell或通過API執行。
1、使用者和組管理,在您的目錄中,使用者和組在HBase的外部維護。
2、授予對名稱空間,表格,列族或單元格的訪問許可權 授權語句有幾種不同型別的語法。第一個也是最熟悉的是,表和列族是可選的:
grant 'user', 'RWXCA', 'TABLE', 'CF', 'CQ'
組和使用者以相同的方式被授予訪問許可權,但組字首有一個@符號。以相同的方式,表和名稱空間以相同的方式指定,但名稱空間字首有一個@符號。 也可以在單個語句中針對同一資源授予多個許可權,如本例中所示。第一個子語句將使用者對映到ACL,第二個子語句指定資源。 HBase Shell支援在單元級授予和撤銷訪問許可權用於測試和驗證支援,不應將其用於生產使用,因為它不會將許可權應用於尚不存在的單元。應用單元級別許可權的正確方法是在儲存值時在應用程式程式碼中執行此操作。 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在單元範圍內有意義。
- <scanner-specification>是'scan'shell命令使用的掃描器(scan)規範語法和約定。有關掃描器規格的一些示例,請發出以下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 { t
ry (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支援授予和撤銷訪問許可權用於測試和驗證支援,不應將其用於生產使用,因為它不會將許可權應用於尚不存在的單元。應用單元級許可權的正確方法是在儲存值時在應用程式程式碼中執行此操作。 示例:撤銷對錶的訪問
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<?>) {
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");
}
}