一吐限、Windows中的認(rèn)證
1.1 單機(jī)認(rèn)證
NTLM Hash是支持Net NTML認(rèn)證協(xié)議及本地認(rèn)證過程中的一個(gè)重要參與物,其長度為32位着帽,由數(shù)字與字母組成揣钦。NTLM前身是LM Hash获询,目前基本淘汰涨岁。
- Windows本身不存儲(chǔ)用戶的明文密碼。它會(huì)將用戶的明文密碼經(jīng)過指紋加密算法后存儲(chǔ)在SAM數(shù)據(jù)庫中吉嚣。
- 當(dāng)用戶登陸時(shí)梢薪,將用戶輸入的明文密碼也加密成NTML Hash,與SAM數(shù)據(jù)庫中的NTML Hash進(jìn)行比較尝哆。
1.2 網(wǎng)絡(luò)認(rèn)證
在內(nèi)網(wǎng)滲透中秉撇,經(jīng)常遇到工作組環(huán)境,工作組間的機(jī)器無法互相建立一個(gè)完美的信任機(jī)制,只能點(diǎn)對點(diǎn)琐馆,沒有信托機(jī)構(gòu)规阀。
假設(shè)A與B屬于一個(gè)工作組,A想訪問B注解上的資料瘦麸,需要將一個(gè)存在于B主機(jī)上的賬戶憑證發(fā)送到B主機(jī)谁撼,經(jīng)過認(rèn)證才能訪問B主機(jī)上的資源。最常見的服務(wù)就是SMB服務(wù)滋饲,端口號(hào)為445厉碟。
微軟采用了NTLM(NT LAN Manager)協(xié)議進(jìn)行多節(jié)點(diǎn)之間的驗(yàn)證。
- Server接收到Client發(fā)送的用戶名后屠缭,判斷本地賬戶列表是否有用戶名share_user箍鼓。如果沒有,返回認(rèn)證失敽遣堋袄秩;如果有,生成16位的隨機(jī)字符串challenge逢并,并從本地查找share_user對應(yīng)的密碼指紋NTLM Hash,使用NTLM Hash加密Challenge郭卫,生成Net-NTLM Hash存儲(chǔ)在內(nèi)存中砍聊,并將Challenge發(fā)送給Client。
- Client接收到Challenge后贰军,將自己提供的share_user的密碼加密為NTLM Hash玻蝌,然后使用NTLM Hash加密Challenge,這個(gè)結(jié)果叫Response词疼,發(fā)送給Server俯树。
- Server接收到Client發(fā)送的Response,將Response與之前的Net-NTLM Hash進(jìn)行比較贰盗,如果相等许饿,則認(rèn)證通過。
二舵盈、Kerberos驗(yàn)證體系
2.1 概念
Kerberos是一種網(wǎng)絡(luò)協(xié)議陋率,設(shè)計(jì)目的是通過密鑰系統(tǒng)為客戶端和服務(wù)器應(yīng)用系統(tǒng)提供強(qiáng)大的認(rèn)證服務(wù)。該認(rèn)證過程的實(shí)現(xiàn)不依賴于主機(jī)操作系統(tǒng)的認(rèn)證秽晚,無需基于主機(jī)地址的信任瓦糟,不要求網(wǎng)絡(luò)上所有主機(jī)的物理安全,并假設(shè)網(wǎng)絡(luò)上傳送的數(shù)據(jù)包可以被任意讀取赴蝇、修改和插入數(shù)據(jù)菩浙。在以上情況下,Kerberos作為一種可信任的第三方認(rèn)證服務(wù),是通過傳統(tǒng)的密碼技術(shù)(如共享密鑰)執(zhí)行認(rèn)證服務(wù)的劲蜻。
Kerberos是比NTLM更新的驗(yàn)證體系陆淀,不怕中間人攻擊,而NTLM的Net-NTLM Hash是有可能被攔截并破解的斋竞。
Kerberos 中有以下一些概念需要了解
- KDC(Key Distribute Center):密鑰分發(fā)中心倔约,負(fù)責(zé)存儲(chǔ)用戶信息,管理發(fā)放票據(jù)坝初。
- Realm:Kerberos所管理的一個(gè)領(lǐng)域或范圍浸剩,稱之為一個(gè)Realm
- Principal:Kerberos所管理的一個(gè)用戶或者一個(gè)服務(wù),可以理解為Kerberos中保存的一個(gè)賬號(hào)鳄袍,其格式通常如下:primary/instance@realm 绢要,即 賬號(hào)/實(shí)例名@域名,其中instance可以省略拗小。
- Keytab:Kerberos中的用戶認(rèn)證重罪,可通過密碼或者密鑰文件證明身份,keytab指密鑰文件哀九。
2.2 從原理上來分析
Authentication解決的是“如何證明某個(gè)人確確實(shí)實(shí)就是他或她所聲稱的那個(gè)人”的問題剿配。對于如何進(jìn)行Authentication,我們采用這樣的方法:如果一個(gè)秘密(secret)僅僅存在于A和B阅束,那么有個(gè)人對B聲稱自己就是A呼胚,B通過讓A提供這個(gè)秘密來證明這個(gè)人就是他或她所聲稱的A。這個(gè)過程實(shí)際上涉及到3個(gè)重要的關(guān)于Authentication的方面:
- Secret如何表示息裸。
- A如何向B提供Secret蝇更。
- B如何識(shí)別Secret。
基于這3個(gè)方面呼盆,我們把Kerberos Authentication進(jìn)行最大限度的簡化:整個(gè)過程涉及到Client和Server年扩,他們之間的這個(gè)Secret我們用一個(gè)Key(KServer-Client)來表示。Client為了讓Server對自己進(jìn)行有效的認(rèn)證访圃,向?qū)Ψ教峁┤缦聝山M信息:
- 代表Client自身Identity的信息厨幻,為了簡便,它以明文的形式傳遞腿时。
- 將Client的Identity使用 KServer-Client作為Public Key克胳、并采用對稱加密算法進(jìn)行加密。
由于KServer-Client僅僅被Client和Server知曉圈匆,所以被Client使用KServer-Client加密過的Client Identity只能被Client和Server解密漠另。同理,Server接收到Client傳送的這兩組信息跃赚,先通過KServer-Client對后者進(jìn)行解密笆搓,隨后將機(jī)密的數(shù)據(jù)同前者進(jìn)行比較性湿,如果完全一樣,則可以證明Client能過提供正確的KServer-Client满败,而這個(gè)世界上肤频,僅僅只有真正的Client和自己知道KServer-Client,所以可以對方就是他所聲稱的那個(gè)人算墨。
如何使得client和server雙方拿到KServer-Client且保證該KServer-Client是短期有效的宵荒,防止被破解?
這里引入了第三方角色KDC(Kerberos Distribution Center)净嘀,其包含以下三個(gè)組件:
- AD(account database):存儲(chǔ)所有client的白名單报咳,只有存在于白名單的client才能順利申請到TGT(Ticket Granting Ticket,即申請票據(jù)的票據(jù))
- AS(Authentication Service):為client提供認(rèn)證服務(wù)挖藏,通過認(rèn)證后返回TGT
- TGS(Ticket Granting Service):為client提供通過TGT兌換Ticket的服務(wù)暑刃,生成某個(gè)服務(wù)的ticket
KDC分發(fā)SServer-Client的簡單的過程:首先Client向KDC發(fā)送一個(gè)對SServer-Client的申請。這個(gè)申請的內(nèi)容可以簡單概括為“我是某個(gè)Client膜眠,我需要一個(gè)Session Key用于訪問某個(gè)Server ”岩臣。KDC在接收到這個(gè)請求的時(shí)候,生成一個(gè)隨機(jī)串Session Key宵膨,為了保證這個(gè)Session Key僅僅限于發(fā)送請求的Client和他希望訪問的Server知曉架谎,KDC會(huì)為這個(gè)Session Key生成兩個(gè)Copy,分別被Client和Server使用辟躏。然后從Account Database中查詢Client和Server的密碼指紋NTLM Hash分別對這兩個(gè)Copy進(jìn)行對稱加密谷扣,前者加密得到Client Hash。對于后者鸿脓,和Session Key一起被加密的還包含關(guān)于Client的一些信息,稱為TGT涯曲。
通過TGT向AS請求獲取認(rèn)證Server端的Ticket野哭。
但是Client Hash和Ticket并不是分別發(fā)送給Client和Server端的,而是都發(fā)送給Client端幻件,這樣避免了網(wǎng)絡(luò)延遲等情況導(dǎo)致Server端未收到Ticket拨黔,無法驗(yàn)證Client的請求。最后統(tǒng)一由Client發(fā)送給Server绰沥。這樣Client端會(huì)收到兩個(gè)信息篱蝇,一個(gè)是自己的密碼指紋可以解密的Client Hash,另一個(gè)是Server的密碼指紋才能解密的Ticket徽曲。
如果避免B客戶端偽造為A客戶端請求KDC認(rèn)證的情況發(fā)生呢零截?
因?yàn)镵DC會(huì)查詢A客戶端的密碼指紋NTLM Hash進(jìn)行對稱加密,B客戶端不知道這個(gè)指紋秃臣,是無法解密Client Hash的涧衙。但是存在暴力破解的情況哪工,所以Client需要更多信息才證明自己的合法性,這里引入了Timestamp標(biāo)記了創(chuàng)建時(shí)間弧哎,如果時(shí)間花費(fèi)過多雁比,那么存在中間人攔截后暴力破解偽造請求的可能性。
Client使用自己的指紋解密Client Hash后獲取Session Key撤嫩,創(chuàng)建Authenticator(Client Info + Timestamp)并使用Session Key進(jìn)行加密偎捎。隨后將Authenticator和緩存的Ticket發(fā)送給Server進(jìn)行驗(yàn)證。
Server端收到請求后序攘,使用自己的密碼指紋解密Ticket茴她,獲取到Session Key,Client Info和Timestamp两踏,然后使用Session Key解密Authenticator獲取Client Info和Timestamp败京,比較兩個(gè)Client Info和Timestamp,如果Client Info相同且時(shí)間戳在合理誤差內(nèi)梦染,則驗(yàn)證通過赡麦。
Kerberos一個(gè)重要的優(yōu)勢在于它能夠提供雙向認(rèn)證:
不但Server可以對Client 進(jìn)行認(rèn)證,Client也能對Server進(jìn)行認(rèn)證帕识。如果Client需要對他訪問的Server進(jìn)行認(rèn)證泛粹,會(huì)在它向Server發(fā)送的Credential中設(shè)置一個(gè)是否需要認(rèn)證的Flag。Server在對Client認(rèn)證成功之后肮疗,會(huì)把Authenticator中的Timestamp提出出來晶姊,通過Session Key進(jìn)行加密,當(dāng)Client接收到并使用Session Key進(jìn)行解密之后伪货,如果確認(rèn)Timestamp和原來的完全一致们衙,那么他可以認(rèn)定Server正式他試圖訪問的Server。因?yàn)镾erver獲取Session Key的唯一途徑是使用本機(jī)的密碼指紋來解密Session Ticket碱呼,這樣就可以認(rèn)證Server蒙挑。
小結(jié)
Kerberos實(shí)際上一個(gè)基于Ticket的認(rèn)證方式。Client想要獲取Server端的資源愚臀,先得通過Server的認(rèn)證忆蚀;而認(rèn)證的先決條件是Client向Server提供從KDC獲得的一個(gè)有Server的密碼指紋進(jìn)行加密的Session Ticket(Session Key + Client Info)」昧眩可以這么說馋袜,Session Ticket是Client進(jìn)入Server領(lǐng)域的一張門票。而這張門票必須從一個(gè)合法的Ticket頒發(fā)機(jī)構(gòu)獲得舶斧,這個(gè)頒發(fā)機(jī)構(gòu)就是Client和Server雙方信任的KDC欣鳖, 同時(shí)這張Ticket具有超強(qiáng)的防偽標(biāo)識(shí):它是被Server的密碼指紋加密的。對Client來說茴厉, 獲得Session Ticket是整個(gè)認(rèn)證過程中最為關(guān)鍵的部分观堂。
2.3 詳細(xì)流程
知識(shí)點(diǎn)
- 每次通信让网,消息包含兩部分,一部分可解碼师痕,一部分不可解碼溃睹。
- 服務(wù)端不會(huì)直接向KDC通信
- KDC保存所有機(jī)器的賬戶名和密碼
- KDC本身具有一個(gè)密碼
流程
-
Client與AS通訊獲取TGT(Ticket Granting Ticket):想要獲取http服務(wù),需要向KDC進(jìn)行認(rèn)證并返回TGT胰坟。Kerberos可以通過kinit獲取因篇。
- 請求信息包含:①用戶名/ID ②IP地址
AS收到之后會(huì)查詢AD,驗(yàn)證該用戶是否信任笔横,如果信任竞滓,AS會(huì)生成隨機(jī)串Session Key。查詢Client的密碼指紋并使用該指紋加密Challenge得到加密的Session Key吹缔,同時(shí)使用KDC的密碼指紋加密Session Key和Client Info商佑。
- 響應(yīng)消息包含兩個(gè)加密數(shù)據(jù)包:①TGT(Challenge,Client Info厢塘,Timestamp茶没,TGT到期時(shí)間,Session Key) ②Client指紋加密的Session Key
Client收到兩個(gè)數(shù)據(jù)包晚碾,加密的Session Key可以使用自己的密碼指紋解密得到Session Key抓半,另一個(gè)TGT無法解密先進(jìn)行緩存。
-
Client與TGS通訊獲取Ticket:上一步獲取了TGT和加密的Session Key格嘁,現(xiàn)在就可以向KDC請求訪問某一個(gè)Server的Ticket了笛求。TGT原封不動(dòng),將Client Info和Timestamp經(jīng)過Session Key加密后得到Client Hash糕簿,明文Client Info和Server Info作為請求數(shù)據(jù)進(jìn)行請求探入。
- 請求信息包括:①TGT ②Client Hash ③Client Info和Server Info
TGS收到請求后,使用自己的密碼指紋解密TGT懂诗,獲取Session Key和Timestamp蜂嗽,使用Session Key解密Client Hash獲得Client Info和Timestamp。對比兩個(gè)Timestamp是否在合理誤差內(nèi)响禽,檢查認(rèn)證器是否已在HTTP服務(wù)端的緩存中(避免應(yīng)答攻擊)徒爹,獲取客戶端信息比較是否相同荚醒,再判斷Client是否有訪問Server的權(quán)限芋类。如果都通過,則TGS會(huì)再生成一個(gè)隨機(jī)串Server Session Key界阁,將Client Info侯繁,Server Info,Timestamp泡躯,Server Session Key贮竟,Ticket生命周期用Server的密碼指紋進(jìn)行加密生成Ticket后返回丽焊。
- 響應(yīng)信息包括:①Ticket(Client Info,Server Info咕别,Timestamp技健,Server Session Key,Ticket生命周期) ②Client指紋加密后的(Client Info惰拱,Server Session Key雌贱,Timestamp,生命周期)
Client收到兩個(gè)數(shù)據(jù)包偿短,加密的Authenticator可以使用自己的密碼指紋解密得到Server Session Key欣孤,另一個(gè)TGT無法解密先進(jìn)行緩存。
-
Client與Server通訊:每次獲取Http服務(wù)昔逗,在Ticket沒有過期降传,或者無更新的情況下,都可直接進(jìn)行訪問勾怒。將Client Info婆排,Server Session Key,Timestamp和生命周期用Server Session Key進(jìn)行加密后得到Authenticator控硼。將Authenticator和Ticket作為請求數(shù)據(jù)進(jìn)行請求泽论。
- 請求信息包括:①Authenticator(Client Info芒填,Server Session Key晌杰,Timestamp,生命周期) ②Ticket
Server收到請求后隔缀,通過自己的指紋解密Ticket得到Server Session Key幔妨,Client Info和Timestamp鹦赎。使用Server Session Key解密Authenticator,對比兩個(gè)Timestamp是否在合理誤差內(nèi)误堡,是否已經(jīng)過期古话,獲取客戶端信息比較是否相同。如果通過則能成功訪問Server的資源锁施。
三陪踩、Kerberos使用
3.1 相關(guān)命令
說明 | 命令 |
---|---|
進(jìn)入kadmin | kadmin.local / kadmin |
創(chuàng)建數(shù)據(jù)庫 | kdb5_util create -r HADOOP.COM -s |
啟動(dòng)kdc服務(wù) | systemctl start krb5kdc |
啟動(dòng)kadmin服務(wù) | systemctl start kadmin |
修改當(dāng)前密碼 | kpasswd |
測試keytab可用性 | kinit -k -t /home/chen/cwd.keytab hive@HADOOP.COM |
查看keytab | klist -e -k -t /home/chen/cwd.keytab |
清除緩存 | kdestroy |
通過keytab文件認(rèn)證hxr用戶登錄 | kinit hxr -kt /home/chen/cwd.keytab hive@HADOOP.COM |
kadmin模式中 | 命令 |
---|---|
生成隨機(jī)key的principal | addprinc -randkey root/master@HADOOP.COM |
生成指定key的principal | addprinc -pw admin/admin@HADOOP.COM |
查看principal | listprincs |
修改admin/admin的密碼 | cpw -pw xxxx admin/admin |
添加/刪除principle | addprinc/delprinc admin/admin |
直接生成到keytab | ktadd -k /home/chen/cwd.keytab hive@HADOOP.COMxst -norandkey -k /home/chen/cwd.keytab hive@HADOOP.COM #注意:在生成keytab文件時(shí)需要加參數(shù)”-norandkey”,否則會(huì)導(dǎo)致直接使用kinit hive@HADOOP.COM初始化時(shí)會(huì)提示密碼錯(cuò)誤悉抵。 |
設(shè)置密碼策略(policy) | addpol -maxlife "90 days" -minlife "75 days" -minlength 8 -minclasses 3 -maxfailure 10 -history 10 user |
添加帶有密碼策略的用戶 | addprinc -policy user hello/admin@HADOOP.COM |
修改用戶的密碼策略 | modprinc -policy user1 hello/admin@HADOOP.COM |
刪除密碼策略 | delpol [-force] user |
修改密碼策略 | modpol -maxlife "90 days" -minlife "75 days" -minlength 8 -minclasses 3 -maxfailure 10 user |
3.2 Kerberos安裝
3.2.1 安裝Kerberos相關(guān)服務(wù)
選擇集群中的一臺(tái)注解作為Kerberos服務(wù)端肩狂,安裝KDC,所有主機(jī)都需要部署Kerveros客戶端姥饰。
服務(wù)端主機(jī)安裝命令
yum install -y krb5-server
客戶端主機(jī)安裝命令
yum install -y krb5-workstation krb5-libs
3.2.2 修改配置文件
服務(wù)端
/var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
IOTMARS.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 camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
- [kdcdefaults] 對kdc進(jìn)行配置傻谁,指定了kdc的端口
- [realms] 對域進(jìn)行詳細(xì)的配置
- keytab是最終獲取到的Ticket,可以在Server進(jìn)行驗(yàn)證列粪。這個(gè)- keytab是admin的Ticket审磁,不需要去AS和TGS換取Ticket谈飒,而是在本地保存了Ticket。
- supported_enctypes是支持的加密類型
只需要修改域的名稱即可态蒂,端口號(hào)杭措、文件位置和加密算法可以不修改。
客戶端
修改配置 /etc/krb5.conf 并同步到所有客戶端節(jié)點(diǎn)和服務(wù)端節(jié)點(diǎn)
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
default_realm = IOTMARS.COM
#default_ccache_name = KEYRING:persistent:%{uid}
[realms]
IOTMARS.COM = {
kdc = 192.168.101.174
admin_server = 192.168.101.174
}
[domain_realm]
#.example.com = EXAMPLE.COM
#example.com = EXAMPLE.COM
- default_realm:每次輸入principal都需要寫全primary/instance@realm钾恢,如果配置了default_realm就可以省略@realm瓤介;
- dns_lookup_kdc:請求kdc時(shí)是否需要經(jīng)過dns。我們直接訪問ip即可赘那,設(shè)為false刑桑;
- default_ccache_name:與系統(tǒng)不兼容,需要注釋掉募舟;
- kdc:kdc服務(wù)所在的域名或ip
- admin_server:admin_server可以向kdc服務(wù)注冊自己的信息祠斧。需要填寫kdc所在的域名或ip。
- [domain_realm] 表示進(jìn)行域名轉(zhuǎn)換拱礁,匹配到的域名都轉(zhuǎn)換到指定的域琢锋。這里可以不寫。
3.2.3 初始化KDC數(shù)據(jù)庫
在服務(wù)端執(zhí)行如下命令呢灶,并根據(jù)提示輸入密碼
kdb5_util create -s -r IOTMARS.COM
- -s選項(xiàng)指定將數(shù)據(jù)庫的主節(jié)點(diǎn)密鑰存儲(chǔ)在文件中吴超,從而可以在每次啟動(dòng)KDC時(shí)自動(dòng)重新生成主節(jié)點(diǎn)密鑰。記住主密鑰鸯乃,稍后回使用鲸阻。
- -d指定數(shù)據(jù)庫名字
查看目錄/var/kerberos/krb5kdc,發(fā)現(xiàn)多了4個(gè)文件(principal缨睡,principal.kadm5鸟悴,principal.kadm5.lock,principal.ok)奖年,如果需要再次初始化KDC數(shù)據(jù)庫细诸,需要先刪除這些文件。
3.2.4 修改管理員權(quán)限配置文件
在服務(wù)端主機(jī)修改/var/kerberos/krb5kdc/kadm5.acl文件
*/admin@IOTMARS.COM *
表示realm域中的admin組下的所有用戶擁有所有權(quán)限陋守。
3.2.5 啟動(dòng)Kerberos服務(wù)
在服務(wù)端啟動(dòng)KDC震贵,并設(shè)置開機(jī)自啟
systemctl start krb5kdc
systemctl enable krb5kdc
在主節(jié)點(diǎn)啟動(dòng)Kadmin,該服務(wù)為KDC數(shù)據(jù)庫訪問入口水评,即我們配置的admin_server服務(wù)
systemctl start kadmin
systemctl enable kadmin
3.2.6 創(chuàng)建Kerberos管理員用戶
在KDC服務(wù)端執(zhí)行如下命令創(chuàng)建管理員賬戶猩系,并按提示創(chuàng)建管理員賬戶的密碼,我自己將密碼設(shè)置為Password@123之碗。
kadmin.local -q "addprinc admin/admin"
- kadmin.local相當(dāng)于是KDC數(shù)據(jù)庫的本地客戶端蝙眶,可以通過該命令來操作KDC數(shù)據(jù)庫季希。
- -q 就是 -query褪那,表示執(zhí)行-q后面的語句幽纷。
- addprinc即add principal,增加一個(gè)賬戶信息博敬,此處增加了一個(gè)管理員賬戶友浸,且省略了@realm。
本地客戶端登陸是不需要賬號(hào)密碼的偏窝,所以是安全的收恢。
創(chuàng)建的管理員賬戶就是為了遠(yuǎn)程客戶端也可以進(jìn)行訪問。
3.3 Kerberos使用
登錄后雙擊Tab祭往,可以看到所有的kadmin命令
kadmin.local:
? delpol get_principal list_policies modprinc
addpol delprinc get_principals listpols purgekeys
add_policy delstr getprincs list_principals q
addprinc del_string getprivs listprincs quit
add_principal exit get_privs list_requests rename_principal
ank getpol get_strings lock renprinc
change_password get_policies getstrs lr setstr
cpw get_policy ktadd modify_policy set_string
delete_policy getpols ktrem modify_principal unlock
delete_principal getprinc ktremove modpol xst
3.3.1 Kerberos數(shù)據(jù)庫操作
- 登陸數(shù)據(jù)庫
1)本地登陸(無需認(rèn)證)
2)遠(yuǎn)程登錄(需要進(jìn)行主體認(rèn)證)kadmin.local
按提示輸入密碼完成認(rèn)證即可登陸伦意。kadmin
-
創(chuàng)建Kerberos主體
kadmin.local -q "addprinc test"
或登錄后輸入
kadmin.local: addprinc test
-
修改主體密碼
kadmin.local: cpw test
-
刪除主體
kadmin.local: delprinc test
-
查看所有主體
kadmin.local: list_principals
可以看到除了我們創(chuàng)建的主體外,還有幾個(gè)程序自動(dòng)創(chuàng)建的主體硼补。
kadmin.local: list_principals K/M@IOTMARS.COM admin/admin@IOTMARS.COM kadmin/admin@IOTMARS.COM kadmin/changepw@IOTMARS.COM kadmin/cos-bigdata-mysql@IOTMARS.COM kiprop/cos-bigdata-mysql@IOTMARS.COM krbtgt/IOTMARS.COM@IOTMARS.COM
需要退出客戶端時(shí)輸入:exit
3.3.2 Kerberos認(rèn)證操作
-
密碼認(rèn)證
1)使用kinit進(jìn)行主體認(rèn)證kinit test
輸入密碼正確后驮肉,沒有任何報(bào)錯(cuò)信息,則認(rèn)證成功.
2)查看認(rèn)證憑證
[root@cos-bigdata-hadoop-01 kerberos]# klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: test@IOTMARS.COM Valid starting Expires Service principal 2021-09-24T18:46:59 2021-09-25T18:46:59 krbtgt/IOTMARS.COM@IOTMARS.COM
-
密鑰文件認(rèn)證
1)首先需要生成主體test的keytab密鑰文件已骇,可以生成到指定目錄/root/test.keytabkadmin.local -q "xst -norandkey -k /root/test.keytab test@IOTMARS.COM"
注:-norandkey的作用是聲明不隨機(jī)生成密碼离钝。若不加該參數(shù),會(huì)為該用戶生成隨機(jī)密碼并寫入到密鑰文件中褪储。這樣會(huì)導(dǎo)致之前的密碼失效卵渴,只能使用密鑰文件進(jìn)行認(rèn)證。
2)使用keytab進(jìn)行認(rèn)證
kinit -kt /root/test.keytab test
-kt表示使用密鑰文件進(jìn)行認(rèn)證鲤竹。
-
銷毀憑證
kdestroy
四浪读、Hadoop Kerberos配置
需要進(jìn)行認(rèn)證的環(huán)節(jié):
- 啟動(dòng)各個(gè)hadoop進(jìn)程
- 各個(gè)服務(wù)之間通訊
- 通過hadoop fs命令操作數(shù)據(jù)
- NameNode Web認(rèn)證并操作數(shù)據(jù)
- 提交yarn任務(wù)需要進(jìn)行認(rèn)證,且認(rèn)證用戶需要有/user等目錄的權(quán)限
- 啟動(dòng)和連接 hive/hiveserver2 (hive on spark)辛藻,并提交執(zhí)行任務(wù)
4.1 認(rèn)證原理
啟動(dòng)hadoop集群的用戶就是該集群的超級(jí)用戶瑟啃,而在core-site.xml中配置的hadoop.http.staticuser.user信息就是通過NameNode的UI或hadoop命令進(jìn)行訪問的靜態(tài)用戶,一旦配置為超級(jí)用戶揩尸,那么任何用戶都可以通過NameNode的UI或者h(yuǎn)adoop命令對集群中的數(shù)據(jù)進(jìn)行操作蛹屿,這造成了數(shù)據(jù)的不安全。所以我們必須引入Kerberos進(jìn)行用戶認(rèn)證岩榆。
流程如下:
- 首先在客戶端輸入kinit命令错负,攜帶principal,到KDC的AS服務(wù)進(jìn)行認(rèn)證勇边;
- AS服務(wù)訪問Database獲取用戶的Principal然后進(jìn)行認(rèn)證犹撒。認(rèn)證通過后,返回TGT給客戶端粒褒;
- 客戶端獲取TGT后识颊,緩存到本地,然后攜帶TGT訪問TGS服務(wù);
- TGS服務(wù)會(huì)查詢Database獲取目標(biāo)節(jié)點(diǎn)的相關(guān)信息祥款,完成目標(biāo)節(jié)點(diǎn)的認(rèn)證清笨,并驗(yàn)證TGT是否有效,有效則可以換取訪問目標(biāo)節(jié)點(diǎn)的Server Ticket刃跛;
- 獲取到Server Ticket后抠艾,客戶端就可以與目標(biāo)節(jié)點(diǎn)進(jìn)行交互了
主要工作
- 創(chuàng)建系統(tǒng)用戶
- 創(chuàng)建Kerberos主體
- 導(dǎo)出主體的keytab到主機(jī)
- 配置Hadoop配置文件,包括啟用Kerberos認(rèn)證桨昙、指定keytab位置等检号。
- 配置Https協(xié)議。
- 切換為LinuxContainerExecutor蛙酪,設(shè)置對應(yīng)權(quán)限和配置文件齐苛。
4.2 創(chuàng)建Hadoop系統(tǒng)用戶和組
為Hadoop開啟Kerberos,需為不同服務(wù)準(zhǔn)備不同的用戶桂塞,啟動(dòng)服務(wù)時(shí)需要使用相應(yīng)的用戶脸狸。須在所有節(jié)點(diǎn)創(chuàng)建以下用戶和用戶組。
User:Group | Daemons |
---|---|
hdfs:hadoop | NameNode, Secondary NameNode, JournalNode, DataNode |
yarn:hadoop | ResourceManager, NodeManager |
mapred:hadoop | MapReduce JobHistory Server |
創(chuàng)建hadoop組
[root@bigdata1 ~]# groupadd hadoop
[root@bigdata2 ~]# groupadd hadoop
[root@bigdata3 ~]# groupadd hadoop
創(chuàng)建各用戶并設(shè)置密碼
[root@bigdata1 ~]# useradd hdfs -g hadoop
[root@bigdata1 ~]# echo hdfs | passwd --stdin hdfs
[root@bigdata1 ~]# useradd yarn -g hadoop
[root@bigdata1 ~]# echo yarn | passwd --stdin yarn
[root@bigdata1 ~]# useradd mapred -g hadoop
[root@bigdata1 ~]# echo mapred | passwd --stdin mapred
[root@bigdata2 ~]# useradd hdfs -g hadoop
[root@bigdata2 ~]# echo hdfs | passwd --stdin hdfs
[root@bigdata2 ~]# useradd yarn -g hadoop
[root@bigdata2 ~]# echo yarn | passwd --stdin yarn
[root@bigdata2 ~]# useradd mapred -g hadoop
[root@bigdata2 ~]# echo mapred | passwd --stdin mapred
[root@bigdata3 ~]# useradd hdfs -g hadoop
[root@bigdata3 ~]# echo hdfs | passwd --stdin hdfs
[root@bigdata3 ~]# useradd yarn -g hadoop
[root@bigdata3 ~]# echo yarn | passwd --stdin yarn
[root@bigdata3 ~]# useradd mapred -g hadoop
[root@bigdata3 ~]# echo mapred | passwd --stdin mapred
4.3 為Hadoop各服務(wù)創(chuàng)建Kerberos主體(Principal)
主體格式如下:ServiceName/HostName@REALM藐俺,例如 dn/bigdata1@IOTMARS.COM
1. 各服務(wù)所需主體如下
環(huán)境:3臺(tái)節(jié)點(diǎn)炊甲,主機(jī)名分別為bigdata1,bigdata2欲芹,bigdata3
服務(wù) | 所在主機(jī) | 主體(Principal) |
---|---|---|
NameNode | bigdata1 | nn/bigdata1 |
DataNode | bigdata1 | dn/bigdata1 |
DataNode | bigdata2 | dn/bigdata2 |
DataNode | bigdata3 | dn/bigdata3 |
Secondary NameNode | bigdata3 | sn/bigdata3 |
ResourceManager | bigdata2 | rm/bigdata2 |
NodeManager | bigdata1 | nm/bigdata1 |
NodeManager | bigdata2 | nm/bigdata2 |
NodeManager | bigdata3 | nm/bigdata3 |
JobHistory Server | bigdata3 | jhs/bigdata3 |
Web UI | bigdata1 | HTTP/bigdata1 |
Web UI | bigdata2 | HTTP/bigdata2 |
Web UI | bigdata3 | HTTP/bigdata3 |
2. 創(chuàng)建主體說明
1) 路徑準(zhǔn)備:為服務(wù)創(chuàng)建的主體卿啡,需要通過密鑰文件keytab文件進(jìn)行認(rèn)證,故需為各服務(wù)準(zhǔn)備一個(gè)安全的路徑用來存儲(chǔ)keytab文件菱父。
[root@bigdata1 ~]# mkdir /etc/security/keytab/
[root@bigdata1 ~]# chown -R root:hadoop /etc/security/keytab/
[root@bigdata1 ~]# chmod 770 /etc/security/keytab/
2)管理員主體認(rèn)證
為執(zhí)行創(chuàng)建主體的語句颈娜,需登錄Kerberos 數(shù)據(jù)庫客戶端,登錄之前需先使用Kerberos的管理員用戶進(jìn)行認(rèn)證浙宜,執(zhí)行以下命令并根據(jù)提示輸入密碼官辽。
[root@bigdata1 ~]# kinit admin/admin
3)登錄數(shù)據(jù)庫客戶端,輸入密碼
[root@bigdata1 ~]# kadmin
4)執(zhí)行創(chuàng)建主體的語句
kadmin: addprinc -randkey test/test
kadmin: xst -k /etc/security/keytab/test.keytab test/test
- addprinc:增加主體
- -randkey:密碼隨機(jī)粟瞬,因hadoop各服務(wù)均通過keytab文件認(rèn)證同仆,故密碼可隨機(jī)生成
- test/test:新增的主體
- xst:將主體的密鑰寫入keytab文件
- -k /etc/security/keytab/test.keytab:指明keytab文件路徑和文件名
- test/test:主體
為方便創(chuàng)建主體,可使用如下命令
[root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey test/test"
[root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/test.keytab test/test"
- -p:主體
- -w:密碼
- -q:執(zhí)行語句
3. 創(chuàng)建主體
1)在所有節(jié)點(diǎn)創(chuàng)建keytab文件目錄
[root@bigdata1 ~]# mkdir /etc/security/keytab/
[root@bigdata1 ~]# chown -R root:hadoop /etc/security/keytab/
[root@bigdata1 ~]# chmod 770 /etc/security/keytab/
[root@bigdata2 ~]# mkdir /etc/security/keytab/
[root@bigdata2 ~]# chown -R root:hadoop /etc/security/keytab/
[root@bigdata2 ~]# chmod 770 /etc/security/keytab/
[root@bigdata3 ~]# mkdir /etc/security/keytab/
[root@bigdata3 ~]# chown -R root:hadoop /etc/security/keytab/
[root@bigdata3 ~]# chmod 770 /etc/security/keytab/
2)以下命令在bigdata1節(jié)點(diǎn)執(zhí)行
NameNode(bigdata1)
[root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey nn/bigdata1"
[root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nn.service.keytab nn/bigdata1"
DataNode(bigdata1)
[root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/bigdata1"
[root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/bigdata1"
NodeManager(bigdata1)
[root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/bigdata1"
[root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/bigdata1"
Web UI(bigdata1)
[root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/bigdata1"
[root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/bigdata1"
2)以下命令在bigdata2執(zhí)行
ResourceManager(bigdata2)
[root@bigdata2 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey rm/bigdata2"
[root@bigdata2 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/rm.service.keytab rm/bigdata2"
DataNode(bigdata2)
[root@bigdata2 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/bigdata2"
[root@bigdata2 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/bigdata2"
NodeManager(bigdata2)
[root@bigdata2 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/bigdata2"
[root@bigdata2 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/bigdata2"
Web UI(bigdata2)
[root@bigdata2 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/bigdata2"
[root@bigdata2 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/bigdata2"
3)以下命令在bigdata3執(zhí)行
DataNode(bigdata3)
[root@bigdata3 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/bigdata3"
[root@bigdata3 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/bigdata3"
Secondary NameNode(bigdata3)
[root@bigdata3 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey sn/bigdata3"
[root@bigdata3 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/sn.service.keytab sn/bigdata3"
NodeManager(bigdata3)
[root@bigdata3 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/bigdata3"
[root@bigdata3 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/bigdata3"
JobHistory Server(bigdata3)
[root@bigdata3 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey jhs/bigdata3"
[root@bigdata3 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/jhs.service.keytab jhs/bigdata3"
Web UI(bigdata3)
[root@bigdata3 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/bigdata3"
[root@bigdata3 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/bigdata3"
4.修改所有節(jié)點(diǎn)keytab文件的所有者和訪問權(quán)限
[root@bigdata1 ~]# chown -R root:hadoop /etc/security/keytab/
[root@bigdata1 ~]# chmod 660 /etc/security/keytab/*
[root@bigdata2 ~]# chown -R root:hadoop /etc/security/keytab/
[root@bigdata2 ~]# chmod 660 /etc/security/keytab/*
[root@bigdata3 ~]# chown -R root:hadoop /etc/security/keytab/
[root@bigdata3 ~]# chmod 660 /etc/security/keytab/*
4.4 修改Hadoop配置文件
需要修改的內(nèi)容如下裙品,修改完畢需要分發(fā)所改文件俗批。
1. core-site.xml
<!-- Kerberos主體到系統(tǒng)用戶的映射機(jī)制 -->
<property>
<name>hadoop.security.auth_to_local.mechanism</name>
<value>MIT</value>
</property>
<!-- Kerberos主體到系統(tǒng)用戶的具體映射規(guī)則 -->
<property>
<name>hadoop.security.auth_to_local</name>
<value>
RULE:[2:$1/$2@$0]([ndsj]n\/.*@IOTMARS\.COM)s/.*/hdfs/
RULE:[2:$1/$2@$0]([rn]m\/.*@IOTMARS\.COM)s/.*/yarn/
RULE:[2:$1/$2@$0](jhs\/.*@IOTMARS\.COM)s/.*/mapred/
DEFAULT
</value>
</property>
<!-- 啟用Hadoop集群Kerberos安全認(rèn)證 -->
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<!-- 啟用Hadoop集群授權(quán)管理 -->
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<!-- Hadoop集群間RPC通訊設(shè)為僅認(rèn)證模式 -->
<property>
<name>hadoop.rpc.protection</name>
<value>authentication</value>
</property>
此處
[2:$1/$2@$0]
中的 '2' 表示主體名包含了$
1和$2
兩部分,$1
和$2
組成了主體名市怎,$0
是域名岁忘。([ndj]n\/.*@IOTMARS\.COM)s/.*/hdfs/
是通過正則表達(dá)式進(jìn)行匹配,主體匹配上規(guī)則区匠,s
表示替換干像,.*
表示所有內(nèi)容,即將主體全部替換為hdfs,對應(yīng)主機(jī)上的hdfs用戶麻汰;若匹配不上速客,進(jìn)行下一個(gè)規(guī)則的匹配。如果都沒有匹配上什乙,則使用DEFAULT
規(guī)則,即只取$1
的部分替換全部內(nèi)容已球,對應(yīng)主機(jī)上的$1
用戶臣镣。
2. hdfs-site.xml
讀取文件時(shí),需要先訪問NameNode獲取block信息智亮,然后去block所在節(jié)點(diǎn)獲取數(shù)據(jù)忆某;此過程需要進(jìn)行Kerberos認(rèn)證,dfs.block.access.token.enable參數(shù)設(shè)置為true阔蛉,則在NameNode返回block信息還會(huì)返回block所在節(jié)點(diǎn)的token弃舒,這樣客戶端在獲取block時(shí)不再需要進(jìn)行DataNode節(jié)點(diǎn)的認(rèn)證。
<!-- 訪問DataNode數(shù)據(jù)塊時(shí)需通過Kerberos認(rèn)證 -->
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
<!-- NameNode服務(wù)的Kerberos主體,_HOST會(huì)自動(dòng)解析為服務(wù)所在的主機(jī)名 -->
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>nn/_HOST@IOTMARS.COM</value>
</property>
<!-- NameNode服務(wù)的Kerberos密鑰文件路徑 -->
<property>
<name>dfs.namenode.keytab.file</name>
<value>/etc/security/keytab/nn.service.keytab</value>
</property>
<!-- Secondary NameNode服務(wù)的Kerberos主體 -->
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>sn/_HOST@IOTMARS.COM</value>
</property>
<!-- Secondary NameNode服務(wù)的Kerberos密鑰文件路徑 -->
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>/etc/security/keytab/sn.service.keytab</value>
</property>
<!-- NameNode Web服務(wù)的Kerberos主體 -->
<property>
<name>dfs.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/_HOST@IOTMARS.COM</value>
</property>
<!-- WebHDFS REST服務(wù)的Kerberos主體 -->
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>HTTP/_HOST@IOTMARS.COM</value>
</property>
<!-- Secondary NameNode Web UI服務(wù)的Kerberos主體 -->
<property>
<name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/_HOST@IOTMARS.COM</value>
</property>
<!-- Hadoop Web UI的Kerberos密鑰文件路徑 -->
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>/etc/security/keytab/spnego.service.keytab</value>
</property>
<!-- DataNode服務(wù)的Kerberos主體 -->
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>dn/_HOST@IOTMARS.COM</value>
</property>
<!-- DataNode服務(wù)的Kerberos密鑰文件路徑 -->
<property>
<name>dfs.datanode.keytab.file</name>
<value>/etc/security/keytab/dn.service.keytab</value>
</property>
<!-- 配置NameNode Web UI 使用HTTPS協(xié)議 -->
<property>
<name>dfs.http.policy</name>
<value>HTTPS_ONLY</value>
</property>
<!-- 配置DataNode數(shù)據(jù)傳輸保護(hù)策略為僅認(rèn)證模式 -->
<property>
<name>dfs.data.transfer.protection</name>
<value>authentication</value>
</property>
3. mapred-site.xml
<!-- 歷史服務(wù)器的Kerberos主體 -->
<property>
<name>mapreduce.jobhistory.keytab</name>
<value>/etc/security/keytab/jhs.service.keytab</value>
</property>
<!-- 歷史服務(wù)器的Kerberos密鑰文件 -->
<property>
<name>mapreduce.jobhistory.principal</name>
<value>jhs/_HOST@IOTMARS.COM</value>
</property>
這個(gè)_HOST官網(wǎng)解釋如下:
Hadoop simplifies the deployment of configuration files by allowing the hostname component of the service principal to be specified as the _HOST wildcard. Each service instance will substitute _HOST with its own fully qualified hostname at runtime. This allows administrators to deploy the same set of configuration files on all nodes. However, the keytab files will be different.
但是實(shí)際使用發(fā)現(xiàn)貌似不是主機(jī)名稱状原,很奇怪聋呢!
實(shí)際測試發(fā)現(xiàn):
-
啟動(dòng)Datanode時(shí),會(huì)調(diào)用KerberosUtil.java中的getLocalHostName()方法
/* Return fqdn of the current host */ static String getLocalHostName() throws UnknownHostException { return InetAddress.getLocalHost().getCanonicalHostName(); }
可以發(fā)現(xiàn)使用的是java.net包中的getCanonicalHostName()方法獲取全限定主機(jī)名颠区。需要在/etc/hosts中的第一行添加
[本機(jī)ip] [hostname]
各個(gè)節(jié)點(diǎn)啟動(dòng)時(shí)會(huì)讀取這個(gè)hostname并賦值給_HOST削锰。
-
啟動(dòng)SecondaryNameNode時(shí),會(huì)讀取配置中的值
<property> <name>dfs.namenode.secondary.http-address</name> <value>cos-bigdata-test-hadoop-03:9868</value> </property>
啟動(dòng)SecondaryNameNode就會(huì)將_HOST設(shè)置為cos-bigdata-test-hadoop-03毕莱。
-
啟動(dòng)NameNode時(shí)器贩,會(huì)讀取配置中的值
<property> <name>fs.defaultFS</name> <value>hdfs://cos-bigdata-test-hadoop-01:9820</value> </property>
啟動(dòng)NameNode就會(huì)將_HOST設(shè)置為cos-bigdata-test-hadoop-01。
-
啟動(dòng)ResouceManager時(shí)朋截,會(huì)讀取配置中的值
<property> <name>yarn.resourcemanager.hostname</name> <value>cos-bigdata-test-hadoop-02</value> </property>
啟動(dòng)ResouceManager就會(huì)將_HOST設(shè)置為cos-bigdata-test-hadoop-02蛹稍。
4. yarn-site.xml
<!-- Resource Manager 服務(wù)的Kerberos主體 -->
<property>
<name>yarn.resourcemanager.principal</name>
<value>rm/_HOST@IOTMARS.COM</value>
</property>
<!-- Resource Manager 服務(wù)的Kerberos密鑰文件 -->
<property>
<name>yarn.resourcemanager.keytab</name>
<value>/etc/security/keytab/rm.service.keytab</value>
</property>
<!-- Node Manager 服務(wù)的Kerberos主體 -->
<property>
<name>yarn.nodemanager.principal</name>
<value>nm/_HOST@IOTMARS.COM</value>
</property>
<!-- Node Manager 服務(wù)的Kerberos密鑰文件 -->
<property>
<name>yarn.nodemanager.keytab</name>
<value>/etc/security/keytab/nm.service.keytab</value>
</property>
需要注意的是,即使通過了kerberos認(rèn)證的用戶部服,如果該用戶不是所有yarn服務(wù)器的用戶且與啟動(dòng)yarn服務(wù)的用戶不同組)唆姐,那么會(huì)報(bào)錯(cuò) User xxx not found
修改完成后分發(fā)配置文件到其他節(jié)點(diǎn)。
4.5 配置HDFS使用HTTPS安全傳輸協(xié)議
Keytool是java數(shù)據(jù)證書的管理工具廓八,使用戶能夠管理自己的公/私鑰對及相關(guān)證書厦酬。
-keystore 指定密鑰庫的名稱及位置(產(chǎn)生的各類信息將存在.keystore文件中)
-genkey(或者-genkeypair) 生成密鑰對
-alias 為生成的密鑰對指定別名,如果沒有默認(rèn)是mykey
-keyalg 指定密鑰的算法 RSA/DSA 默認(rèn)是DSA
1)生成 keystore的密碼及相應(yīng)信息的密鑰庫
keytool -keystore /etc/security/keytab/keystore -alias jetty -genkey -keyalg RSA
注意:CN設(shè)置為訪問的域名瘫想,即hosts中配置的cos-bigdata-test-hadoop-01
2)修改keystore文件的所有者和訪問權(quán)限
chown -R root:hadoop /etc/security/keytab/keystore
chmod 660 /etc/security/keytab/keystore
注意:
(1)密鑰庫的密碼至少6個(gè)字符仗阅,可以是純數(shù)字或者字母或者數(shù)字和字母的組合等等
(2)確保hdfs用戶(HDFS的啟動(dòng)用戶)具有對所生成keystore文件的讀權(quán)限
3)將該證書分發(fā)到集群中的每臺(tái)節(jié)點(diǎn)的相同路徑
xsync /etc/security/keytab/keystore
4)修改hadoop配置文件ssl-server.xml.example,
該文件位于$HADOOP_HOME/etc/hadoop目錄
修改文件名為ssl-server.xml
修改以下內(nèi)容
<!-- SSL密鑰庫路徑 -->
<property>
<name>ssl.server.keystore.location</name>
<value>/etc/security/keytab/keystore</value>
</property>
<!-- SSL密鑰庫密碼 -->
<property>
<name>ssl.server.keystore.password</name>
<value>123456</value>
</property>
<!-- SSL可信任密鑰庫路徑 -->
<property>
<name>ssl.server.truststore.location</name>
<value>/etc/security/keytab/keystore</value>
</property>
<!-- SSL密鑰庫中密鑰的密碼 -->
<property>
<name>ssl.server.keystore.keypassword</name>
<value>Password@123</value>
</property>
<!-- SSL可信任密鑰庫密碼 -->
<property>
<name>ssl.server.truststore.password</name>
<value>Password@123</value>
</property>
分發(fā)配置文件到所有的節(jié)點(diǎn)国夜。
5)將證書添加到j(luò)dk的信任庫中
默認(rèn)每分鐘Secondarynamenode會(huì)發(fā)起fetchImage的https請求减噪,如果不配置自簽名證書可信任,就會(huì)導(dǎo)致請求失敗,Secondarynamenode功能失效筹裕。報(bào)錯(cuò)如下
2021-10-15 10:52:08,774 INFO org.apache.hadoop.hdfs.server.namenode.TransferFsImage: Opening connection to https://cos-bigdata-test-hadoop-01:9871/imagetransfer?getimage=1&txid=4419&storageInfo=-64:2014770126:1634089984720:CID-b3e0e3d0-2f3d-49f2-a41c-5725d56b89b5&bootstrapstandby=false
2021-10-15 10:52:08,802 ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Exception in doCheckpoint
javax.net.ssl.SSLHandshakeException: Error while authenticating with endpoint: https://cos-bigdata-test-hadoop-01:9871/imagetransfer?getimage=1&txid=4419&storageInfo=-64:2014770126:1634089984720:CID-b3e0e3d0-2f3d-49f2-a41c-5725d56b89b5&bootstrapstandby=false
......
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
首先導(dǎo)出證書
keytool -export -rfc -alias jetty -file cos-bigdata-test-hadoop-01.crt -keystore /etc/security/keytab/keystore -storepass bigdata123 -keypass bigdata123
將證書添加到secondarynamenode所在節(jié)點(diǎn)的jdk的信任庫中醋闭,jdk的信任庫文件是cacerts。
keytool -import -v -trustcacerts -alias cos-bigdata-test-hadoop-01 -file /etc/security/keytab/cos-bigdata-test-hadoop-01.crt -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
4.6 配置Yarn使用LinuxContainerExecutor
- DefaultContainerExecutor:默認(rèn)的啟動(dòng)Container進(jìn)程的程序朝卒,該進(jìn)程所屬的用戶是啟動(dòng)Resourcemanager的用戶证逻,而不是提交任務(wù)的用戶。
- LinuxContainerExecutor:與DefaultContanerExecutor不同點(diǎn)是抗斤,啟動(dòng)Container進(jìn)程的用戶是提交任務(wù)的用戶囚企,而不是啟動(dòng)ResourceManager的用戶。需要保證啟動(dòng)任務(wù)的用戶是系統(tǒng)用戶瑞眼,否則會(huì)找不到用戶龙宏。
1)修改所有節(jié)點(diǎn)的container-executor所有者和權(quán)限,要求其所有者為root伤疙,所有組為hadoop(啟動(dòng)NodeManger的yarn用戶的所屬組)银酗,權(quán)限為6050。其默認(rèn)路徑為$HADOOP_HOME/bin
[root@bigdata1 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/bin/container-executor
[root@bigdata1 ~]# chmod 6050 /opt/module/hadoop-3.1.3/bin/container-executor
[root@bigdata2 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/bin/container-executor
[root@bigdata2 ~]# chmod 6050 /opt/module/hadoop-3.1.3/bin/container-executor
[root@bigdata3 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/bin/container-executor
[root@bigdata3 ~]# chmod 6050 /opt/module/hadoop-3.1.3/bin/container-executor
2)修改所有節(jié)點(diǎn)的container-executor.cfg文件的所有者和權(quán)限徒像,要求該文件及其所有的上級(jí)目錄的所有者均為root黍特,所有組為hadoop(啟動(dòng)NodeManger的yarn用戶的所屬組),權(quán)限為400锯蛀。其默認(rèn)路徑為$HADOOP_HOME/etc/hadoop
[root@bigdata1 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
[root@bigdata1 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop
[root@bigdata1 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc
[root@bigdata1 ~]# chown root:hadoop /opt/module/hadoop-3.1.3
[root@bigdata1 ~]# chown root:hadoop /opt/module
[root@bigdata1 ~]# chmod 400 /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
[root@bigdata2 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
[root@bigdata2 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop
[root@bigdata2 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc
[root@bigdata2 ~]# chown root:hadoop /opt/module/hadoop-3.1.3
[root@bigdata2 ~]# chown root:hadoop /opt/module
[root@bigdata2 ~]# chmod 400 /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
[root@bigdata3 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
[root@bigdata3 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop
[root@bigdata3 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc
[root@bigdata3 ~]# chown root:hadoop /opt/module/hadoop-3.1.3
[root@bigdata3 ~]# chown root:hadoop /opt/module
[root@bigdata3 ~]# chmod 400 /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
3)修改$HADOOP_HOME/etc/hadoop/container-executor.cfg
內(nèi)容如下
# nodemanager所在的組
yarn.nodemanager.linux-container-executor.group=hadoop
# 設(shè)置禁止啟動(dòng)的yarn的用戶衅澈,可以將啟動(dòng)集群的幾個(gè)超級(jí)用戶禁用其啟動(dòng)任務(wù)
banned.users=hdfs,yarn,mapred
# 我們創(chuàng)建的用戶的用戶id是1000+,此處表示啟動(dòng)任務(wù)的最小用戶id谬墙,阻止系統(tǒng)超級(jí)用戶啟動(dòng)任務(wù)
min.user.id=1000
# 設(shè)置允許啟動(dòng)任務(wù)的系統(tǒng)用戶
allowed.system.users=
feature.tc.enabled=false
4)修改$HADOOP_HOME/etc/hadoop/yarn-site.xml文件
增加以下內(nèi)容
<!-- 配置Node Manager使用LinuxContainerExecutor管理Container -->
<property>
<name>yarn.nodemanager.container-executor.class</name>
<value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
</property>
<!-- 配置Node Manager的啟動(dòng)用戶的所屬組 -->
<property>
<name>yarn.nodemanager.linux-container-executor.group</name>
<value>hadoop</value>
</property>
<!-- LinuxContainerExecutor腳本路徑 -->
<property>
<name>yarn.nodemanager.linux-container-executor.path</name>
<value>/opt/module/hadoop-3.1.3/bin/container-executor</value>
</property>
5)分發(fā)container-executor.cfg和yarn-site.xml文件到其他節(jié)點(diǎn)
五今布、安全模式下啟動(dòng)Hadoop
5.1 修改特定本地路徑權(quán)限
local | $HADOOP_LOG_DIR | hdfs:hadoop | drwxrwxr-x |
---|---|---|---|
local | dfs.namenode.name.dir | hdfs:hadoop | drwx------ |
local | dfs.datanode.data.dir | hdfs:hadoop | drwx------ |
local | dfs.namenode.checkpoint.dir | hdfs:hadoop | drwx------ |
local | yarn.nodemanager.local-dirs | yarn:hadoop | drwxrwxr-x |
local | yarn.nodemanager.log-dirs | yarn:hadoop | drwxrwxr-x |
1)$HADOOP_LOG_DIR(所有節(jié)點(diǎn))
該變量位于hadoop-env.sh文件,默認(rèn)值為 ${HADOOP_HOME}/logs
[root@bigdata1 ~]# chown hdfs:hadoop /opt/module/hadoop-3.1.3/logs/
[root@bigdata1 ~]# chmod 775 /opt/module/hadoop-3.1.3/logs/
[root@bigdata2 ~]# chown hdfs:hadoop /opt/module/hadoop-3.1.3/logs/
[root@bigdata2 ~]# chmod 775 /opt/module/hadoop-3.1.3/logs/
[root@bigdata3 ~]# chown hdfs:hadoop /opt/module/hadoop-3.1.3/logs/
[root@bigdata3 ~]# chmod 775 /opt/module/hadoop-3.1.3/logs/
2)dfs.namenode.name.dir(NameNode節(jié)點(diǎn))
該參數(shù)位于hdfs-site.xml文件拭抬,默認(rèn)值為file://${hadoop.tmp.dir}/dfs/name
[root@bigdata1 ~]# chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/name/
[root@bigdata1 ~]# chmod 700 /opt/module/hadoop-3.1.3/data/dfs/name/
3)dfs.datanode.data.dir(DataNode節(jié)點(diǎn))
該參數(shù)為于hdfs-site.xml文件部默,默認(rèn)值為file://${hadoop.tmp.dir}/dfs/data
[root@bigdata1 ~]# chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/data/
[root@bigdata1 ~]# chmod 700 /opt/module/hadoop-3.1.3/data/dfs/data/
4)dfs.namenode.checkpoint.dir(SecondaryNameNode節(jié)點(diǎn))
該參數(shù)位于hdfs-site.xml文件,默認(rèn)值為file://${hadoop.tmp.dir}/dfs/namesecondary
[root@bigdata3 ~]# chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/namesecondary/
[root@bigdata3 ~]# chmod 700 /opt/module/hadoop-3.1.3/data/dfs/namesecondary/
5)yarn.nodemanager.local-dirs(NodeManager節(jié)點(diǎn))
該參數(shù)位于yarn-site.xml文件造虎,默認(rèn)值為file://${hadoop.tmp.dir}/nm-local-dir
[root@bigdata1 ~]# chown -R yarn:hadoop /opt/module/hadoop-3.1.3/data/nm-local-dir/
[root@bigdata1 ~]# chmod -R 775 /opt/module/hadoop-3.1.3/data/nm-local-dir/
[root@bigdata2 ~]# chown -R yarn:hadoop /opt/module/hadoop-3.1.3/data/nm-local-dir/
[root@bigdata2 ~]# chmod -R 775 /opt/module/hadoop-3.1.3/data/nm-local-dir/
[root@bigdata3 ~]# chown -R yarn:hadoop /opt/module/hadoop-3.1.3/data/nm-local-dir/
[root@bigdata3 ~]# chmod -R 775 /opt/module/hadoop-3.1.3/data/nm-local-dir/
6)yarn.nodemanager.log-dirs(NodeManager節(jié)點(diǎn))
該參數(shù)位于yarn-site.xml文件傅蹂,默認(rèn)值為$HADOOP_LOG_DIR/userlogs
[root@bigdata1 ~]# chown yarn:hadoop /opt/module/hadoop-3.1.3/logs/userlogs/
[root@bigdata1 ~]# chmod 775 /opt/module/hadoop-3.1.3/logs/userlogs/
[root@bigdata2 ~]# chown yarn:hadoop /opt/module/hadoop-3.1.3/logs/userlogs/
[root@bigdata2 ~]# chmod 775 /opt/module/hadoop-3.1.3/logs/userlogs/
[root@bigdata3 ~]# chown yarn:hadoop /opt/module/hadoop-3.1.3/logs/userlogs/
[root@bigdata3 ~]# chmod 775 /opt/module/hadoop-3.1.3/logs/userlogs/
7)HADOOP_PID_DIR
如果修改過該參數(shù),則需要保證該存儲(chǔ)pid文件的路徑允許hdfs:hadoop用戶訪問算凿。我在profile文件中將HADOOP_PID_DIR設(shè)置為${HADOOP_HOME}/pids/hdfs份蝴,則需要修改該路徑的用戶和權(quán)限
[root@bigdata1 ~]# chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/pids/hdfs
[root@bigdata1 ~]# chmod -R 775 /opt/module/hadoop-3.1.3/pids/hdfs
[root@bigdata2 ~]# chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/pids/hdfs
[root@bigdata2 ~]# chmod -R 775 /opt/module/hadoop-3.1.3/pids/hdfs
[root@bigdata3 ~]# chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/pids/hdfs
[root@bigdata3 ~]# chmod -R 775 /opt/module/hadoop-3.1.3/pids/hdfs
8)HADOOP_MAPRED_PID_DIR
如果修改過該參數(shù),則需要保證該存儲(chǔ)pid文件的路徑允許mapred:hadoop用戶訪問氓轰。我在profile文件中將HADOOP_MAPRED_PID_DIR設(shè)置為${HADOOP_HOME}/pids/mapred婚夫,則需要修改該路徑的用戶和權(quán)限
[root@bigdata1 ~]# chown -R mapred:hadoop /opt/module/hadoop-3.1.3/pids/mapred
[root@bigdata1 ~]# chmod -R 775 /opt/module/hadoop-3.1.3/pids/mapred
[root@bigdata2 ~]# chown -R mapred:hadoop /opt/module/hadoop-3.1.3/pids/mapred
[root@bigdata2 ~]# chmod -R 775 /opt/module/hadoop-3.1.3/pids/mapred
[root@bigdata3 ~]# chown -R mapred:hadoop /opt/module/hadoop-3.1.3/pids/mapred
[root@bigdata3 ~]# chmod -R 775 /opt/module/hadoop-3.1.3/pids/mapred
5.2 啟動(dòng)HDFS
需要注意的是,啟動(dòng)不同服務(wù)時(shí)需要使用對應(yīng)的用戶
1. 單點(diǎn)啟動(dòng)
(1)啟動(dòng)NameNode
[root@bigdata1 ~]# sudo -i -u hdfs hdfs --daemon start namenode
(2)啟動(dòng)DataNode
[root@bigdata1 ~]# sudo -i -u hdfs hdfs --daemon start datanode
[root@bigdata2 ~]# sudo -i -u hdfs hdfs --daemon start datanode
[root@bigdata3 ~]# sudo -i -u hdfs hdfs --daemon start datanode
(3)啟動(dòng)SecondaryNameNode
[root@bigdata3 ~]# sudo -i -u hdfs hdfs --daemon start secondarynamenode
說明:
-i:重新加載環(huán)境變量
-u:以特定用戶的身份執(zhí)行后續(xù)命令
2. 群起
1)在主節(jié)點(diǎn)(bigdata1)配置hdfs用戶到所有節(jié)點(diǎn)的免密登錄署鸡。
ssh-keygen -t rsa
ssh-copy-id bigdata2
ssh-copu-id bigdata3
2)修改主節(jié)點(diǎn)(bigdata1)節(jié)點(diǎn)的$HADOOP_HOME/sbin/start-dfs.sh腳本案糙,在頂部增加以下環(huán)境變量限嫌。在頂部增加如下內(nèi)容
HDFS_DATANODE_USER=hdfs
HDFS_NAMENODE_USER=hdfs
HDFS_SECONDARYNAMENODE_USER=hdfs
注:$HADOOP_HOME/sbin/stop-dfs.sh也需在頂部增加上述環(huán)境變量才可使用。
3)以root用戶執(zhí)行群起腳本时捌,即可啟動(dòng)HDFS集群怒医。
[root@bigdata1 ~]# start-dfs.sh
3.查看HFDS web頁面
訪問地址為 https://bigdata1:9871
查看節(jié)點(diǎn)是否都注冊成功。
注:如果遇到Datanode無法注冊的問題奢讨,可能是jdk的jce版本問題稚叹。下載,解壓得到的local_policy.jar和US_export_policy.jar替換到$JAVA_HOME/jre/lib/security目錄下拿诸。然后同步到其他節(jié)點(diǎn)扒袖,因?yàn)镹odeManager同樣會(huì)遇到這個(gè)問題。
5.3 修改HDFS特定路徑訪問權(quán)限
hdfs | / | hdfs:hadoop | drwxr-xr-x |
---|---|---|---|
hdfs | /tmp | hdfs:hadoop | drwxrwxrwxt |
hdfs | /user | hdfs:hadoop | drwxrwxr-x |
hdfs | yarn.nodemanager.remote-app-log-dir | yarn:hadoop | drwxrwxrwxt |
hdfs | mapreduce.jobhistory.intermediate-done-dir | mapred:hadoop | drwxrwxrwxt |
hdfs | mapreduce.jobhistory.done-dir | mapred:hadoop | drwxrwx--- |
說明:hdfs是啟動(dòng)集群的用戶佳镜,所以是超級(jí)用戶僚稿,將hdfs下的特定路徑的所屬用戶組進(jìn)行更改凡桥。若上述路徑不存在蟀伸,需手動(dòng)創(chuàng)建
1)創(chuàng)建hdfs/hadoop主體,執(zhí)行以下命令并按照提示輸入密碼
[root@bigdata1 ~]# kadmin.local -q "addprinc hdfs/hadoop"
2)認(rèn)證hdfs/hadoop主體缅刽,執(zhí)行以下命令并按照提示輸入密碼
[root@bigdasta1 ~]# kinit hdfs/hadoop
需要獲取hdfs的超級(jí)用戶時(shí)啊掏,需要認(rèn)證為hdfs/hadoop;需要獲取kerberos管理員權(quán)限時(shí)衰猛,需要認(rèn)證為admin/admin迟蜜。
3)按照上述要求修改指定路徑的所有者和權(quán)限
(1)修改/、/tmp啡省、/user路徑
[root@bigdasta1 ~]# hadoop fs -chown hdfs:hadoop / /tmp /user
[root@bigdasta1 ~]# hadoop fs -chmod 755 /
[root@bigdasta1 ~]# hadoop fs -chmod 1777 /tmp
[root@bigdasta1 ~]# hadoop fs -chmod 775 /user
(2)參數(shù)yarn.nodemanager.remote-app-log-dir位于yarn-site.xml文件娜睛,默認(rèn)值/tmp/logs
[root@bigdasta1 ~]# hadoop fs -chown yarn:hadoop /tmp/logs
[root@bigdasta1 ~]# hadoop fs -chmod 1777 /tmp/logs
(3)參數(shù)mapreduce.jobhistory.intermediate-done-dir位于mapred-site.xml文件,默認(rèn)值為/tmp/hadoop-yarn/staging/history/done_intermediate卦睹,需保證該路徑的所有上級(jí)目錄(除/tmp)的所有者均為mapred畦戒,所屬組為hadoop,權(quán)限為770
[root@bigdasta1 ~]# hadoop fs -chown -R mapred:hadoop /tmp/hadoop-yarn/staging/history/done_intermediate
[root@bigdasta1 ~]# hadoop fs -chmod -R 1777 /tmp/hadoop-yarn/staging/history/done_intermediate
[root@bigdasta1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/history/
[root@bigdasta1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/
[root@bigdasta1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/
[root@bigdasta1 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/history/
[root@bigdasta1 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/
[root@bigdasta1 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/
(4)參數(shù)mapreduce.jobhistory.done-dir位于mapred-site.xml文件结序,默認(rèn)值為/tmp/hadoop-yarn/staging/history/done障斋,需保證該路徑的所有上級(jí)目錄(除/tmp)的所有者均為mapred,所屬組為hadoop徐鹤,權(quán)限為770
[root@bigdasta1 ~]# hadoop fs -chown -R mapred:hadoop /tmp/hadoop-yarn/staging/history/done
[root@bigdasta1 ~]# hadoop fs -chmod -R 750 /tmp/hadoop-yarn/staging/history/done
[root@bigdasta1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/history/
[root@bigdasta1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/
[root@bigdasta1 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/
[root@bigdasta1 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/history/
[root@bigdasta1 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/
[root@bigdasta1 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/
5.4 啟動(dòng)Yarn
1. 單點(diǎn)啟動(dòng)
啟動(dòng)ResourceManager
[root@bigdata2 ~]# sudo -i -u yarn yarn --daemon start resourcemanager
啟動(dòng)NodeManager
[root@bigdata1 ~]# sudo -i -u yarn yarn --daemon start nodemanager
[root@bigdata2 ~]# sudo -i -u yarn yarn --daemon start nodemanager
[root@bigdata3 ~]# sudo -i -u yarn yarn --daemon start nodemanager
2. 群起
1)在Yarn主節(jié)點(diǎn)(bigdata2)配置yarn用戶到所有節(jié)點(diǎn)的免密登錄垃环。
2)修改主節(jié)點(diǎn)(bigdata2)的$HADOOP_HOME/sbin/start-yarn.sh,在頂部增加以下環(huán)境變量返敬。在頂部增加如下內(nèi)容
YARN_RESOURCEMANAGER_USER=yarn
YARN_NODEMANAGER_USER=yarn
注:stop-yarn.sh也需在頂部增加上述環(huán)境變量才可使用遂庄。
3)以root用戶執(zhí)行$HADOOP_HOME/sbin/start-yarn.sh腳本即可啟動(dòng)yarn集群。
[root@bigdata2 ~]# start-yarn.sh
3. 訪問Yarnweb頁面
訪問地址為 http://bigdata2:8088
查看節(jié)點(diǎn)是否都注冊成功
5.5 啟動(dòng)HistoryServer
1.啟動(dòng)歷史服務(wù)器
[root@bigdata3 ~]# sudo -i -u mapred mapred --daemon start historyserver
2. 查看歷史服務(wù)器web頁面
訪問地址為 http://bigdata3:19888
六劲赠、安全集群使用說明
6.1 用戶要求
1. 具體要求
以下使用說明均基于普通用戶涧团,安全集群對用戶有以下要求:
1)集群中的每個(gè)節(jié)點(diǎn)都需要?jiǎng)?chuàng)建該用戶
2)該用戶需要屬于hadoop用戶組
3)需要?jiǎng)?chuàng)建該用戶對應(yīng)的Kerberos主體
2. 實(shí)操
此處以hxr用戶為例只磷,具體操作如下
1)創(chuàng)建用戶(存在可跳過),須在所有節(jié)點(diǎn)執(zhí)行
[root@bigdata1 ~]# useradd hxr
[root@bigdata1 ~]# echo hxr| passwd --stdin hxr
[root@bigdata2 ~]# useradd hxr
[root@bigdata2 ~]# echo hxr| passwd --stdin hxr
[root@bigdata3 ~]# useradd hxr
[root@bigdata3 ~]# echo hxr| passwd --stdin hxr
2)加入hadoop組泌绣,須在所有節(jié)點(diǎn)執(zhí)行
[root@bigdata1 ~]# usermod -a -G hadoop hxr
[root@bigdata2 ~]# usermod -a -G hadoop hxr
[root@bigdata3 ~]# usermod -a -G hadoop hxr
3)創(chuàng)建主體
[root@bigdata1 ~]# kadmin -p admin/admin -wadmin -q"addprinc -pw bigdata123 hxr"
6.2 訪問HDFS集群文件
6.2.1 Shell命令
- 認(rèn)證
[hxr@bigdata1 ~]$ kinit hxr
- 查看當(dāng)前認(rèn)證用戶
[hxr@bigdata1 ~]$ kinit hxr
- 執(zhí)行命令
[hxr@bigdata1 ~]$ hadoop fs -ls /
4.注銷認(rèn)證
[hxr@bigdata1 ~]$ kdestroy
5.再次執(zhí)行查看命令
[hxr@bigdata1 ~]$ hadoop fs -ls /
6.2.2 Win系統(tǒng)web頁面
-
安裝Kerberos客戶端
官網(wǎng): http://web.mit.edu/kerberos/dist/#kfw-3.2
下載地址:http://web.mit.edu/kerberos/dist/kfw/4.1/kfw-4.1-amd64.msi1)下載之后按照提示安裝
2)編輯C:\ProgramData\MIT\Kerberos5\krb5.ini文件钮追,內(nèi)容如下
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
forwardable = true
rdns = false
default_realm = IOTMARS.COM
[realms]
IOTMARS.COM = {
kdc = 192.168.101.174
admin_server = 192.168.101.174
}
[domain_realm]
注意:安裝完成后,會(huì)自動(dòng)將kerberos的bin目錄路徑加到環(huán)境變量中阿迈。如果安裝了JDK的用戶需要注意將kerberos的環(huán)境變量挪到JDK變量之前元媚,因?yàn)镴DK中也有 kinit, klist 等命令,系統(tǒng)會(huì)按環(huán)境變量順序來使用命令苗沧。
配置火狐瀏覽器
1)打開瀏覽器刊棕,在地址欄輸入“about:config”,點(diǎn)擊回車
2)搜索“network.negotiate-auth.trusted-uris”待逞,修改值為要訪問的主機(jī)名(bigdata1)
3)搜索“network.auth.use-sspi”甥角,雙擊將值變?yōu)閒alse認(rèn)證
1)啟動(dòng)Kerberos客戶端,點(diǎn)擊Get Ticket
2)輸入主體名和密碼识樱,點(diǎn)擊OK
3)認(rèn)證成功訪問HDFS
https://bigdata1:9871注銷認(rèn)證嗤无;刪除緩存數(shù)據(jù)并重啟瀏覽器,再次訪問HDFS怜庸,訪問失敗当犯。
6.2.3 IOS系統(tǒng)web頁面
Mac OS系統(tǒng)預(yù)安裝了Kerberos,需要修改配置割疾。官方教程
創(chuàng)建配置文件 /etc/krb5.conf 嚎卫,配置文件內(nèi)容同上
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
forwardable = true
rdns = false
default_realm = IOTMARS.COM
[realms]
IOTMARS.COM = {
kdc = 192.168.101.174
admin_server = 192.168.101.174
}
[domain_realm]
執(zhí)行命令 kinit xxx
進(jìn)行認(rèn)證。
可以直接通過Safari訪問宏榕。
也可以使用火狐瀏覽器拓诸,配置同上。
6.3 提交MapReduce任務(wù)
- 認(rèn)證
[hxr@bigdata1 ~]$ kinit hxr
2.提交任務(wù)
[hxr@bigdata1 ~]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1
七麻昼、Hive用戶認(rèn)證配置
7.1 前置要求
7.1.1 Hadoop集群啟動(dòng)Kerberos認(rèn)證
按照上述步驟為Hadoop集群開啟Kerberos安全認(rèn)證奠支。
Hadoop開啟Kerberos認(rèn)證后,直接通過bin/hive命令啟動(dòng)hive本地客戶端涌献,也需要通過kinit 進(jìn)行認(rèn)證胚宦,否則無法讀取到hdfs上的數(shù)據(jù)羞福。
如果hive配置的執(zhí)行引擎是spark两芳,那么spark向yarn提交任務(wù)時(shí)需要Kerberos認(rèn)證殖演,此時(shí)即是是hive本地客戶端杀赢,也需要在hive-site.xml中配置Kerberos認(rèn)證力崇。
以下是對Hive和HiveServer2服務(wù)進(jìn)行Kerberos配置廉羔,為hive的本地提交任務(wù)和遠(yuǎn)程提交任務(wù)提供Kerberos認(rèn)證蛔六。
7.1.2 創(chuàng)建Hive系統(tǒng)用戶和Kerberos主體
- 創(chuàng)建系統(tǒng)用戶
[root@bigdata1 ~]# useradd hive -g hadoop
[root@bigdata1 ~]# echo hive | passwd --stdin hive
[root@bigdata2 ~]# useradd hive -g hadoop
[root@bigdata2 ~]# echo hive | passwd --stdin hive
[root@bigdata3 ~]# useradd hive -g hadoop
[root@bigdata3 ~]# echo hive | passwd --stdin hive
- 創(chuàng)建Kerberos主體并生成keytab文件
創(chuàng)建hive用戶的Kerberos主體
在Hive所部署的節(jié)點(diǎn)生成keytab文件[root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey hive/bigdata1" [root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey hive/bigdata2" [root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey hive/bigdata3"
[root@bigdata1 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hive.service.keytab hive/bigdata1" [root@bigdata2 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hive.service.keytab hive/bigdata2" [root@bigdata3 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hive.service.keytab hive/bigdata3"
- 修改keytab文件所有者和訪問權(quán)限
[root@bigdata1 ~]# chown -R root:hadoop /etc/security/keytab/ [root@bigdata1 ~]# chmod 660 /etc/security/keytab/hive.service.keytab [root@bigdata2 ~]# chown -R root:hadoop /etc/security/keytab/ [root@bigdata2 ~]# chmod 660 /etc/security/keytab/hive.service.keytab [root@bigdata3 ~]# chown -R root:hadoop /etc/security/keytab/ [root@bigdata3 ~]# chmod 660 /etc/security/keytab/hive.service.keytab
7.2 配置認(rèn)證
- 修改$HIVE_HOME/conf/hive-site.xml文件磷蜀,增加如下屬性
<!-- HiveServer2啟用Kerberos認(rèn)證 -->
<property>
<name>hive.server2.authentication</name>
<value>kerberos</value>
</property>
<!-- HiveServer2服務(wù)的Kerberos主體 -->
<property>
<name>hive.server2.authentication.kerberos.principal</name>
<value>hive/_HOST@IOTMARS.COM</value>
</property>
<!-- HiveServer2服務(wù)的Kerberos密鑰文件 -->
<property>
<name>hive.server2.authentication.kerberos.keytab</name>
<value>/etc/security/keytab/hive.service.keytab</value>
</property>
<!-- Metastore啟動(dòng)認(rèn)證 -->
<property>
<name>hive.metastore.sasl.enabled</name>
<value>true</value>
</property>
<!-- Metastore Kerberos密鑰文件 -->
<property>
<name>hive.metastore.kerberos.keytab.file</name>
<value>/etc/security/keytab/hive.service.keytab</value>
</property>
<!-- Metastore Kerberos主體 -->
<property>
<name>hive.metastore.kerberos.principal</name>
<value>hive/_HOST@IOTMARS.COM</value>
</property>
- 修改$HADOOP_HOME/etc/hadoop/core-site.xml文件轴捎,具體修改如下
1)刪除以下參數(shù)
<property>
<name>hadoop.http.staticuser.user</name>
<value>hxr</value>
</property>
<property>
<name>hadoop.proxyuser.hxr.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hxr.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hxr.users</name>
<value>*</value>
</property>
hadoop.http.staticuser.user是指定訪問Namenode網(wǎng)頁時(shí)的用戶鹤盒。目前已經(jīng)被Kerberos取代了蚕脏,所以可以刪除。
2)增加以下參數(shù)
<property>
<name>hadoop.proxyuser.hive.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hive.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hive.users</name>
<value>*</value>
</property>
proxyuser就是為了hiveserver2進(jìn)行配置的侦锯。試想一下驼鞭,[hive]用戶啟動(dòng)了hive客戶端,如果[zhangsan]用戶提交了一個(gè)hive任務(wù)尺碰,那么是以哪個(gè)用戶身份向yarn提交任務(wù)呢挣棕?是以[hive]的身份提交任務(wù),所以會(huì)造成權(quán)限的混亂亲桥。此時(shí)我們配置proxyuser代理用戶為啟動(dòng)hiveserver2進(jìn)程的[hive]用戶洛心,再次執(zhí)行hive任務(wù),那么此時(shí)一些啟動(dòng)和善后任務(wù)由代理用戶[hive]執(zhí)行题篷,但是向yarn提交任務(wù)的用戶是[zhangsan]词身。
3.分發(fā)配置core-site.xml文件
[root@bigdata1 ~]# xsync $HADOOP_HOME/etc/hadoop/core-site.xml
4.重啟Hadoop集群
[root@bigdata1 ~]# stop-dfs.sh
[root@bigdata1 ~]# start-dfs.sh
[root@bigdata2 ~]# stop-yarn.sh
[root@bigdata2 ~]# start-yarn.sh
7.3 啟動(dòng)hiveserver2
注:需使用hive用戶啟動(dòng)
修改日志文件所屬用戶
[root@bigdata1 ~]# chown -R hive:hadoop /opt/module/hive-3.1.2/logs
如果是hive-on-spark,需要修改指定的spark日志存儲(chǔ)路徑的權(quán)限(如指定spark.eventLog.dir = hdfs://bigdata1:9820/spark/history)
[root@bigdata1 ~]# hadoop fs -chown hive:hadoop /spark/history
[root@bigdata1 ~]# hadoop fs -chmod 777 /spark/history
hive用戶啟動(dòng)并輸出日志
[root@bigdata1 ~]# sudo -i -u hive nohup hiveserver2 1>/opt/module/hive-3.1.2/logs/hive-on-spark.log 2>/opt/module/hive-3.1.2/logs/hive-on-spark.err &
八番枚、Hive Kerberos認(rèn)證使用說明
以下說明均基于普通用戶
注意:如果是本地hive啟動(dòng)的hive任務(wù)法严,那么當(dāng)前用戶就是啟動(dòng)hive客戶端的用戶;如果是啟動(dòng)了hiveserver2户辫,然后通過遠(yuǎn)程客戶端提交的任務(wù)渐夸,那么當(dāng)前用戶就是遠(yuǎn)程登陸的用戶嗤锉,而不是啟動(dòng)hiveserver2的用戶渔欢。
此時(shí)就需要注意hdfs上執(zhí)行任務(wù)所需目錄的權(quán)限問題,包括spark-history瘟忱、/user/[用戶名] 等路徑的讀寫權(quán)限奥额。
8.1 beeline客戶端
1.認(rèn)證,執(zhí)行以下命令访诱,并按照提示輸入密碼
[hxr@bigdata1 ~]$ kinit hxr
2.使用beeline客戶端連接hiveserver2
[hxr@bigdata1 ~]$ beeline
使用如下url進(jìn)行連接
beeline> !connect jdbc:hive2://bigdata1:10000/;principal=hive/bigdata1@IOTMARS.COM
3.查看當(dāng)前登陸用戶(當(dāng)前kinit認(rèn)證的用戶)
0: jdbc:hive2://bigdata1:10000/> select current_user();
+------+
| _c0 |
+------+
| hxr |
+------+
1 row selected (0.454 seconds)
8.2 Win系統(tǒng)DataGrip客戶端
DataGrip中的Hive連接驅(qū)動(dòng)沒有整合Kerberos認(rèn)證垫挨,所以需要自定義Hive驅(qū)動(dòng)。
8.2.1 新建Driver
-
創(chuàng)建Driver
配置Driver
URL templates:jdbc:hive2://{host}:{port}/{database}[;<;,{:identifier}={:param}>]
8.2.2 新建連接
1)基礎(chǔ)配置
url:jdbc:hive2://bigdata1:10000/;principal=hive/bigdata1@IOTMARS.COM
2)高級(jí)配置
配置參數(shù):
-Djava.security.krb5.conf="C:\\ProgramData\\MIT\\Kerberos5\\krb5.ini"
-Djava.security.auth.login.config="C:\\ProgramData\\MIT\\Kerberos5\\hxr.conf"
-Djavax.security.auth.useSubjectCredsOnly=false
3)編寫JAAS(Java認(rèn)證授權(quán)服務(wù))配置文件hxr.conf触菜,內(nèi)容如下九榔,文件名和路徑須和上圖中java.security.auth.login.config參數(shù)的值保持一致。
com.sun.security.jgss.initiate{
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
useTicketCache=false
keyTab="C:\\ProgramData\\MIT\\Kerberos5\\hxr.keytab"
principal="hxr@IOTMARS.COM";
};
4)為用戶生成keytab文件涡相,在krb5kdc所在節(jié)點(diǎn)(192.168.101.174)執(zhí)行以下命令
[root@192.168.101.174 ~]# kadmin.local -q"xst -norandkey -k /root/hxr.keytab hxr"
5)將上一步生成的hxr.keytab文件放到hxr.conf中配置的keytab的路徑下
6)測試連接
8.3 IOS系統(tǒng)DataGrip客戶端
同Win系統(tǒng)的配置哲泊。
九、數(shù)倉全流程認(rèn)證
Hadoop啟用Kerberos安全認(rèn)證之后催蝗,之前的非安全環(huán)境下的全流程調(diào)度腳本和即席查詢引擎均會(huì)遇到認(rèn)證問題切威,故需要對其進(jìn)行改進(jìn)。
需要認(rèn)證的框架如下:
- flume導(dǎo)出到hdfs
- 運(yùn)行hive任務(wù)腳本
- datax導(dǎo)入hdfs業(yè)務(wù)數(shù)據(jù)到hdfs
- sqoop導(dǎo)出hdfs數(shù)據(jù)到報(bào)表庫
- Presto即席查詢
9.1 準(zhǔn)備工作
此處統(tǒng)一將數(shù)倉的全部數(shù)據(jù)資源的所有者設(shè)為hive用戶丙号,全流程的每步操作均認(rèn)證為hive用戶先朦。
- 創(chuàng)建用戶
前面已經(jīng)創(chuàng)建過了可以跳過
[root@bigdata1 ~]# useradd hive -g hadoop
[root@bigdata1 ~]# echo hive | passwd --stdin hive
[root@bigdata2 ~]# useradd hive -g hadoop
[root@bigdata2 ~]# echo hive | passwd --stdin hive
[root@bigdata3 ~]# useradd hive -g hadoop
[root@bigdata3 ~]# echo hive | passwd --stdin hive
- 為hive用戶創(chuàng)建主體
現(xiàn)在創(chuàng)建的主體是為了用戶進(jìn)行登陸使用缰冤,注意與先前創(chuàng)建的用于hive服務(wù)認(rèn)證的主體hive/bigdata1@IOTMARS.COM進(jìn)行區(qū)別。
1)創(chuàng)建主體
[root@bigdata1 ~]# kadmin -padmin/admin -wPassword@123 -q"addprinc -randkey hive"
2)生成keytab文件
[root@bigdata1 ~]# kadmin -padmin/admin -wPassword@123 -q"xst -k /etc/security/keytab/hive.keytab hive"
3)修改keytab文件的所有者和訪問權(quán)限
[root@bigdata1 ~]# chown hive:hadoop /etc/security/keytab/hive.keytab
[root@bigdata1 ~]# chmod 440 /etc/security/keytab/hive.keytab
4)分發(fā)到其他節(jié)點(diǎn)
- 修改HDFS存儲(chǔ)數(shù)據(jù)的路徑所有者
[root@bigdata3 logs]# hadoop fs -chown -R hive:hadoop /warehouse
[root@bigdata3 logs]# hadoop fs -chown -R hive:hadoop /origin_data
9.2 DataX認(rèn)證配置
需要添加三個(gè)參數(shù)
- "haveKerberos": "true"
- "kerberosKeytabFilePath": "/etc/security/keytab/hive.keytab"
- "kerberosPrincipal": "hive@IOTMARS.COM"
例:
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://192.168.101.179:9820",
"fileType": "text",
"path": "/origin_data/compass/fineDB/FR_DIM_PRODUCT",
"fileName": "FR_DIM_PRODUCT",
"writeMode": "nonConflict",
"fieldDelimiter": "\t",
"haveKerberos": "true",
"kerberosKeytabFilePath": "/etc/security/keytab/hive.keytab",
"kerberosPrincipal": "hive@IOTMARS.COM",
"column": [
{
"name": "cinvcname_real",
"type": "string"
},
{
"name": "channel1",
"type": "string"
}
]
}
}
注:如果出現(xiàn)異常Message stream modified (41)喳魏,將/etc/krb5.conf中的renew_lifetime = xxx注釋掉即可棉浸。
實(shí)際使用中還出現(xiàn)了異常如下
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /origin_data/compass/fineDB/FR_DIM_PRODUCT__49f79963_22df_4c74_85c3_f67ea52d83b4/FR_DIM_PRODUCT__59313560_d74b_418d_bd9f_814bfa17288f could only be written to 0 of the 1 minReplication nodes. There are 3 datanode(s) running and 3 node(s) are excluded in this operation.
因?yàn)镠adoop集群的hdfs-site.xml中配置了dfs.data.transfer.protection=authentication,而Datax沒有配置刺彩,在Datax源碼中加上hadoopConf.set("dfs.data.transfer.protection", "authentication");
后重新打包即可涮拗。
9.3 Flume認(rèn)證配置
修改/opt/module/flume/conf/kafka-flume-hdfs.conf配置文件,增加以下參數(shù)
a1.sinks.k1.hdfs.kerberosPrincipal=hive@IOTMARS.COM
a1.sinks.k1.hdfs.kerberosKeytab=/etc/security/keytab/hive.keytab
9.4 Hive腳本認(rèn)證配置
數(shù)倉各層腳本均需在頂部加入如下認(rèn)證語句
kinit -kt /etc/security/keytab/hive.keytab hive
注:可以使用sed命令快速添加語句迂苛,sed -i '1 a text' file
表示將text內(nèi)容加入到file文件的第1行之后
9.5 Sqoop認(rèn)證配置
修改sqoop每日同步腳本/home/atguigu/bin/mysql_to_hdfs.sh
在頂部增加如下認(rèn)證語句
kinit -kt /etc/security/keytab/hive.keytab hive
例:
#!/bin/bash
kinit -kt /etc/security/keytab/hive.keytab hive
sqoop=/opt/module/sqoop-1.4.6/bin/sqoop
if [ -n '$1' ];then
do_date=$1
else
do_date=`date -d '-1 day' +%F`
fi
import_data(){
$sqoop import \
--connect "jdbc:mysql://192.168.101.174:3306/azkaban?characterEncoding=utf-8&useSSL=false" \
--username root \
--password Password@123 \
--query "$2 and \$CONDITIONS" \
--num-mappers 1 \
--target-dir /origin_data/compass/fineDB/$1/$do_date \
--delete-target-dir \
--fields-terminated-by '\t' \
--compress \
--compression-codec lzop \
--null-string '\\N' \
--null-non-string '\\N'
}
import_data test "select * from executors where 1=1"
9.6 Azkaban認(rèn)證配置
只是調(diào)度腳本三热,不需要認(rèn)證。
需要注意的是三幻,調(diào)度腳本中的認(rèn)證命令kinit -kt /etc/security/keytab/hive.keytab hive
需要有權(quán)限就漾,可以保證能成功執(zhí)行。
注:可以創(chuàng)建一個(gè)azkaban:hadoop用戶來啟動(dòng)azkaban念搬。
9.7 Presto認(rèn)證配置
待續(xù)
9.8 Kylin認(rèn)證配置
待續(xù)
9.9 Flink On Yarn認(rèn)證配置
9.9.1 使用本地主機(jī)的token認(rèn)證
- 在本地Kerberos客戶端完成用戶認(rèn)證獲取token
kinit chenjie
- 在Flink的配置文件flink-conf.yaml中添加配置
security.kerberos.login.use-ticket-cache: true
這是直接運(yùn)行Flink向Yarn提交任務(wù)時(shí)就會(huì)自動(dòng)完成Kerberos認(rèn)證抑堡。
但是token會(huì)過期,推薦使用keytab完成認(rèn)證朗徊。
9.9.2 使用keytab認(rèn)證
這種方式時(shí)通過客戶端將keytab提交到Hadoop集群首妖,再通過YARN分發(fā)keytab給AM和其他 worker container,具體步驟如下:
- Flink客戶端在提交任務(wù)時(shí)爷恳,將keytab上傳至HDFS有缆,將其作為AM需要本地化的資源。
- AM container初始化時(shí)NodeManager將keytab拷貝至container的資源目錄温亲,然后再AM啟動(dòng)時(shí)通過UserGroupInformation.loginUserFromKeytab()來重新認(rèn)證棚壁。
- 當(dāng)AM需要申請其他worker container時(shí),也將 HDFS 上的keytab列為需要本地化的資源栈虚,因此worker container也可以仿照AM的認(rèn)證方式進(jìn)行認(rèn)證袖外。
- 此外AM和container都必須額外實(shí)現(xiàn)一個(gè)線程來定時(shí)刷新TGT。
- 任務(wù)運(yùn)行結(jié)束后魂务,集群中的keytab也會(huì)隨container被清理掉曼验。
在配置文件flink-conf.yaml中配置如下
security.kerberos.login.keytab: /home/hadoop_runner/hadoop-3.2.1/etc/hadoop/krb5.keytab
security.kerberos.login.principal: flink
security.kerberos.login.contexts: Client
9.10 Hadoop-Client 認(rèn)證
package com.cj.cdc;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.security.UserGroupInformation;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
public class HadoopFile {
public static void main(String[] args) throws IOException, URISyntaxException {
// 1. 完成kerberos認(rèn)證配置
// 1.1 獲取配置文件位置
URL krb5Conf = Thread.currentThread().getContextClassLoader().getResource("krb5.conf");
URL keytab = Thread.currentThread().getContextClassLoader().getResource("chenjie.keytab");
// 1.2 配置參數(shù)
System.setProperty("java.security.krb5.conf", krb5Conf.getPath());
System.setProperty("hadoop.home.dir", "D:\\hadoop-3.0.0");
Configuration configuration = new Configuration();
configuration.set("hadoop.security.authentication", "kerberos");
configuration.set("dfs.data.transfer.protection", "authentication");
configuration.set("dfs.namenode.kerberos.principal", "nn/_HOST@IOTMARS.COM");
UserGroupInformation.setConfiguration(configuration);
UserGroupInformation.loginUserFromKeytab("chenjie", keytab.getPath());
// 2. 獲取文件系統(tǒng)
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.101.184:9820"), configuration);
// 3. 下載文件
fs.copyToLocalFile(new Path("/tez/apache-tez-0.10.1-bin.tar.gz"),new Path("G:/download.gz"));
// 4. 關(guān)閉資源
fs.close();
}
}
注意:
- 可以直接將hadoop的配置文件core-site.xml和hdfs-site.xml放到resource目錄下,Configuration類的靜態(tài)代碼塊中會(huì)加載這倆文件粘姜,文件中已經(jīng)配置的參數(shù)在代碼中可以省略鬓照。
- 在win端進(jìn)行遠(yuǎn)程調(diào)試且有文件傳輸?shù)那闆r下,需要在本地創(chuàng)建目錄hadoop/bin并在該目錄中下載hadoop.dll和winutils.exe文件相艇,然后在環(huán)境變量或代碼中指向該目錄颖杏,否則會(huì)報(bào)錯(cuò)。
9.11 FlinkCDC 認(rèn)證
參考
http://web.mit.edu/kerberos/krb5-current/doc/admin/admin_commands/kadmin_local.html#commands
http://hadoop.apache.org/docs/r3.1.3/hadoop-project-dist/hadoop-common/SecureMode.html