Kerberos基本原理、安裝部署及用法
1. 概述
Kerberos是一種認證機制。
目的是,通過金鑰系統為客戶端/伺服器應用程式提供強大的認證系統:保護伺服器防止錯誤的使用者使用,同時保護它的使用者使用正確的伺服器,即支援雙向驗證;Kerberos協議的整個認證過程實現不依賴於主機作業系統的認證,無需基於主機地址的信任,不要求網路上所有主機的物理安全,並假定網路上傳送的資料包可以被任意地讀取、修改和插入資料,簡而言之,Kerberos通過傳統的加密技術(共享金鑰)實現了一種可信任的第三方認證服務。
KDC(key distribution center):是一個網路服務,提供ticket和臨時會話金鑰。
AS(Authentication Server):認證伺服器
TGS(Ticket Grantion Server):許可證伺服器
TGT:Ticket-grantion Ticket
realmname:包含KDC和許多客戶端的Kerberos網路,類似於域,俗稱為領域;也是principal的一個“容器”或者“名稱空間”。相對應的,principal的命名規則是"what_name_you_like@realm"。在kerberos,大家都約定俗成用大寫來命名realm,比如“EXAMPLE.COM”
password:某個使用者的密碼,對應於kerberos中的master_key。password可以存在一個keytab檔案中。所以kerberos中需要使用密碼的場景都可以用一個keytab作為輸入。
credential:credential是“證明某個人確定是他自己/某一種行為的確可以發生”的憑據。在不同的使用場景下,credential的具體含義也略有不同:對於某個principal個體而言,他的credential就是他的password;在kerberos認證的環節中,credential就意味著各種各樣的ticket。
authenticator:驗證者,是伺服器用於驗證客戶機使用者主體的資訊。驗證者包含使用者的主體名稱、時間標記和其他資料。與票證不同,驗證者只能使用一次,通常在請求訪問服務時使用。
principal:認證的主體,,也說安全個體,簡單來說就是“使用者名稱”。
Ticket:一個記錄,客戶用它來向伺服器證明自己的身份,包括服務的主體名稱、使用者的主體名稱、使用者主機的ip地址、時間標記、會話金鑰、定義票證生命週期的時間戳。
keytab:keytab是包含principals和加密principal key的檔案。keytab檔案對於每個host是唯一的,因為key中包含hostname。keytab檔案用於不需要人工互動和儲存純文字密碼,實現到kerberos上驗證一個主機上的principal。因為伺服器上可以訪問keytab檔案即可以以principal的身份通過kerberos的認證,所以,keytab檔案應該被妥善儲存,應該只有少數的使用者可以訪問。
1.1.kerberos原理
為什麼要有Kerberos這樣一箇中央認證機制?
有A,B,C三個伺服器,分別提供不同的服務,user要訪問ABC都需要輸入使用者名稱密碼,但是ABC沒必要都存一份user的密碼,所以就衍生出一箇中央伺服器D來專門儲存使用者名稱密碼;如果user通過了D的認證,那就是合法的身份,就可以使用ABC任何一個服務,所以user需要告訴ABC它通過了D的認證。
如何證明這個事情,以及資訊在網路傳輸過程如何防止被截獲篡改而假冒等等,解決這些問題就靠kerberos。
Kerberos協議的工作過程:Client從KDC獲取TGT,Client利用獲取的TGT向KDC請求其他Service的Ticket(通過獲取的session進行訪問)。
這個部分簡單總結了kerberos協議的認證流程,如下:
② User向KDC中的AS請求身份驗證,AS為user和TGS生成一個session key:SK_TGS,併發送{TGT,SK_TGS} K_USER;
其中,{TGT,SK_TGS}K_USER表示使用user的密碼加密的packet,包含了TGT和使用者與TGS的session key;這個請求驗證的過程實際上是使用kinit來完成的,kinit將username傳給AS,AS查詢username的密碼,將TGT和SK_TGS使用使用者密碼加密後傳送給kinit,kinit要求使用者輸入密碼,解密後得到TGT和SK;其中,TGT使用TGS的密碼加密,資訊內容為{user,address,tgs_name,start_time,lisftime,SK_TGS} K_TGS
④ User向KDC中的TGS請求訪問某個Service的ST,傳送[ TGT,Authenticator];
其中,Authenticator用於驗證傳送該請求的user就是TGT中所宣告的user,內容為:{user,address,start_time,lifetime};Authenticator使用的TGS和user之間的session key加密的,防止TGT被盜。TGS先使用自己的密碼解開TGT獲得它與user之間的session key,然後使用session key解密Authenticator,驗證使用者和有效期;
⑤TGS判斷無誤後,為user和Service之間生成一個新的session key:SK_Service;然後傳送給user一個包:[{ SK_Service } SK_TGS, ST];
其中,ST是使用Service的密碼加密的,SK_Service使用TGS和user之間的session key加密的;ST的內容為:{user, address, start_time, lifetime, SK_Service } K_Service
⑥ User使用與TGS之間的會話金鑰解開包得到與Service之間的會話金鑰SK_Service,然後使用SK_Service生成一個Authenticator,向Service傳送[ ST,Authenticator ];
其中,此處的Authenticator是使用user和service之間的會話金鑰加密的,Service收到包後先使用自己的密碼解密ST,或者會話金鑰SK_Service,然後使用SK_Service解密Authenticator來驗證傳送請求的使用者就是票中所宣告的使用者。
Service向用戶傳送一個包以證明自己的身份,這個包使用SK_Service加密。
此後user與Service之間使用SK_Service進行通訊,且在TGT有效期內,user直接跳過第一步直接從第二步使用TGT想TGS證明自己的身份。
注意:userclient會等待service server傳送確認資訊,如果不是正確的service server,就無法解開ST,也就無法獲得會話金鑰,從而避免使用者使用錯誤的伺服器。上述流程圖也就是CAS的原理:使用者訪問某個應用程式,應用伺服器接受請求後檢查ST和TGT,如果都有則使用者正常進行訪問;如果沒有或者不對(步驟1),轉到CAS認證伺服器的登入頁面,通過安全認證後得到相應應用的TGT(步驟2-3)和該應用的ST(步驟4-5),再重定向到相關的應用伺服器(步驟6),如果在會話週期內再定向到別的應用(步驟7),將出示TGT和該應用的ST(如果沒有,就直接通過步驟4-5得到該應用的ST,步驟8)進行認證。
2.安裝部署
2.1. 安裝規劃
作業系統:Centos 7.4
操作使用者:root
軟體角色分佈如下:
角色 | 部署節點 |
KDC,AS,TGS | 192.168.1.150 |
Kerberos Agent | 192.168.1.[151-153] |
假設/etc/hosts檔案如下:
192.168.1.150 cdh0 192.168.1.151 cdh1 192.168.1.152 cdh2 192.168.1.153 cdh3
2.2.yum安裝kerberos
在192.168.1.150上安裝服務端:
yum -y install krb5-server openldap-clients
在192.168.1.[150-153]上安裝客戶端:
yum -y install krb5-devel krb5-workstation
在安裝完上述的軟體之後,會在KDC主機上生成配置檔案/etc/krb5.conf和/var/kerberos/krb5kdc/kdc.conf,在kerberos客戶端主機上生成配置檔案/etc/krb5.conf。
2.2.修改配置檔案
2.2.1. 配置krb5.conf
/etc/krb5.conf:包含Kerberos的配置。例如,KDC的位置,Kerberos的admin realms等。需要所有使用的Kerberos的機器上的配置檔案都同步。這裡僅列舉需要的基本配置。
請替換DOMAIN.COM為自定義域名:
[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = EXAMPLE.COM dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true rdns = false default_ccache_name = KEYRING:persistent:%{uid} [realms] EXAMPLE.COM = { kdc = cdh0 admin_server = cdh0 } [domain_realm] .example.com = EXAMPLE.COM example.com = EXAMPLE.COM
說明:
- [logging]:表示server端的日誌的列印位置
- [libdefaults]:每種連線的預設配置,需要注意以下幾個關鍵的小配置
- default_realm = EXAMPLE.COM預設的realm,必須跟要配置的realm的名稱一致。
- udp_preference_limit = 1禁止使用udp,可以防止一個Hadoop中的錯誤
- ticket_lifetime表明憑證生效的時限,一般為24小時
- renew_lifetime表明憑證最長可以被延期的時限,一般為一週。當憑證過期之後,對安全認證的服務的後續訪問則會失敗。
- [realms]:列舉使用的realm。
- kdc:代表kdc的位置,格式是:機器hostname或ip地址
- admin_server:代表admin的位置,格式是:機器hostname或ip地址
- default_domain:代表預設的域名
- [appdefaults]:可以設定一些針對特定應用的配置,覆蓋預設配置。
這裡需要分發krb5.conf至所有client
2.2.2. 配置kdc.conf
預設放在/var/kerberos/krb5dc/kdc.conf
[kdcdefaults] kdc_ports = 88 kdc_tcp_ports = 88 [realms] EXAMPLE.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 = 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 max_life = 25h max_renewable_life = 8d }
說明:
- EXAMPLE.COM:是設定的realms,名字隨意。Kerberos可以支援多個realms,會增加複雜度。一般為大寫。
- max_renewable_life = 8d涉及到是否能進行ticket的renew必須配置。
- master_key_type:和supported_enctyps預設使用aes256-cts。由於,JAVA使用aes256-cts驗證方式需要安裝額外的jar包,推薦不使用。
- acl_file:標註了admin的使用者許可權。檔案格式是Kerberos_principal permissions [target_principal] [restrictions]支援萬用字元等。
- admin_keytab:KDC進行校驗的keytab。
- supported_enctypes:支援的校驗方式。注意把aes256-cts去掉。
2.2.3. 配置kadm5.acl
修改服務端192.168.1.150上的配置檔案/var/kerberos/krb5kdc/kadm5.acl,以允許具備匹配條件的admin使用者進行遠端登入許可權:
*/[email protected] *
說明:
- 標註了admin的使用者許可權,需要使用者自己建立。檔案格式是Kerberos_principal permissions [target_principal] [restrictions]支援萬用字元等。最簡單的寫法是*/[email protected] *代表名稱匹配*/[email protected]都認為是admin,許可權是*代表全部許可權。
2.2.4.建立Kerberos資料庫
在192.168.1.150上對資料庫進行初始化,預設的資料庫路徑為/var/kerberos/krb5kdc,如果需要重建資料庫,將該目錄下的principal相關的檔案刪除即可,請牢記資料庫密碼。
kdb5_util create -r EXAMPLE.COM -s
說明:
- [-s]表示生成stash file,並在其中儲存master server key(krb5kdc)
- [-r]來指定一個realm name,當krb5.conf中定義了多個realm時使用
- 當Kerberos database建立好了之後,在/var/kerberos/中可以看到生成的principal相關檔案
2.2.5.啟動Kerberos服務
在192.168.1.150上執行:
# 啟動服務命令
systemctl start krb5kdc
systemctl start kadmin
# 加入開機啟動項
systemctl enable krb5kdc
systemctl enable kadmin
2.2.5.建立Kerberos管理員principal
# 需要設定兩次密碼 kadmin.local -q "addprinc root/admin"
pincipal的名字的第二部分是admin,那麼根據之前配置的kadm5.acl檔案,該principal就擁有administrative privileges,這個賬號將會被CDH用來生成其他使用者/服務的principal。
注意:需要先kinit保證已經有principal快取。
[root@master ~]# kinit root/admin Password for root/[email protected]: [root@master ~]# klist Ticket cache: KEYRING:persistent:0:0 Default principal: root/[email protected] Valid starting Expires Service principal 07/14/2020 11:51:17 07/15/2020 11:51:16 krbtgt/[email protected] renew until 07/21/2020 11:51:16
Kerberos客戶端支援兩種,一是使用principal +Password,二是使用principal +keytab。前者適合使用者進行互動式應用,例如hadoop fs -ls這種,後者適合服務,例如yarn的rm、nm等。principal + keytab就類似於ssh免密碼登入,登入時不需要密碼了。
3.用法
Kerberos常用命令:
操作 | 命令 |
啟動kdc服務 | systemctl start krb5kdc |
啟動kadmin服務 | systemctl start kadmin |
進入kadmin | kadmin.local / kadmin |
建立資料庫 | kdb5_util create -r EXAMPLE.COM -s |
修改當前密碼 | kpasswd |
測試keytab可用性 | kinit -k -t /home/xiaobai/xb.keytab [email protected] |
檢視keytab | klist -e -k -t /home/xiaobai/xb.keytab |
通過keytab檔案認證登入 | kinit -kt /home/xiaobai/xb.keytab [email protected] |
通過密碼認證登入 | kinit [email protected] / kint xiaobai |
清除快取 | kdestroy |
kadmin模式下常用命令:
操作 | 命令 |
檢視principal | listprincs |
生成隨機key的principal | addprinc -randkey root/[email protected] |
生成指定key的principal | addprinc -pw xxx root/[email protected] |
修改root/admin的密碼 | cpw -pw xxx root/admin |
新增/刪除principal | addprinc/delprinc root/admin |
直接生成到keytab |
ktadd -k /home/xiaobai/xb.keytab [email protected] / xst -norandkey -k /home/xiaobai/xb.keytab [email protected] 注意:在生成keytab檔案時需要加引數"-norandkey",否則導致直接使用kinit [email protected]初始化時提示密碼錯誤。 |
設定密碼策略(policy) | addpol -maxlife "90 days" -minlife "75 days" -minlength 8 -minclasses 3 -maxfailure 10 -history 10 user |
修改密碼策略 | modpol -maxlife "90 days" -minlife "75 days" -minlength 8 -minclasses 3 -maxfailure 10 user |
新增帶有密碼策略 | addprinc -policy user hello/[email protected] |
修改使用者的密碼策略 | modprinc -policy user1 hello/[email protected] |
刪除密碼策略 | delpol [-force] user |
備註:Kerberos進入admin管理模式需要使用root使用者。
總結
【參考資料】
https://www.jianshu.com/p/f84c3668272b
https://www.cnblogs.com/xiaodf/p/5968178.html
https://www.cnblogs.com/seaspring/articles/7210388.html
https://blog.csdn.net/u011026329/article/details/79167884Cloudera Manager CDH 整合 Kerberos
https://www.jianshu.com/p/fc2d2dbd510b
https://www.cnblogs.com/felixzh/p/9855029.html
https://www.cnblogs.com/chwilliam85/p/9679845.htmlKerberos 常用命令