1、KDC創建principal
1.1、創建認證用戶
登陸到kdc服務器,使用root或者可以使用root權限的普通用戶操作:
# kadmin.local -q “addprinc -randkey hbase/yjt”
# kadmin.local -q “addprinc -randkey zookeeper/yjt”
# kadmin.local -q “addprinc -randkey zkcli/yjt”
其中hbase集群有幾台,上面的第一台命令就需要執行幾次,每次執行的時候請把yjt修改成你機器對應的主機名
同理,zookeeper也是一樣
1.2、生成密鑰文件
生成hbase密鑰文件
# kadmin.local -q “xst -norankey -k /etc/hbase.keytab hbase/yjt”
生成zookeeper密鑰文件
# kadmin.local -q “xst -norankey -k /etc/zk.keytab zookeeper/yjt zkcli/yjt”
拷貝hbase.keytab到所有的hbase集群節點的conf目錄下
拷貝zk.keytab到所有zookeeper集群節點的conf目錄下
2、zookeeper操作
2.1、創建jaas.conf文件
在zookeeper的conf目錄下創建或者修改jaas.conf,沒有就創建,配置信息如下:
Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/data1/hadoop/zookeeper/conf/zk.keytab"
storeKey=true
useTicketCache=false
principal="zookeeper/yjt@HADOOP.COM"; #這里注意,如果是多個zookeeper,那么這個principal里面的域名改成對應的主機名,同時在這個server里面,principal必須以zookeeper開頭,也就是principal='zookeeper/hostname@xxx.COM',否則會報服務不能找到錯誤。
};
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/data1/hadoop/zookeeper/conf/zk.keytab"
storeKey=true
useTicketCache=false
principal="zkcli/yjt@HADOOP.COM";
};
2.2、創建java.env文件
在zookeeper的conf目錄下創建或者修改java.env文件,配置信息如下:
export JVMFLAGS="-Djava.security.auth.login.config=/data1/hadoop/zookeeper/conf/jaas.conf"
2.3、修改zoo.cfg文件
添加如下屬性:
kerberos.removeHostFromPrincipal=true kerberos.removeRealmFromPrincipal=true authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider jaasLoginRenew=3600000
2.4、測試zookeeper kerberos
首先啟動zookeeper集群,然后使用zkcli -server IP:端口(注意,一定要以這種方式)測試
如下:zkCli.sh -server yjt:2181
在輸出的信息中,最下面如果能找到類似下面這樣的信息,就代表配置成功:
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
WATCHER::
WatchedEvent state:SaslAuthenticated type:None path:null
在使用zkCli.sh連接zookeeper的時候,這里貼一下錯誤信息:
WatchedEvent state:SyncConnected type:None path:null 2019-11-20 12:49:55,971 [myid:] - ERROR [main-SendThread(rslog084:2181):ZooKeeperSaslClient@308] - An error: (java.security.PrivilegedActionException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - LOOKING_UP_SERVER)]) occurred when evaluating Zookeeper Quorum Member's received SASL token. Zookeeper Client will go to AUTH_FAILED state. 2019-11-20 12:49:55,971 [myid:] - ERROR [main-SendThread(rslog084:2181):ClientCnxn$SendThread@1076] - SASL authentication with Zookeeper Quorum member failed: javax.security.sasl.SaslException: An error: (java.security.PrivilegedActionException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - LOOKING_UP_SERVER)]) occurred when evaluating Zookeeper Quorum Member's received SASL token. Zookeeper Client will go to AUTH_FAILED state.
造成上述原因是由於服務端principal主體錯誤,可能錯誤的原因如下:
1、在jaas.conf文件中,principal主體錯誤,正確的主體名稱格式: zookeeper/<hostname>@<realm>
2、當采用zkCli.sh 的方式請求中,默認的host應該是localhost,因此在kdc中才會發現客戶端的請求和 zookeeper/localhost@NETEASE.COM 這個principal進行認證,但是在kerberos的database中卻沒有這個principal。
解決方法: 使用zkCli.sh -server host:port 訪問。 同時zookeeper配置文件中sever部分的principal必須為zookeeper/<hostname>@<your realm>
3、hbase配置
3.1、配置hbase-site.xml
添加如下配置:
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hbase.rpc.engine</name>
<value>org.apache.hadoop.hbase.ipc.SecureRpcEngine</value>
</property>
<property>
<name>hbase.regionserver.kerberos.principal</name>
<value>hbase/_HOST@HADOOP.COM</value>
</property>
<property>
<name>hbase.regionserver.keytab.file</name>
<value>/data1/hadoop/hbase/conf/hbase.keytab</value>
</property>
<property>
<name>hbase.master.kerberos.principal</name>
<value>hbase/_HOST@HADOOP.COM</value>
</property>
<property>
<name>hbase.master.keytab.file</name>
<value>/data1/hadoop/hbase/conf/hbase.keytab</value>
</property>
3.2、啟動hbase
# start-hbase.sh
進去到hbase的客戶端
# hbase shell
查看當前存在的表
hbase(main):001:0> list
TABLE
0 row(s) in 0.3550 seconds
=> []
如果上述的輸出沒有報錯,說明配置成功
注:hadoop版本在2.6以上數據傳輸才能使用sasl方式,而hbase又得版本集成Hadoop的版本低於2.6,會導致hbase失敗,我在使用hadoop2.9.2,hbase1.3.1測試的時候,就報如下錯誤:
2019-10-24 15:04:12,325 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Failed to read expected SASL data transfer protection handshake from client at /192.168.0.230:48326. Perhaps the client is running an older version of Hadoop which does not support SASL data transfer protection
2019-10-24 15:05:02,352 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Failed to read expected SASL data transfer protection handshake from client at /192.168.0.230:48346. Perhaps the client is running an older version of Hadoop which does not support SASL data transfer protection
2019-10-24 15:05:12,418 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Failed to read expected SASL data transfer protection handshake from client at /192.168.0.230:48352. Perhaps the client is running an older version of Hadoop which does not support SASL data transfer protection
2019-10-24 15:05:22,461 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Failed to read expected SASL data transfer protection handshake from client at /192.168.0.230:48356. Perhaps the client is running an older version of Hadoop which does not support SASL data t
解決辦法:
(1) 、使用高版本的hbase
(2) 、把高版本的hbase下面的lib庫里面的文件拷貝到低版本的hbase lib庫里面,當然,先要刪除低版本hbase lib庫里面的關於hadoop相關的軟件報。
3.2、測試
(1)、在集群內部進入到shell,輸入命令為 hbase shell
創建表:
# create ‘test’, ‘c1’
如果能成功創建說明沒問題
(2)、咋集群內部使用phoenix連接測試
在使用Kerberos以后,phoenix連接hbase的方式有兩種:
第一種:查看當前是否存在票據
出現上面的信息,說明是存在票據的,所以,這個時候可以使用:
jdbc:phoenix:<quorom>:<port> 方式連接
如下:
# ./sqlline.py yjt:2181 其實就跟原先的連接方法一樣。
第二種:不存在票據
jdbc:phoenix:<quorom>:<port>:[zk_rootNode]:<principal>:<keytab>
# ./sqlline.py yjt:2181:hbase/yjt:/data1/hadoop/hbase/conf/hbase.keytab
如果出現上述,說明成功。
在測試的時候,由於配置不當,導致在集群內部測試時失敗,錯誤日志如下:
解決辦法:這是由於配置完hbase Kerberos以后,沒有把hbase-iste.xml拷貝到phoenix的bin目錄下覆蓋原來的配置文件,導致失敗。
(3) 、hbase客戶端測試
- 從集群拷貝hbase的目錄到客戶端,注意:hbase的根目錄最好一致,這樣就不用修改hbase-site.xml文件里面的密鑰路徑了。如下:
Hbase集群(隨便選一台)上面操作,操作用戶為hduser,下面的192.168.0.9為集群的客戶端:
# scp -r /data1/hadoop/hbase 192.168.0.9:/data1/hadoop
- 拷貝zookeeper密鑰
Hbase依賴與zookeeper連接,所以,需要把zookeeper的密鑰文件從zookeeper集群拷貝到客戶端(當然,可以拷貝整個目錄到客戶端,這樣還可以測試zookeeper的客戶端是否可以正常使用,當hbase錯問題的時候,可以排查是否是zookeeper導致的),zookeeper的密鑰存放與客戶端的/data1/hadoop/zookeeper/conf下(這個目錄隨意,只需要這個目錄與hbase/conf下面的zk-jaas.conf文件里面的密鑰存放路徑統一就行),如下:
# scp /data1/hadoop/zookeeper/conf/zk.keytab 192.168.0.9:/data1/hadoop/zookeeper/conf
- 拷貝hadoop到客戶端
同理,hbase依賴與Hadoop存儲數據,所以需要與Hadoop進行交互,這里拷貝Hadoop的配置到客戶端,如下:
# scp -r /data1/hadoop/hadoop 192.168.0.9:/data1/hadoop
同時,還需要拷貝jdk(如果客戶端存在,也可以不用拷貝,但是,jdk的目錄不一樣的話,需要修改hbase,hadoop環境變量內部的java屬性)
# scp -r /data1/hadoop/jdk 192.168.0.9:/data1/jdk
- 配置hbase、zookeeper、Hadoop的環境變量
修改當前用戶的.bashrc文件,我當前的用戶是hduser
# vim /home/hduser/.bashrc 修改如下:
export HBASE_HOME=/data1/hadoop/hbase
export PATH=${HBASE_HOME}/bin:${PATH}
export ZOOK_HOME=/data1/hadoop/zookeeper
export PATH=${ZOOK_HOME}/bin:$PATH
export HADOOP_HOME=/data1/hadoop/hadoop
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
注意:這里一定要設置Hadoop的環境變量,如果Hadoop環境變量設置錯誤,或者沒有設置,將會報如下的錯誤:
Caused by: GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
FATAL [main] ipc.RpcClientImpl: SASL authentication failed. The most likely cause is missing or invalid credentials. Consider 'kinit'.
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
出現上述錯誤的原因有如下幾點:
第一點:沒有使用kinit獲取tgt;
第二點:沒有正確配置kerberos配置文件;
第三點:客戶端與集群時間不一致(時間相差超過5分鍾);
第四點:客戶端使用的jar包與集群不一致;
第五點:Hadoop環境變量未正確設置。
如果在集群內部可以正常的使用hbase shell,但是在客戶端不行,可以在客戶端打開調試模式,如下:
在測試之前,先獲取票據:
# kinit /data1/hadoop/hbase/conf/hbase.keytab hbase/yjt
# klist (查看票據)
# exprot HBASE_ROOT_LOGGER=DEBUG,console
# hbase shell
使用list列出當前存在的表,如果正常列出,說明客戶端配置成功。當然也可以使用創建表的方式測試,如下:
hbase(main):002:0> create 'ns1:t2', 'f2'
注:ns1是表空間,如果不存在,可以使用create_namespace 'ns1' 創建
(4) 、客戶端使用phoenix連接測試
- 客戶端Phoenix配置(不多說),可以從集群內部拷貝。
- 測試phoenix,使用 ./sqlline.py yjt:2181 連接到集群。
注:上述用戶都是使用hduser用戶測試的,這個用戶同時也是啟動集群的用戶,接下來創建不同的用戶測試。
3.3、客戶端使用不同用戶測試
測試hbase shell
(1)、創建普通用戶yujt
(2)、echo ‘123456’ |passwd --stdin ‘yujt’
(3)、su - yujt
(4)、配置hadoop、jdk環境變量
(5)、hbase shell 測試
測試phoenix
Ok