1. 程式人生 > 實用技巧 >Kerberos基本原理、安裝部署及用法

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 常用命令