Kerberos實戰

一、概要
在Ambari頁面啓用Kerberos嚮導成功後,在Kerberos數據庫中,就存放着許多Principal,在/etc/security/keytabs目錄下也存放着很多keytab。這些principal與keytab是一一對應的,可以理解爲鎖與鑰匙的關係。
如果使用各服務的話,就需要進行Kerberos認證了。

準確的說,是開啓了kerberos認證的組件都必須先kinit後纔可以使用,具體權限取決於組件本身的授權機制(ACL/Sentry等)

二、訪問Kerberos數據庫查看principal

  1. 在kerberos KDC所在機器並且當前用戶是root上操作
    訪問Kerberos數據庫:

kadmin.local

查看Kerberos principal:

第一種方式,在kadmin.local模式,直接輸入

listprincs

第二種模式,是不進入kadmin.local模式,使用-q參數,直接獲取principal

kadmin.local -q listprincs

  1. 當前用戶是非root用戶或在其它機器上操作
    我們選擇一臺Kerberos從節點上訪問Kerberos數據庫,先使用kinit進行身份認證:

kinit admin/admin

需要輸入密碼,密碼是你之前創建admin/[email protected]這個principal時侯的密碼

然後再使用kadmin命令來訪問數據庫,這裏也需要輸入你認證admin/admin時候的密碼:

查看principal就和之前的命令一樣了,這裏就不貼圖和贅述了。

  1. 總結
    在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.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等)決定。

  1. 認證各服務自身用戶訪問集羣服務
    在/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服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章