hbase1.1.1 连接集群_Hadoop2.7.1+Hbase1.1.2集群环境搭建(10) hadoop hbase kerberos
1.hadoop安全機(jī)制歷史
在Hadoop1.0.0或者CDH3 版本之前, hadoop并不存在安全認(rèn)證一說。默認(rèn)集群內(nèi)所有的節(jié)點(diǎn)都是可靠的,值得信賴的。用戶與HDFS或者M(jìn)/R進(jìn)行交互時并不需要進(jìn)行驗(yàn)證。導(dǎo)致存在惡意用戶偽裝成真正的用戶或者服務(wù)器入侵到hadoop集群上,惡意的提交作業(yè),修改JobTracker狀態(tài),篡改HDFS上的數(shù)據(jù),偽裝成NameNode 或者TaskTracker接受任務(wù)等。 盡管在版本0.16以后, HDFS增加了文件和目錄的權(quán)限,但是并沒有強(qiáng)認(rèn)證的保障,這些權(quán)限只能對偶然的數(shù)據(jù)丟失起保護(hù)作用。惡意的用戶可以輕易的偽裝成其他用戶來篡改權(quán)限,致使權(quán)限設(shè)置形同虛設(shè)。不能夠?qū)adoop集群起到安全保障。
在Hadoop1.0.0或者CDH3版本后,加入了Kerberos認(rèn)證機(jī)制。使得集群中的節(jié)點(diǎn)就是它們所宣稱的,是信賴的。Kerberos可以將認(rèn)證的密鑰在集群部署時事先放到可靠的節(jié)點(diǎn)上。集群運(yùn)行時,集群內(nèi)的節(jié)點(diǎn)使用密鑰得到認(rèn)證。只有被認(rèn)證過節(jié)點(diǎn)才能正常使用。企圖冒充的節(jié)點(diǎn)由于沒有事先得到的密鑰信息,無法與集群內(nèi)部的節(jié)點(diǎn)通信。防止了惡意的使用或篡改Hadoop集群的問題,確保了Hadoop集群的可靠安全。
2.Hadoop面臨的安全問題
2.1 ?用戶到服務(wù)器的認(rèn)證問題
1)NameNode,,JobTracker上沒有用戶認(rèn)證
用戶可以偽裝成其他用戶入侵到一個HDFS 或者M(jìn)apReduce集群上。
2)DataNode上沒有認(rèn)證
Datanode對讀入輸出并沒有認(rèn)證。導(dǎo)致如果一些客戶端如果知道block的ID,就可以任意的訪問DataNode上block的數(shù)據(jù)
3)JobTracker上沒有認(rèn)證
可以任意的殺死或更改用戶的jobs,可以更改JobTracker的工作狀態(tài)
2.2 ?服務(wù)器到服務(wù)器的認(rèn)證問題
1)沒有DataNode, TaskTracker的認(rèn)證
用戶可以偽裝成datanode ,tasktracker,去接受JobTracker, Namenode的任務(wù)指派。
3.安全機(jī)制
3.1Java的安全機(jī)制
詳細(xì)介紹請參考JAAS:靈活的Java安全機(jī)制
簡單來說,用戶首先使用LoginContext的接口進(jìn)行登錄驗(yàn)證。LoginContext可以配置使用不同的驗(yàn)證協(xié)議。驗(yàn)證通過后,用戶得到一個subject,里面包含憑證,公私鑰等。之后,在涉及到需要進(jìn)行權(quán)限認(rèn)證的地方(例如,資源訪問,外部鏈接校驗(yàn),協(xié)議訪問等),使用doAs函數(shù)()代替直接執(zhí)行。
這樣,java的權(quán)限認(rèn)證就和用戶的業(yè)務(wù)邏輯分離了。
//一段典型的代碼如下
LoginContext lc = new LoginContext("MyExample");
try {
lc.login();
} catch (LoginException) {
// Authentication failed.
}
// Authentication successful, we can now continue.
// We can use the returned Subject if we like.
Subject sub = lc.getSubject();
Subject.doAs(sub, new MyPrivilegedAction());
3.2Kerberos認(rèn)證協(xié)議
Kerberos是一種網(wǎng)絡(luò)認(rèn)證協(xié)議,其設(shè)計(jì)目標(biāo)是通過密鑰系統(tǒng)為客戶機(jī) / 服務(wù)器應(yīng)用程序提供強(qiáng)大的認(rèn)證服務(wù)。
簡單介紹
使用Kerberos時,一個客戶端需要經(jīng)過三個步驟來獲取服務(wù):
認(rèn)證:客戶端向認(rèn)證服務(wù)器發(fā)送一條報文,并獲取一個含時間戳的Ticket-Granting Ticket(TGT)。
授權(quán):客戶端使用TGT向Ticket-Granting Server(TGS)請求一個服務(wù)Ticket。
服務(wù)請求:客戶端向服務(wù)器出示服務(wù)Ticket,以證實(shí)自己的合法性。該服務(wù)器提供客戶端所需服務(wù),在Hadoop應(yīng)用中,服務(wù)器可以是namenode或jobtracker。
為此,Kerberos需要The Key Distribution Centers(KDC)來進(jìn)行認(rèn)證。KDC只有一個Master,可以帶多個slaves機(jī)器。slaves機(jī)器僅進(jìn)行普通驗(yàn)證。Mater上做的修改需要自動同步到slaves。
另外,KDC需要一個admin,來進(jìn)行日常的管理操作。這個admin可以通過遠(yuǎn)程或者本地方式登錄。
4.Hadoop ?Kerberos安全機(jī)制安裝
安裝這里就不講解了,網(wǎng)上資料一大堆
5.kerberos安裝后,hbase客戶端鏈接的變化
5.1 客戶端鏈接kerberos的準(zhǔn)備
一臺機(jī)器叫hbaseclient.com,首先在其上安裝kerberos客戶端,安裝后連接kadmin工具創(chuàng)建用戶test,并生成keytab文件
kinit admin/admin
kadmin: addprinc -randkey test
kadmin: xst -k test.keytab test
5.2 未安裝kerberos之前,hbase客戶端鏈接代碼
public class Test1 {
public static void main(String[] args) throws IOException {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "zookeeperserver1,zookeeperserver2,zookeeperserver3");
conf.set("hbase.zookeeper.property.clientPort", "2181");
HTable t = new HTable(conf, "test");
Scan s = new Scan();
ResultScanner rs = t.getScanner(s);
try{
for(Result r:rs){
for(Cell cell:r.rawCells()){
System.out.println("Row: "+new String(CellUtil.cloneRow(cell)));
System.out.println("CF: "+new String(CellUtil.cloneFamily(cell)));
System.out.println("Qualifier: "+new String(CellUtil.cloneQualifier(cell)));
System.out.println("Value: "+new String(CellUtil.cloneValue(cell)));
}
}
}finally{
t.close();
}
System.out.println("Done!");
}
5.3 安裝kerberos之后,hbase客戶端鏈接代碼
public class Test1 {
public static void main(String[] args) throws IOException {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "zookeeperserver1,zookeeperserver2,zookeeperserver3");
conf.set("hbase.zookeeper.property.clientPort", "2181");
conf.set("hadoop.security.authentication", "kerberos");
UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab("hbaseclient.com", "/home/test/test.keytab");
HTable t = new HTable(conf, "test");
Scan s = new Scan();
ResultScanner rs = t.getScanner(s);
try{
for(Result r:rs){
for(Cell cell:r.rawCells()){
System.out.println("Row: "+new String(CellUtil.cloneRow(cell)));
System.out.println("CF: "+new String(CellUtil.cloneFamily(cell)));
System.out.println("Qualifier: "+new String(CellUtil.cloneQualifier(cell)));
System.out.println("Value: "+new String(CellUtil.cloneValue(cell)));
}
}
}finally{
t.close();
}
System.out.println("Done!");
}
6.spring-data-hadoop中如何使用kerberos
6.1 kerberos安裝之前配置
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:hdp="http://www.springframework.org/schema/hadoop"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/hadoop
http://www.springframework.org/schema/hadoop/spring-hadoop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
fs.defaultFS=hdfs://master:9000/
6.2 kerberos安裝之后配置
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:hdp="http://www.springframework.org/schema/hadoop"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/hadoop
http://www.springframework.org/schema/hadoop/spring-hadoop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
fs.defaultFS=hdfs://master:9000/
hadoop.security.authentication=kerberos
hadoop.security.authorization=true
keyTab=/home/test/test.keytab
principal=hbaseclient.com
7.以上配置是參見hadoop-common-2.6.0.jar中源碼org.apache.hadoop.security.UserGroupInformation.java得知
8.參考資料
總結(jié)
以上是生活随笔為你收集整理的hbase1.1.1 连接集群_Hadoop2.7.1+Hbase1.1.2集群环境搭建(10) hadoop hbase kerberos的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows API入门系列之七 -完
- 下一篇: Windows编程一日一练(1)