Kerberos實戰

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

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

2、訪問Kerberos數據庫查看principal數據庫

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

kadmin.localvim

查看Kerberos principal:緩存

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

listprincsless

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

kadmin.local -q listprincside

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

kinit admin/adminoop

須要輸入密碼,密碼是你以前建立admin/admin@EXAMPLE.COM這個principal時侯的密碼

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

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

  1. 總結
    在Kerberos KDC所在機器而且當前用戶是root操做時,直接可使用kadmin.local進行訪問數據庫,無需輸入密碼。

在當前用戶是非root用戶或在其它機器上操做時,須要先使用kinit命令認證,而後再使用kadmin命令來訪問數據庫,這裏總共須要輸入兩次密碼。

進入Kerberos數據庫以後,咱們能夠對數據庫中的principal進行一些操做,這裏先不詳細說明,後面會出這塊的文章。

3、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就是hdfs-mycluster@EXAMPLE.COM的密鑰,也由此能夠得出結論,keytab與principal是一一對應的。
4、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(lyz@EXAMPLE.COM)

addprinc lyz

設置密碼

1.1.3 建立keytab文件
使用ktadd命令爲lyz@EXAMPLE.COM建立keytab文件

ktadd -norandkey -k /etc/security/keytabs/lyz.keytab lyz@EXAMPLE.COM

參數說明

-norandkey表示建立keytab時,principal的密碼不發生改變。若是不使用該參數,直接ktadd -k則會修改principal的密碼。

1.1.4 Kerberos認證用戶
方式一:使用以前設定的密碼來認證principal

kinit lyz

輸入lyz@EXAMPLE.COM的密碼

方式二:使用keytab來認證principal

kinit -kt /etc/security/keytabs/lyz.keytab lyz
查看認證緩存

klist

這樣的話,在該主機上的root用戶下執行操做,就是使用的lyz用戶作代理。從理論上來說,Kerberos認證經過之後,lyz用戶能夠訪問操做集羣內的任何服務,可是有的服務擁有ACL權限,好比HBase就有嚴格的ACL權限控制,具體如何操做下文具體會講。

如下對各服務的操做,默認都以認證了lyz@EXAMPLE.COM爲前提。

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裏面,咱們講解了如何對自定義用戶進行認證,假設咱們如今已經有了lyz@EXAMPLE.COM的身份,如今咱們來訪問操做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/liuyzh1.xdata@EXAMPLE.COM
這樣的話,咱們是以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 總結
至此,咱們使用了lyz@EXAMPLE.COM這個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 hdfs-xxxtest@EXAMPLE.COM

這樣的話,就能夠以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/liuyzh3.xdata@EXAMPLE.COM

這樣的話,就能夠以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 spark-xxxtest@EXAMPLE.COM

這樣的話,就能夠以spark用戶的身份使用SPARK了。

5、總結本篇文章主要講解了principal與keytab之間的關係,並詳細講解了Kerberos如何認證用戶,並使用HDFS、Mapreduce、HBase、Hive、Spark服務。

相關文章
相關標籤/搜索