Step by Step 實現(xiàn)基于 Cloudera 5.8.2 的企業(yè)級安全大數(shù)據(jù)平臺 - Kerberos的整合

Kerberos簡介

之前在阿里,非常擔心的一件事就是如果有人拿到了hdfs超級管理員帳號取胎,直接把數(shù)據(jù)rm -rf怎么辦展哭?有了Kerberos,就可以輕松防止這樣的事情發(fā)生闻蛀。Kerberos 協(xié)議實現(xiàn)了比“質(zhì)詢-響應”模式協(xié)議更高的安全性:第一匪傍,在身份驗證過程中,所有的數(shù)據(jù)都使用不同的密碼進行加密觉痛,避免了相關(guān)驗證信息的泄漏役衡;第二,客戶端和服務器會相互驗證對方的身份薪棒,避免了 中間人攻擊 手蝎;第三,客戶端和服務器間的時間差被嚴格限制盗尸,避免了 回放攻擊 柑船。與 WINDOWS 系統(tǒng)中的 用戶安全令牌 類似, Kerberos 服務通過“ 加密的票據(jù)(防止篡改) ”驗證用戶身份和提供用戶訪問權(quán)限泼各; Kerberos 服務可以通過使用 會話密鑰 確保在會話中數(shù)據(jù)的機密性和完整性鞍时。

Kerberos相關(guān)術(shù)語

術(shù)語 簡述
KDC 在啟用 Kerberos 的環(huán)境中,KDC 用于驗證各個模塊
Kerberos KDC Server KDC 所在的機器
Kerberos Client 任何一個需要通過 KDC 認證的機器(或模塊)
Principal 用于驗證一個用戶或者一個 Service 的唯一的標識扣蜻,相當于一個賬號逆巍,需要為其設(shè)置密碼(這個密碼也被稱之為 Key)
Keytab 包含有一個或多個 Principal 以及其密碼的文件
Relam 由 KDC 以及多個 Kerberos Client 組成的網(wǎng)絡(luò)
KDC Admin Account KDC 中擁有管理權(quán)限的賬戶(例如添加、修改莽使、刪除Principal)
Authentication Server (AS) 用于初始化認證锐极,并生成 Ticket Granting Ticket (TGT)
Ticket Granting Server (TGS) 在 TGT 的基礎(chǔ)上生成 Service Ticket。一般情況下 AS 和 TGS 都在 KDC 的 Server 上

Kerberos認證過程

Kerberos 的認證過程如下圖所示芳肌。我們可以簡單的理解為灵再,User 或者 Service 會用 Principal 到 AS 去認證(KRB_AS_REQ)肋层,AS 會返回一個用 Principal Key 加密的 TGT(KRB_AS_REP),這時候只有 AS 和這個 Principal 的使用者可以識別該 TGT翎迁。在拿到加密的 TGT 之后栋猖,User 或者 Service 會使用 Principal 的 Key 來解密 TGT,并使用解密后的 TGT 去 TGS 獲取 Service Ticket(KRB_TGS_REQ, KRB_TGS_REP)汪榔。在 Kerberos 認證的集群中蒲拉,只有拿著這個 Service Ticket 才可以訪問真正的 Server 從而實現(xiàn)自己的業(yè)務邏輯(KRB_AP_REQ, KRB_AP_REP)。一般我們將 TGT 的存放文件痴腌,稱為 Kerberos Confidential 文件雌团,默認的存放目錄為/tmp,文件名則由 krb5cc 和用戶的 id 組成士聪,例如“/tmp/krb5cc_0”為root的 confidential 文件锦援。

圖示:Kerberos 認證過程

Cloudera平臺集成Kerberos

Cloudera提供了非常簡便的Kerberos集成方式,基本做到了自動化部署戚嗅。

系統(tǒng):CentOS 7.2

操作用戶:admin

角色分布如下:

