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 文件锦援。
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_life
和max_renewable_life
這個2個屬性抗碰,前者表示服務端允許的Service ticket最大生命周期狮斗,后者表示服務端允許的Service ticket更新周期。這2個屬性必須分別大于等于客戶端對應的配置ticket_lifetime
和renew_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逗余;
再次確認完畢后進入如下步驟:
- 進入 Cloudera Manager Admin Console 界面并且點擊 cluster 右邊的按鈕選擇Enable Kerberos特咆;
- 點擊 Continue,進入下一頁進行配置录粱,要注意的是:這里的 Kerberos Encryption Types 必須跟KDC實際支持的加密類型匹配(即kdc.conf中的值)腻格,這里使用了默認的
aes256-cts
,注意啥繁,這里的 Kerberos Encryption Types 必須和/etc/krb5.conf中的default_tgs_enctypes
菜职、default_tkt_enctypes
和permitted_enctypes
三個選項的值對應起來,不然會出現(xiàn)集群服務無法認證通過的情況旗闽! - 點擊 Continue酬核,進入下一頁,這一頁中不勾選 Manage krb5.conf through Cloudera Manager 宪睹,否則會修改掉之前配置的acl愁茁,造成 enable kerberos 失敗亭病;
- 點擊 Continue鹅很,進入下一頁,輸入 Cloudera Manager Principal 的管理員賬號和密碼罪帖,注意輸入賬號的時候要使用@前要使用全稱促煮,本文使用的是
cdh-master/admin@DOMAIN.COM
邮屁; - 點擊 Continue,進入下一頁菠齿,導入 KDC Account Manager Credentials佑吝;
- 點擊 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.COM
的renewlife
被設(shè)置成了0棚放,這一點可以通過kadmin => getprinc krbtgt/DOMAIN.COM@DOMAIN.COM
看出來。將krbtgt/DOMAIN.COM@DOMAIN.COM
的renewlife
修改為 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暴凑;