Kerberos 服務(kerberos官網)是一種通過網絡提供安全驗證處理的客戶機/服務器體系結構。通過驗證,可保證網絡事務的發送者和接收者的身份真實。該服務還可以檢驗來回傳遞的數據的有效性(完整性),並在傳輸過程中對數據進行加密(保密性)。使用 Kerberos 服務,可以安全登錄到其他計算機、執行命令、交換數據以及傳輸文件。此外,該服務還提供授權服務,這樣,管理員便可限制對服務和計算機的訪問。而且,作為 Kerberos 用戶,您還可以控制其他用戶對您帳戶的訪問。
Kerberos原理
Kerberos 服務是單點登錄系統,這意味着您對於每個會話只需向服務進行一次自我驗證,即可自動保護該會話過程中所有后續事務的安全。服務對您進行驗證后,即無需在每次使用基於 Kerberos 的服務時進行驗證。因此,無需在每次使用這些服務時都在網絡上發送口令(增強了安全性)。MIT寫了一段故事型的對話,比較生動得表述了Kerberos協議的工作原理:
Athena和歐里庇得斯關於地獄之門守護者的對話。簡而言之,kerbores V5的工作原理如下:
Kerbores中有三種角色:KDC
:負責分發密鑰的密鑰分配中心Client
:需要使用kerbores服務的客戶端Service
:提供具體服務的服務端
其中,Client需要和KDC和Service都進行通信。協議授權流程分兩個部分:
(1) 獲取原始票據
首先,Client向KDC發送自己的身份信息,KDC從授予票據服務(Ticket Granting Service)得到可用的票據(ticket-granting ticket),並用協議開始前KDC與Client之間的密鑰將票據加密回復給client,client收到KDC回復的加密票據后利用與client先前協議的密鑰將票據解密,從而獲得票據,此步驟主要是允許client進行Kerberos的驗證,是進行訪問服務的先決條件。
(2) 獲取服務票據以及訪問服務
client利用之前獲得的票據向KDC請求服務票據,從而通過服務的身份驗證。獲取服務票據以及訪問服務總共有如下四步:
①. client將之前獲得的票據和要請求的服務信息發送給KDC,KDC中的授予票據服務將client和service之間生成一個會話密鑰(Session Key)用於服務器與client的身份驗證。然后KDC將這個會話密鑰和用戶名,用戶地址(IP),服務名,有效期,時間戳一起包裝成一個票據(這張票據用於service對client的身份驗證)通過client轉發給service。
②. 為了讓票據對client保密,所以KDC用協議開始之前KDC與服務端之間的密鑰將票據加密后再發給client,同時為了讓client與service之間共享那個會話密鑰,KDC用client與它之間的密鑰將會話密鑰加密返回給client
③. 為了完成票據的傳遞,client將剛才收到的票據轉發到service,由於client不知道KDC與service的密鑰,所以它無法修改票據的信息,同時client將收到的會話密鑰解壓出來,然后將自己的用戶名,用戶地址(IP)打包成驗證包用會話密鑰加密也發給service
④. Service收到票據后利用它與KDC之間的密鑰將票據中的信息解密出來,從而獲得會話密鑰和用戶名,用戶地址(IP),服務名,有效期。然后再用會話密鑰將驗證包解密從而獲得用戶名,用戶地址(IP)將其與之前票據中解密出來的用戶名,用戶地址(IP)做比較從而驗證client的身份,如果service有返回結果,將其返回給client
安裝Kerberos
1 安裝package
在CentOS中可以使用yum來安裝
yum install -y krb5-libs krb5-server krb5-client
或者使用源代碼構建:
wget http://web.mit.edu/kerberos/dist/krb5/1.12/krb5-1.12.2-signed.tar tar xvf krb5-1.12.2-signed.tar && tar xvzf krb5-1.12.2.tar.gz cd krb5-1.12.2/src ./configure yum install -y byacc make -j && make install
2 配置DNS
使用dnsmasq配置一個簡單的本地DNS,保證需要解析的主機名在/etc/hosts中。
yum install -y dnsmasq vim /etc/dnsmasq.conf domain=debugo.com local=/debugo.com/ expand-hosts no-resolv cache-size=500 log-queries service dnsmasq start Starting dnsmasq: [ OK ]
設置客戶端DNS Server
修改網卡配置文件或/etc/resolv.conf
DNS1=192.168.1.221
# 檢查域名解析
nslookup pure01.debugo.com Server: 192.168.1.221 Address: 192.168.1.221#53 Name: pure01.debugo.com Address: 192.168.1.221
這樣DNS已經OK。
3 配置/etc/krb5.conf,使其指定到正確的realm中
[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = DEBUGO.COM dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true [realms] DEBUGO.COM = { kdc = kerberos.debugo.com admin_server = kerberos.debugo.com } [domain_realm] .debugo.com = DEBUGO.COM debugo.com = DEBUGO.COM
4 創建KDC配置文件
vim /var/kerberos/krb5kdc/kdc.conf [kdcdefaults] kdc_ports = 88 kdc_tcp_ports = 88 [realms] DEBUGO.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 }
5 配置acl文件
vim /var/kerberos/krb5kdc/kadm5.acl */admin@CTBJ.COM *
6 使用kdb5_util創建kdc數據庫
kdb5_util create -r DEBUGO.COM -s Loading random data Initializing database '/usr/local/var/krb5kdc/principal' for realm 'DEBUGO.COM', master key name 'K/M@DEBUGO.COM' You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter KDC database master key: Re-enter KDC database master key to verify: kadmin.local Authenticating as principal root/admin@DEBUGO.COM with password.
首先有介紹一個術語(參考kerberos 認證配置):
Principal:在 Kerberos 中,Principal 是參加認證的基本實體。一般來說有兩種,一種用來表示 Kerberos 數據庫中的用戶,另一種用來代表某一特定主機,也就是說 Principal是用來表示客戶端和服務端身份的實體, Principal 的格式采用 ASN.1 標准,即 Abstract Syntax Notation One,來准確定義),Principal 是由三個部分組成:名字(name),實例(instance),REALM(域)。比如一個標准的 Kerberos 的用戶是:name/instance@REALM 。
Name:第一部分。在代表客戶方的情況,它是一個用戶名;在代表主機的情況,它是寫成 host。
Instance:第二部分。對 name 的進一步描述,例如 name 所在的主機名或 name 的類型等,可省略。它與第一部分之間用‘ / ’分隔,但是作為主機的描述時寫成 host/Instance。
Realm:第三部分。是 Kerberos 在管理上的划分,在 KDC 中所負責的一個域數據庫稱作為 Realm。這個數據庫中存放有該網絡范圍內的所有 Principal 和它們的密鑰,數據庫的內容被 Kerberos 的認證服務器 AS 和票據授權服務器 TGS 所使用。Realm 通常是永遠是大寫的字符,並且在大多數 Kerberos 系統的配置中,一般 Realm 和該網絡環境的 DNS 域是一致的。與第二部分之間用‘@’分隔,缺省為本地的 Realm。
# 添加新的管理員用戶,kadmin和kadmin.local是KDB的管理接口。
kadmin.local: addprinc debugo/admin WARNING: no policy specified for debugo/admin@CTBJ.COM; defaulting to no policy Enter password for principal "debugo/admin@CTBJ.COM": Re-enter password for principal "debugo/admin@CTBJ.COM": Principal "debugo/admin@CTBJ.COM" created. # 列出所有的principle kadmin.local: listprincs K/M@CTBJ.COM debugo/admin@CTBJ.COM kadmin/admin@CTBJ.COM kadmin/cdh_manager@CTBJ.COM kadmin/changepw@CTBJ.COM krbtgt/CTBJ.COM@CTBJ.COM # 查看principle:getprinc debugo/admin@CTBJ.COM # 刪除principle:delprinc debugo/admin@CTBJ.COM # 修改principle密碼:cpw,change_passwd
7 啟動服務
service krb5kdc restart Starting Kerberos 5 KDC: [ OK ] service kadmin restart Starting Kerberos 5 Admin Server: [ OK ]
8 驗證principle
在其他主機上需要有相同的krb5.conf配置。
kinit debugo/hdp01.ctbj.com@CTBJ.COM Password for debugo/hdp01.ctbj.com@CTBJ.COM: klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: debugo/hdp01.ctbj.com@CTBJ.COM Valid starting Expires Service principalna jiu /08/14 11:58:00 09/09/14 11:58:00 krbtgt/CTBJ.COM@CTBJ.COM renew until 09/08/14 11:58:00 service krb5kdc start Starting Kerberos 5 KDC: [ OK ]
在Redhat下輸入setup命令,進入Authentication configuration 設置,然后use kerbores
參考
http://docs.oracle.com/cd/E24847_01/html/819-7061/intro-25.html#scrolltoc
http://huobumingbai.blog.51cto.com/1196746/549098
http://web.mit.edu/daveg/SIPB/Info/Links/project/kerberos/krb5-current/doc/krb_admins/conf_files/kdc_conf.html
http://wgzhao.com/2005/12/02/kerberos-authentication-configuration/