角色 部署節(jié)點 機器類型
KDC, AS, TGS 192.168.1.1 VM
Kerberos Agent 192.168.1.[2-17] VM雨涛、Master、Slave

假設(shè)list_krb_clients文件如下:

192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
192.168.1.8
192.168.1.9
192.168.1.10
192.168.1.11
192.168.1.12
192.168.1.13
192.168.1.14
192.168.1.15
192.168.1.16
192.168.1.17

JDK安裝

此過程網(wǎng)上太多教程懦胞,不復述替久。

Kerberos安裝

在192.168.1.1上安裝服務端:

sudo yum install krb5-server openldap-clients -y

在192.168.1.[2-17]上安裝客戶端:

sudo pssh -h list_krb_clients -P -l admin -A "sudo yum install krb5-devel krb5-workstation -y"

修改配置

修改krb5.conf,請?zhí)鎿QDOMAIN.COM為自定義域名:

[logging] 
default = FILE:/var/log/krb5libs.log 
kdc = FILE:/var/log/krb5kdc.log 
admin_server = FILE:/var/log/kadmind.log

[libdefaults] 
default_realm = DOMAIN.COM 
dns_lookup_realm = false 
dns_lookup_kdc = false 
ticket_lifetime = 24h 
renew_lifetime = 7d 
forwardable = true

[realms] 
DOMAIN.COM = { 
    kdc = 192.168.1.1
    admin_server = 192.168.1.1 
}

[domain_realm] 
.domain.com = DOMAIN.COM 
domain.com = DOMAIN.COM

分發(fā)krb5.conf至所有client:

pscp -h list_krb_clients krb5.conf /tmp
pssh -h list_krb_clients "sudo cp /tmp/krb5.conf /etc"

修改服務端192.168.1.1上的配置文件/var/kerberos/krb5kdc/kdc.conf

[kdcdefaults] 
kdc_ports = 88 
kdc_tcp_ports = 88 

[realms] 
DOMAIN.COM = { 
    master_key_type = aes256-cts 
    acl_file = /var/kerberos/krb5kdc/kadm5.acl 
    dict_file = /usr/share/dict/words 
    admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab 
    supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal 
    max_life = 25h 
    max_renewable_life = 8d 
}

修改服務端192.168.1.1上的配置文件/var/kerberos/krb5kdc/kadm5.acl躏尉,以允許具備匹配條件的admin用戶進行遠程登錄權(quán)限:

*/admin@DOMAIN.COM *

由于要支持Java的aes256-cts算法蚯根,需要Server和Client都安裝JCE,在192.168.1.1上執(zhí)行:

