zookeeper、hbase集成kerberos


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目錄下

2zookeeper操作

2.1、創建jaas.conf文件

zookeeperconf目錄下創建或者修改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文件

zookeeperconf目錄下創建或者修改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>

 

3hbase配置

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.2hbase1.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拷貝到phoenixbin目錄下覆蓋原來的配置文件,導致失敗。

 

(3) hbase客戶端測試

  1. 從集群拷貝hbase的目錄到客戶端,注意:hbase的根目錄最好一致,這樣就不用修改hbase-site.xml文件里面的密鑰路徑了。如下:

Hbase集群(隨便選一台)上面操作,操作用戶為hduser,下面的192.168.0.9為集群的客戶端:

# scp -r /data1/hadoop/hbase 192.168.0.9:/data1/hadoop

  1. 拷貝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

  1. 拷貝hadoop到客戶端

同理,hbase依賴與Hadoop存儲數據,所以需要與Hadoop進行交互,這里拷貝Hadoop的配置到客戶端,如下:

# scp -r /data1/hadoop/hadoop  192.168.0.9:/data1/hadoop

同時,還需要拷貝jdk(如果客戶端存在,也可以不用拷貝,但是,jdk的目錄不一樣的話,需要修改hbasehadoop環境變量內部的java屬性)

# scp -r /data1/hadoop/jdk 192.168.0.9:/data1/jdk  

  1. 配置hbasezookeeperHadoop的環境變量

修改當前用戶的.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連接測試

  1. 客戶端Phoenix配置(不多說),可以從集群內部拷貝。
  2. 測試phoenix,使用 ./sqlline.py yjt:2181 連接到集群。

 

 

 

 

注:上述用戶都是使用hduser用戶測試的,這個用戶同時也是啟動集群的用戶,接下來創建不同的用戶測試。

3.3、客戶端使用不同用戶測試

測試hbase shell

(1)、創建普通用戶yujt

(2)echo ‘123456’ |passwd --stdin ‘yujt’

(3)su - yujt

(4)、配置hadoopjdk環境變量

(5)hbase shell  測試

 

 

 

 

 

測試phoenix

 

 

 

 

 

 

 

Ok


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM