一、概要
在Ambari頁面啓用Kerberos嚮導成功後,在Kerberos數據庫中,就存放着許多Principal,在/etc/security/keytabs目錄下也存放着很多keytab。這些principal與keytab是一一對應的,可以理解爲鎖與鑰匙的關係。
如果使用各服務的話,就需要進行Kerberos認證了。
準確的說,是開啓了kerberos認證的組件都必須先kinit後纔可以使用,具體權限取決於組件本身的授權機制(ACL/Sentry等)
二、訪問Kerberos數據庫查看principal
- 在kerberos KDC所在機器並且當前用戶是root上操作
訪問Kerberos數據庫:
kadmin.local
查看Kerberos principal:
第一種方式,在kadmin.local模式,直接輸入
listprincs
第二種模式,是不進入kadmin.local模式,使用-q參數,直接獲取principal
kadmin.local -q listprincs
- 當前用戶是非root用戶或在其它機器上操作
我們選擇一臺Kerberos從節點上訪問Kerberos數據庫,先使用kinit進行身份認證:
kinit admin/admin
需要輸入密碼,密碼是你之前創建admin/[email protected]這個principal時侯的密碼
然後再使用kadmin命令來訪問數據庫,這裏也需要輸入你認證admin/admin時候的密碼:
查看principal就和之前的命令一樣了,這裏就不貼圖和贅述了。
- 總結
在Kerberos KDC所在機器並且當前用戶是root操作時,直接可以使用kadmin.local進行訪問數據庫,無需輸入密碼。
在當前用戶是非root用戶或在其它機器上操作時,需要先使用kinit命令認證,然後再使用kadmin命令來訪問數據庫,這裏總共需要輸入兩次密碼。
進入Kerberos數據庫之後,我們可以對數據庫中的principal進行一些操作,這裏先不詳細說明,後面會出這塊的文章。
三、keytab說明
在Ambari頁面啓用Kerberos嚮導成功後,會在/etc/security/keytabs目錄下生成很多keytab密鑰:
這些keytab密鑰與Kerberos數據庫中的principal有着一一對應的關係,就像鑰匙和鎖一樣,我們可以使用klist命令來查看keytab內容,比如查看hdfs.headless.keytab內容:
klist -kte /etc/security/keytabs/hdfs.headless.keytab
由上圖可見,hdfs.headless.keytab就是[email protected]的密鑰,也由此可以得出結論,keytab與principal是一一對應的。
四、kinit認證
這裏採用的是在shell終端上使用命令行進行用戶認證的方案。集羣內所有的節點均可使用以下命令。
Kinit認證有兩種方式,
直接認證Kerberos主體,但需要手動輸入密碼
通過密鑰(keytab)認證Kerberos主體(Principal),不需要手動輸入密碼,但前提是密鑰要與Kerberos主體相匹配。
在理論上來說,使用kinit的任何一種認證方式,只需要認證成功一種就可以任意訪問Hadoop所有服務了。
- 認證自定義用戶訪問集羣服務
1.1 Kerberos認證自定義用戶
1.1.1 創建Linux用戶
在Linux主機上創建用戶,比如lyz,建議在集羣的每個節點上都創建lyz用戶,否則跑集羣任務的時候,有可能會報lyz用戶名不存在的錯誤。
useradd lyz
1.1.2 創建lyz的Kerberos主體
進入kadmin.local模式
kadmin.local
創建principal([email protected])
addprinc lyz
設置密碼
1.1.3 創建keytab文件
使用ktadd命令爲[email protected]創建keytab文件
ktadd -norandkey -k /etc/security/keytabs/lyz.keytab [email protected]
參數說明
-norandkey表示創建keytab時,principal的密碼不發生改變。如果不使用該參數,直接ktadd -k則會修改principal的密碼。
1.1.4 Kerberos認證用戶
方式一:使用之前設定的密碼來認證principal
kinit lyz
輸入[email protected]的密碼
方式二:使用keytab來認證principal
kinit -kt /etc/security/keytabs/lyz.keytab lyz
查看認證緩存
klist
這樣的話,在該主機上的root用戶下執行操作,就是使用的lyz用戶做代理。從理論上來講,Kerberos認證通過以後,lyz用戶可以訪問操作集羣內的任何服務,但是有的服務擁有ACL權限,比如HBase就有嚴格的ACL權限控制,具體如何操作下文具體會講。
以下對各服務的操作,默認都以認證了[email protected]爲前提。
1.2 使用HDFS
HDFS服務組件本身有着嚴格的文件權限控制,如果操作不當,很容易出現Permission denied的錯誤。有兩種解決方案(建議第一種),如下所示:
使用hdfs用戶創建文件,並修改該文件的所屬用戶,這樣可解決權限問題。(建議使用這種方式)
現在我們使用Kerberos認證的lyz用戶來操作HDFS shell。
首先使用hdfs超級用戶創建一個文件夾,並改變其文件夾的所有者。
sudo -u hdfs hadoop fs -mkdir /lyz
sudo -u hdfs hadoop fs -chown lyz:lyz /lyz
關閉HDFS文件權限設置
Web UI --> HDFS配置 --> 搜索dfs.permissions.enabled,將其值改爲false,保存配置,並重啓HDFS組件纔可生效。如下圖所示(但不建議在生產環境中這樣做)
上面我們列舉了兩種解決Permission denied的方案,我們這裏使用第一種。
創建目錄:
hadoop fs -mkdir /lyz/test
上傳文件:
hadoop fs -put /root/a.log /lyz/test
瀏覽文件:
[root@xxx ~]# hadoop fs -ls /lyz/test
Found 1 items
-rw-r--r-- 3 lyz lyz 138370 2019-01-09 20:56 /lyz/test/a.log
[root@xxx ~]#
上傳的文件a.log的所有者爲lyz,這也從側面驗證了Kerberos認證通過之後,是由Kerberos用戶代理的Linux上的用戶操作。
刪除test文件夾:
hadoop fs -rm -r /lyz/test
1.3 使用Mapreduce
再次說明:執行mapreduce任務的前提是集羣內的每個節點上都必須要有lyz這個本地用戶,否則任務會執行失敗。
編輯mptest.txt文件,內容爲:
hello Hadoop
hello big data
hello world!
上傳文件至hdfs並執行mapreduce的計數任務:
hadoop fs -put mptest.txt /lyz
hadoop jar /usr/hdp/2.6.4.0-91/hadoop-mapreduce/hadoop-mapreduce-examples.jar wordcount /lyz/mptest.txt /lyz/output1218
注意:輸入路徑必須在/lyz目錄下,因爲lyz用戶只擁有操作自己所屬文件目錄的權限。
任務執行成功:
[root@xxx ~]# hadoop fs -cat /lyz/output1218/part-r-00000
big 1
data 1
hadoop 1
hello 3
world! 1
1.4 使用hive
由於連接hive時,需要使用的是lyz用戶,所以需要確保在HDFS路徑上的/user/目錄下有lyz文件夾及確保lyz目錄及子目錄的所有者是lyz,如果目錄不存在,則使用以下代碼添加:
sudo -u hdfs hadoop fs -mkdir /user/lyz
sudo -u hdfs hadoop fs -chown lyz:lyz /user/lyz
Hive有兩種連接方式:分別是cli模式和beeline模式。cli模式是通過metaStroe來訪問元數據;beeline模式是通過hiveServer2訪問元數據。建議使用beeline模式連接hive執行操作。
再次說明:執行hive操作的前提是集羣內的每個節點上都必須要有lyz這個本地用戶,因爲hive有些複雜操作會調用TEZ和Mapreduce來執行任務。
Hive cli操作 -- 創建表:
hive
create table if not exists mytable(sid int ,sname string)
row format delimited fields terminated by ' ' stored as textfile;
Beeline操作 -- 查詢表:
(確定hiveserver所在主機,並獲取所在主機的hive的principal)
beeline -u 'jdbc:hive2://<hostname>:10000/default;principal=hive/<hostname>@EXAMPLE.COM'
select count(*) from employee;
1.5 使用HBase
在1.1裏面,我們講解了如何對自定義用戶進行認證,假設我們現在已經有了[email protected]的身份,現在我們來訪問操作HBase。
hbase shell
hbase(main):001:0> create 'hbase_110', {NAME=>'cf1'}, {NAME=>'cf2'}
出現錯誤:
原因分析:
HBase服務啓用Kerberos之後,Ambari也會開啓HBase自身的權限控制。這時候lyz用戶雖然已被認證,但是由於HBase自身還有權限控制,所以還不能執行hbase shell操作,需要使用grant命令對lyz用戶進行授權。
解決方案:
切換用戶至hbase用戶,在其hbase環境下使用hbase.service.keytab進行kerberos認證,
切換用戶
su hbase
kerberos認證
kinit -kt hbase.service.keytab hbase/[email protected]
這樣的話,我們是以HBase超級管理員來訪問操作hbase,現在給lyz服賦予相應的權限:
進入hbase shell
hbase shell
賦予lyz用戶所有權限
grant "lyz", "RWXCA"
PS:有時間會寫一篇關於HBase服務自身的權限控制的文章。
退出hbase用戶:exit
這時候,我們就可以使用lyz用戶對HBase進行操作了。
hbase shell
hbase(main):001:0> create 'hbase_110', {NAME=>'cf1'}, {NAME=>'cf2'}
hbase(main):002:0> put'hbase_110', '001','cf1:name','Tom'
hbase(main):003:0> scan "hbase_110"
1.6 使用Spark & Spark2
實驗目的
加載hdfs上的一個文件,並實現簡單的行數統計及讀取第一行。
注意:當在平臺中,Spark與Spark2並存時,假如你需要使用Spark2,請更改環境變量,具體操作如下所示:
vim /etc/profile
將Spark2的目錄信息添加到環境變量中
export SPARK_HOME=/usr/hdp/2.6.4.0-91/spark2
export PATH=${SPARK_HOME}/bin:${PATH}
source /etc/profile # 重新加載一下全局環境變量,這時候就可以進入Spark2的python模式了
也可以臨時export,export SPARK_HOME=/usr/hdp/2.6.4.0-91/spark2
輸入pyspark進入spark的python模式:
lines = sc.textFile("/lyz/mptest.txt") #讀取hdfs上的文件
lines.count()
3 #返回行數
lines.first()
u'hello hadoop' #輸出第一行信息
exit() #退出python模式
1.7 總結
至此,我們使用了[email protected]這個principal使用了HDFS、Mapreduce、Hive、HBase、Spark等服務,Kerberos相當於是一個單點登陸系統,經過Kerberos認證之後,使用服務的用戶就變成了principal的主名稱部分,即lyz。但是具體權限,還需要由具體服務本身的授權機制(ACL/Sentry等)決定。
- 認證各服務自身用戶訪問集羣服務
在/etc/security/keytabs/目錄,存放着我們的keytab密鑰,該密鑰和Kerberos數據庫的Principal是一一匹配的,我們可以查看keytab的內容,來尋找對應的Principal,然後使用kinit -kt認證。
2.1 使用hdfs用戶來訪問操作HDFS服務
查看hdfs.headless.keytab對應的principal
klist -ket /etc/security/keytabs/hdfs.headless.keytab
kinit -kt /etc/security/keytabs/hdfs.headless.keytab [email protected]
這樣的話,就可以以hdfs用戶的身份使用HDFS了。
2.2 使用hive用戶來訪問HIVE服務
查看hive.service.keytab對應的principal
klist -ket /etc/security/keytabs/hive.service.keytab
kinit -kt /etc/security/keytabs/hive.service.keytab hive/[email protected]
這樣的話,就可以以hive用戶的身份使用HIVE了。
2.3 使用hbase用戶來訪問HBASE服務
查看hbase.service.keytab對應的principal
klist -ket /etc/security/keytabs/hbase.service.keytab
kinit -kt /etc/security/keytabs/hbase.service.keytab hbase/liuyzh3.xdata
這樣的話,就可以以hbase用戶的身份使用HBASE了。
2.4 使用spark用戶訪問SPARK服務
klist -ket /etc/security/keytabs/spark.headless.keytab
kinit -kt /etc/security/keytabs/spark.headless.keytab [email protected]
這樣的話,就可以以spark用戶的身份使用SPARK了。
五、總結
本篇文章主要講解了principal與keytab之間的關係,並詳細講解了Kerberos如何認證用戶,並使用HDFS、Mapreduce、HBase、Hive、Spark服務。