sudo wget http://download.oracle.com/otn-pub/java/jce/8/jce_policy-8.zip
sudo unzip jce_policy-8.zip
sudo mv UnlimitedJCEPolicyJDK8/*.jar $JAVA_HOME/jre/lib/security 
pscp -h list_krb_clients $JAVA_HOME/jre/lib/security/US_export_policy.jar /tmp 
pscp -h list_krb_clients $JAVA_HOME/jre/lib/security/local_policy.jar /tmp 
pssh -h list -l admin -A "sudo cp /tmp/US_export_policy.jar $JAVA_HOME/jre/lib/security/" 
pssh -h list -l admin -A "sudo cp /tmp/local_policy.jar $JAVA_HOME/jre/lib/security/"

創(chuàng)建Kerberos數(shù)據(jù)庫

在192.168.1.1上對數(shù)據(jù)庫進行初始化胀糜,默認的數(shù)據(jù)庫路徑為/var/kerberos/krb5kdc颅拦,如果需要重建數(shù)據(jù)庫,將該目錄下的principal相關(guān)的文件刪除即可教藻,請牢記數(shù)據(jù)庫密碼距帅。

sudo kdb5_util create -r DOMAIN.COM -s

啟動Kerberos服務

在192.168.1.1上執(zhí)行:

# 啟動服務命令
sudo /bin/systemctl start krb5kdc 
sudo /bin/systemctl start kadmin
# 加入開機啟動項
sudo /bin/systemctl enable krb5kdc
sudo /bin/systemctl enable kadmin

創(chuàng)建Kerberos管理員principal

# 需要設(shè)置兩次密碼 
kadmin.local -q "addprinc cdh-master/admin"

principal的名字的第二部分是admin,那么根據(jù)之前配置的acl文件,該principal就擁有administrative privileges括堤,這個賬號將會被CDH用來生成其他用戶/服務的principal碌秸。注意需要先kinit保證已經(jīng)有principal緩存。Kerberos客戶端支持兩種悄窃,一是使用 principal + Password讥电,二是使用 principal + keytab,前者適合用戶進行交互式應用轧抗,例如hadoop fs -ls這種恩敌,后者適合服務,例如yarn的rm横媚、nm等纠炮。

Cloudera整合Kerberos

在此之前月趟,請確保以下前序工作完成:

  • KDC已經(jīng)安裝好并且正在運行
  • 將KDC配置為允許renewable tickets with non-zerolifetime,我們在之前修改kdc.conf文件的時候已經(jīng)添加了max_lifemax_renewable_life這個2個屬性抗碰,前者表示服務端允許的Service ticket最大生命周期狮斗,后者表示服務端允許的Service ticket更新周期。這2個屬性必須分別大于等于客戶端對應的配置ticket_lifetimerenew_lifetime弧蝇。我們假設(shè),不這樣進行配置:ticket_lifetime = 8d, max_life = 7d, renew_lifetime = 25h, max_renew_life = 24h折砸,那么可能造成的結(jié)果就是當service持有的票據(jù)超過24小時沒有去更新看疗,在第24.5小時的時候去進行更新,請求會遭到拒絕睦授,報錯:Ticket expired while renewing credentials两芳,永遠無法進行正常更新。對于Cloudera來說去枷,因為更新機制被透明(Cloudera有renew進程會去定期更新)怖辆,即使我們手動使用``modprinc -maxrenewlife 1week krbtgt/DOMAIN.COM@DOMAIN.COM` 進行更新,也無濟于事删顶。
  • 在Cloudera Manager Server上安裝openldap-clients竖螃;
  • 為Cloudera Manager創(chuàng)建了超級管理員principal,使其能夠有權(quán)限在KDC中創(chuàng)建其他的principals逗余;

再次確認完畢后進入如下步驟:

  1. 進入 Cloudera Manager Admin Console 界面并且點擊 cluster 右邊的按鈕選擇Enable Kerberos特咆;
  2. 點擊 Continue,進入下一頁進行配置录粱,要注意的是:這里的 Kerberos Encryption Types 必須跟KDC實際支持的加密類型匹配(即kdc.conf中的值)腻格,這里使用了默認的aes256-cts,注意啥繁,這里的 Kerberos Encryption Types 必須和/etc/krb5.conf中的default_tgs_enctypes菜职、default_tkt_enctypespermitted_enctypes三個選項的值對應起來,不然會出現(xiàn)集群服務無法認證通過的情況旗闽!
  3. 點擊 Continue酬核,進入下一頁,這一頁中不勾選 Manage krb5.conf through Cloudera Manager 宪睹,否則會修改掉之前配置的acl愁茁,造成 enable kerberos 失敗亭病;
  4. 點擊 Continue鹅很,進入下一頁,輸入 Cloudera Manager Principal 的管理員賬號和密碼罪帖,注意輸入賬號的時候要使用@前要使用全稱促煮,本文使用的是cdh-master/admin@DOMAIN.COM邮屁;
  5. 點擊 Continue,進入下一頁菠齿,導入 KDC Account Manager Credentials佑吝;
  6. 點擊 Continue,進入下一頁绳匀,Restart Cluster 并且Eenable Kerberos芋忿;

之后 Cloudera Manager 會自動重啟集群服務,啟動之后會提示 Kerberos 已啟用疾棵。在 Cloudera Manager 上啟用 Kerberos 的過程中戈钢,會自動做以下的事情:

  • 集群中有多少個節(jié)點,每個賬戶就會生成對應個數(shù)的 principal ;
  • 為每個對應的 principal 創(chuàng)建 keytab是尔;
  • 部署 keytab 文件到指定的節(jié)點中殉了;
  • 在每個服務的配置文件中加入有關(guān) Kerberos 的配置;

其中包括Zookeeper服務所需要的 jaas.conf 和 keytab 文件都會自動設(shè)定并讀取拟枚,如果用戶仍然手動修改了Zookeeper的服務薪铜,要確保這兩個文件的路徑和內(nèi)容正確性。

  • keytab 是包含 principals 和加密 principal key 的文件 恩溅;
  • keytab 文件對于每個 host 是唯一的隔箍,因為 key 中包含 hostname ;
  • keytab 文件用于保存純文本密碼暴匠,實現(xiàn)到 kerberos上 驗證一個主機的 principal 鞍恢;

啟用之后訪問集群的所有資源都需要使用相應的賬號來訪問,否則會無法通過 Kerberos 的 authenticatin每窖。

除此之外帮掉,對于特定的服務需要做額外配置,本文只介紹HDFS窒典、YARN蟆炊、HBase,其余服務請參照官方文檔自行進行配置瀑志。

對于HDFS涩搓,需要開啟Web Concole 的認證,以防未認證用戶訪問資源界面劈猪,請在HDFS服務的Configuration中進行配置:

Enable Kerberos Authentication for HTTP Web-Consoles = true

對于YARN昧甘,需要開啟Web Concole 的認證,以防未認證用戶訪問資源界面战得,請在YARN服務的Configuration中進行配置:

Enable Kerberos Authentication for HTTP Web-Consoles = true

對于HBase需要開啟 Thrift 認證:

HBase Thrift Authentication = auth

完成修改后充边,通過Cloudera Manager對HDFS服務進行重啟。

相關(guān)測試

完成部署后,需要進行相關(guān)測試浇冰,以驗證Kerberos是否被正常開啟贬媒,本文純屬拋磚引玉,對部分服務進行了驗證肘习。

基本功能測試

在192.168.1.1 KDC 服務端上新建principal:

kadmin.local -q "addprinc <user_name>/DOMAIN.COM@DOMAIN.COM"

在客戶端192.168.1.2上新建principal:

kinit cdh-master/admin@DOMAIN.COM
kadmin -q "addprinc <user_name>/DOMAIN.COM@DOMAIN.COM"

銷毀ticket緩存:

kdestroy

查看當前ticket緩存际乘,這時應會報錯No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)

klist -f

重新獲取ticket:

kinit <user_name>/DOMAIN.COM@DOMAIN.COM

查看當前ticket緩存,應該不會報錯:

klist -f

Hive功能測試

CLI測試漂佩,首先進行principal初始化

kadmin -q "addprinc hive/test@DOMAIN.COM"
kinit hive/test@DOMAIN.COM

在沒有配置 kerberos 之前脖含,想要通過 hive 用戶運行 hive 命令需要執(zhí)行sudo,現(xiàn)在配置了 kerberos 之后投蝉,不再需要 sudo 了器赞,hive 會通過 ticket 中的用戶去執(zhí)行該命令:

CREATE DATABASE test; 
USE test; 
CREATE TABLE t(id int); 
DROP TABLE t; 
DROP DATABASE test;

Beeline/JDBC測試:

beeline --verbose=true 
beeline > !connect jdbc:hive2://${HIVE_SERVER2_HOSTNAME}:10000/default;principal=hive/${HIVE_SERVER2_HOSTNAME}@DOMAIN.COM;

HUE Sqoop Action測試,唯一需要注意的是墓拜,在提交 Action的時候需要選擇credential方式,hive shell action請選擇 hcat请契,hive server2 action 請選擇hive2咳榜,否則無法通過認證。

HBase on HUE功能測試

這里我們需要測試的是在HUE界面中進行HBase查詢爽锥。在使用HBase時涌韩,如果登錄HUE時使用的是admin身份,admin會偽裝成hue用戶發(fā)起命令氯夷,所以需要使用hbase的超級用戶hbase去給hue賦權(quán)臣樱,才可以使其具備權(quán)限,才可以在HUE界面進行HBase查詢:

kdestroy 
kinit cdh-master/admin 
kadmin > addprinc hbase/test@DOMAIN.COM 
kinit hbase/test@DOMAIN.COM 
hbase shell 
hbase shell > grant 'hue','RWXCA'

Sqoop on HUE功能測試

在Hue界面進行操作腮考,添加sqoop1作業(yè):

sqoop list-databases --connect jdbc:mysql://${MYSQL_SERVER_FQDN}:3306 --username ${MYSQL_USERNAME} --password ${MYSQL_PASSWD} 
sqoop import --connect jdbc:mysql://${MYSQL_SERVER_FQDN}:3306/cm --username ${MYSQL_USERNAME} --password ${MYSQL_PASSWD} --table HOSTS --target-dir /user/admin/tgt -m 1 --delete-target-dir

如何在HUE中提交作業(yè)雇毫,這里不進行復述。

遇到的問題

Q: kerberos ticket renewer 服務報: Ticket expired while renewing credentials踩蔚。

A: 這是因為TGT的ticketkrbtgt/DOMAIN.COM@DOMAIN.COMrenewlife被設(shè)置成了0棚放,這一點可以通過kadmin => getprinc krbtgt/DOMAIN.COM@DOMAIN.COM看出來。將krbtgt/DOMAIN.COM@DOMAIN.COMrenewlife修改為 7d 即可馅闽,方法:

modprinc -maxrenewlife 1week krbtgt/DOMAIN.COM@DOMAIN.COM

Q: 提交Spark作業(yè)時報錯:Delegation Token can be issued only with kerberos or web authentication飘蚯。

A: 提交spark作業(yè)的時候需要指定

spark master = yarn
mode = cluster

Q: Beeline報錯,Failed to find any Kerberos tgt福也。

A: 因為sudo權(quán)限下生成的credetial不能用于非sudo權(quán)限下的beeline局骤,也就是說不要在申請ticket的時候使用sudo,在執(zhí)行beeline的時候使用非sudo暴凑;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末峦甩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子搬设,更是在濱河造成了極大的恐慌穴店,老刑警劉巖撕捍,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泣洞,居然都是意外死亡忧风,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門球凰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狮腿,“玉大人,你說我怎么就攤上這事呕诉≡迪幔” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵甩挫,是天一觀的道長贴硫。 經(jīng)常有香客問我,道長伊者,這世上最難降的妖魔是什么英遭? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮亦渗,結(jié)果婚禮上挖诸,老公的妹妹穿的比我還像新娘。我一直安慰自己法精,他們只是感情好多律,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搂蜓,像睡著了一般狼荞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洛勉,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天粘秆,我揣著相機與錄音,去河邊找鬼收毫。 笑死攻走,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的此再。 我是一名探鬼主播昔搂,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼输拇!你這毒婦竟也來了摘符?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逛裤,沒想到半個月后瘩绒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡带族,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年锁荔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝙砌。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡阳堕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出择克,到底是詐尸還是另有隱情恬总,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布肚邢,位于F島的核電站壹堰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏骡湖。R本人自食惡果不足惜缀旁,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勺鸦。 院中可真熱鬧,春花似錦目木、人聲如沸换途。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽军拟。三九已至,卻和暖如春誓禁,著一層夾襖步出監(jiān)牢的瞬間懈息,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工摹恰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辫继,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓俗慈,卻偏偏與公主長得像姑宽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子闺阱,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容