1、概要
在Ambari頁面啓用Kerberos嚮導成功後,在Kerberos數據庫中,就存放着許多Principal,在/etc/security/keytabs目錄下也存放着不少keytab。這些principal與keytab是一一對應的,能夠理解爲鎖與鑰匙的關係。
若是使用各服務的話,就須要進行Kerberos認證了。python
準確的說,是開啓了kerberos認證的組件都必須先kinit後纔可使用,具體權限取決於組件自己的受權機制(ACL/Sentry等)shell
2、訪問Kerberos數據庫查看principal數據庫
kadmin.localvim
查看Kerberos principal:緩存
listprincsless
kadmin.local -q listprincside
kinit admin/adminoop
而後再使用kadmin命令來訪問數據庫,這裏也須要輸入你認證admin/admin時候的密碼:spa
查看principal就和以前的命令同樣了,這裏就不貼圖和贅述了。命令行
在當前用戶是非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全部服務了。
useradd lyz
1.1.2 建立lyz的Kerberos主體
kadmin.local
addprinc lyz
1.1.3 建立keytab文件
使用ktadd命令爲lyz@EXAMPLE.COM建立keytab文件
ktadd -norandkey -k /etc/security/keytabs/lyz.keytab lyz@EXAMPLE.COM
1.1.4 Kerberos認證用戶
方式一:使用以前設定的密碼來認證principal
kinit lyz
方式二:使用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
kinit -kt hbase.service.keytab hbase/liuyzh1.xdata@EXAMPLE.COM
這樣的話,咱們是以HBase超級管理員來訪問操做hbase,如今給lyz服賦予相應的權限:
hbase shell
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
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等)決定。
2.1 使用hdfs用戶來訪問操做HDFS服務
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服務
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服務
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服務。