Kerberos統一認證明驗配置
0.準備工作
Kerberos是一種認證協定,以地獄守護者(三個頭的狗)的名字命名,這個協定堪稱完美,原理相當複雜,見http://blog.chinaunix.net/u/4940/showart_2374802.html,現在發展倒到第5版,其演變過程被MIT描述程Athena和Euripides的一段對話,http://biz.chinabyte.com/189/2038189.shtml,有興趣可以看看,比較長,但是對了解Kerberos很有好處。
Kerberos的實驗同樣需要3台機器,分别扮演不同的角色:
a.192.168.0.48kdc.example.comKerberos伺服器和NIS伺服器
b.192.168.0.49server.example.com應用伺服器,如ssh,ftp,krb5-telnet等
c.192.168.0.50client.example.com客戶機
.幾台機器需要時間同步,是以最好是建一個ntp的伺服器,時間相差5分鐘以上,所有實驗都做不出來。建NTP也就2分鐘的事情。
1.配置NIS
概念是将kdc.example.com配置成NIS和Kerberos的伺服器,NIS提供使用者資訊(UserInfomation),Kerberos提供認證資訊(Authentication),下面從NIS開始:
安裝ypserv
#yum-yinstallypserv
配置ypserv,增加NIS域,NISDOMAIN=ahau
#vim/etc/sysconfig/network
#nisdomainnameahau
固定ypserv的端口,在vim/etc/sysconfig/network添加參數YPSERV_ARGS=808
生成NIS庫
#/usr/yp/ypinit-m
增加幾個使用者,但是不要密碼,UID用大一點,防止跟客戶機重複,更新NIS庫
#useradd-u6001user1
#make-C/var/yp
要注意NIS伺服器的hosts配置,這個配置會傳到客戶機,如果有錯,排錯是很麻煩的,我就因為這個問題花了兩個小時排錯
2.配置KDC
很多包系統預設安裝過了,這裡隻要安裝krb5-server
#yum-yinstallkrb5-server
修改krb5的配置檔案/etc/krb5.conf
[logging]段是日志,可以不動
[libdefaults]是預設配置,其中default_realm指出了預設的realm,即認證的範圍,一般是全大寫字母
default_realm=KDC.EXAMPLE.COM
[realms]段是範圍的配置,參數最好寫IP位址,友善以後更改
[realms]
KDC.EXAMPLE.COM={
kdc=192.168.0.48:88
admin_server=192.168.0.48:749
}
[domain_realm]域和realm的關系,即哪些機器可以在哪個realm裡認證
.example.com=KDC.EXAMPLE.COM#所有example.com域的使用者和機器都可以在KDC.EXAMPLE.COM上認證
[appdefaults]段指出pam的一些參數,如票的存活時間等等。
加一條validate=true,目的是讓登入程式确認KDC的合法性
初始化KDC的資料庫,-s表示通過kadmin登入本機不需要密碼
#kdb5_utilcreate-rKDC.EXAMPLE.COM-s
修改kdc.conf,指定加密算法
#vim/var/kerberos/krb5kdc/kdc.conf
[realms]段改成KDC.EXAMPLE.COM,取消master_key_type的注釋,Kerverosv5采用3DES的算法,比v4的DES要安全一些
修改/var/kerberos/krb5kdc/kadm5.acl,此檔案為kadmin的通路控制檔案
文法是
principalpermissions[target-principal]
改成如下形式,即所有admin組擁有所有權限
登入KDC,添加管理者和一般使用者的principal
#kadmin.local
kadmin.local:addprincroot/admin
kadmin.local:addprincuser1
ps.addprinc會要求輸入密碼,root/admin的密碼一定不能洩漏,否則就完了,user1的密碼就是指登入密碼
檢視,删除已有的principal的指令:
kadmin.local:listprincs
kadmin.local:getprincuser1
kadmin.local:delprincuser1
導出kadmin服務的keytab檔案,退出kadmin
kadmin.local:ktadd-k/var/kerberos/krb5kdc/kadm5.keytabkadmin/admin
kadmin.local:ktadd-k/var/kerberos/krb5kdc/kadm5.keytabkadmin/changepw
ps.有的資料上說kadmin會自動生成keytab檔案,我試了一下不行,可能版本問題吧
修正前面的幾個檔案的SELINUX設定
#restorecon-R-V/var/kerberos/krb5kdc/
#restorecon-R-V/var/log/
#restorecon-R-V/etc/krb5.conf
檢視keytab檔案内容
#ktutil
ktutil:rkt/var/kerberos/krb5kdc/kadm5.keytab
ktutil:list
啟動服務
#servicekrb5kdcrestart
#servicekadminrestart
登入到server.example.com上,複制kdc.example.com的/etc/krb5.conf檔案過來,省得再配了
server#[email protected]:/etc/krb5.conf/etc/krb5.conf
server#restorecon-R-v/etc/krb5.conf
運作kadmin,輸入密碼後即可遠端登入到KDC上,可以對其進行管理
3.配置伺服器
我們希望把server.example.com做成應用伺服器,這裡以sshd、gssftp、krb5-telnet為例。
先配置這幾個服務,sshd預設就能用,gssftp和krb5-telnet都是xinetd管理的服務,修改/etc/xinetd.d/的相關配置檔案就行,如果要telnet加密,同時打開ekrb5-telnet服務就行,建議打開。
配置伺服器為NIS的用戶端,并且使用Kerberos認證
server#authconfig-tui,修改相應的NIS資訊就行
在KDC增加服務的principal,并且導出生成server自己的鑰匙
server#kadmin
kadmin:addprinc-randkeyhost/server.example.com#krb5-telnet和ssh的principal都是host
kadmin:addprinc-randkeyftp/server.example.com#gssftp的principal是ftp
導出到本地
kadmin:ktadd-k/etc/krb5.keytabhost/server.example.com
kadmin:ktadd-k/etc/krb5.keytabftp/server.example.com
檢查防火牆和selinux
因為要做雙向驗證,是以我們在kdc.example.com上也把sshd服務注冊一下,登入到kdc.example.com
kadmin.local:addprinc-randkeyhost/server.example.com
kadmin.local:ktadd-k/etc/krb5.confhost/server.example.com
重新開機跟kdc相關的服務
4.客戶機測試
先将客戶機加入NIS域,并使用Kerberos驗證
然後以user1登入系統,密碼為KDC中addprinc時輸入的對應密碼,注意這裡不能用root直接su到user1,因為root是不驗證密碼的,這樣會導緻得不到TGT票,正常登入的話說明驗證沒有問題
此時該使用者已經得到了TGT的授權票,可以用klist檢視使用者得到的票的資訊
client#klist
使用ssh登入server.example.com,不需要密碼就能登入
使用ftp登入server.example.com,不需要密碼也能登入
使用telnet指令telnet-xserver.example.com-kKDC.EXAMPLE.COM登入server.example.com,同樣不需要密碼就能登入
再此用klist檢視,該使用者已經得到了多張用于通路服務的票,預設的有效時間是10個小時。
ps.ssh登入到server.example.com以後,再ssh回client.example.com是需要密碼的,如果要取消密碼,可以修改client.example.com上的ssh配置,增加GSSAPIDelegateCredentialsyes的參數,讓ssh能夠傳遞認證資訊
5.KDC安全配置
增加preauth功能
修改/var/kerberos/krb5kdc/kdc.conf,增加參數
default_principal_flags=+preauth
重新開機krb5kdc,kadmin服務
6.KDC跨域信任
一台KDC可以實作跨域的驗證,實作方式隻要在KDC中加入對其他域TGT的信任就可以了,如:
kadmin.local:kdctgt/[email protected]
以上是配置Kerberos統一認證的過程,全部都使用RHEL5.4,強烈推薦大家看看那個對話,非常經典。
kerberos是由MIT開發的提供網絡認證服務的系統,很早就聽說過它的大名,但一直沒有使用過它。它可用來為網絡上的各種server提供認證服務,使得密碼不再是以明文方式在網絡上傳輸,并且聯接之間通訊是加密的;它和PKI認證的原理不一樣,PKI使用公鑰體制(不對稱密碼體制),kerberos基于私鑰體制(對稱密碼體制)。
本篇文章不打算詳細講解kerberos的工作原理,而是側重介紹在redhat8.0環境下如何使用kerberos自己提供的Ktelnetd,Krlogind,Krshd來替代傳統的telnetd,rlogind,rshd服務,有關kerberos工作的原理可以參考《Kerberos:ANAuthenticationServicesforComputerNetworks》。
安裝環境:一台i386機器。
安裝包:krb5-server-1.2.5-6,krb5-workstation-1.2.5-6,krb5-libs-1.2.5-6
rpm-ivhkrb5-libs-1.2.5-6.i386.rpm
rpm-ivhkrb5-server-1.2.5-6.i386.rpm
rpm-ivhkrb5-workstation-1.2.5-6.i386.rpm
上述要求滿足後,我們就可以先配KDC伺服器,然後再配Ktelnetd,Krlogind,Krsh伺服器,最後就可以使用krb5-workstation提供的telnet,rlogin,rsh來登入這些服務了。下面是安裝步驟:
1、生成kerberos的本地資料庫
kdb5_utilcreate-rEXAMPLE.COM-s
這個指令用來生成kerberos的本地資料庫,包括幾個檔案:principal,principal.OK,principal.kadm5,principal.kadm5.lock.-r指定realm(kerberos術語),我們随便取一個叫EXAMPLE.COM.
2、生成賬号
kerberos用principal(kerberos術語)來表示realm下的一個帳戶,表示為primary/instance@realm,舉個例子就是username/[email protected],這裡假設9.181.92.90是你機器的ip位址.
在資料庫中加入管理者帳戶:
/usr/kerberos/sbin/kadmin.local
kadmin.local:addprincadmin/[email protected]
在資料庫中加入使用者的帳号:
kadmin.local:addprincusername/[email protected]
在資料庫中加入Ktelnetd,Krlogind,Krshd公用的帳号:
kadmin.local:addprinc-randkeyhost/[email protected]
3、檢查/var/kerberos/krb5kdc/kadm5.keytab是否有下列語句:
若沒有,那麼就添上。
4、修改/etc/krb5.conf檔案,修改所有的realm為EXAMPLE.COM,并且加入下列句子
kdc=9.181.92.90:88
admin_server=9.181.92.90:749
5、在/etc/krb.conf中加入下列語句:
EXAMPLE.COM
EXAMPLE.COM9.181.92.90:88
EXAMPLE.COM9.181.92.90:749adminserver
6、啟動kdc伺服器和Ktelnetd,Krlogind,Krshd
/etc/init.d/krb5kdcrestart
chkconfigkloginon
chkconfigkshellon
chkconfigekloginon
chkconfigkrb5-telneton
/etc/init.d/xinetdrestart
7、制作本地緩存
将username/[email protected]的credentials(kerberos術語)取到本地做為cache,這樣以後就可以不用重複輸入password了。
kinitusername/9.181.92.90
如果順利的話,在/tmp下面會生成檔案krb5*;這步如果不通,那麼就必須檢查以上步驟是否有漏。
可以用klist指令來檢視credential。
8、導出使用者密匙
exporthost/[email protected]的key到/etc/krb5.keytab,Ktelnetd、Krlogind和Krshd需要/etc/krb5.keytab來驗證username/9.181.92.90的身份。
kadmin.local:ktadd-k/etc/krb5.keytabhost/9.181.92.90
9、修改~/.k5login檔案
在其中加入username/[email protected],表示允許username/[email protected]登入該帳戶
catusername/[email protected]>>~/.k5login
10、測試kerberos用戶端
krsh9.181.92.90-kEXAMPLE.COMls
krlogin9.181.92.90-kEXAMPLE.COM
rlogin9.181.92.90-kEXAMPLE.COM
rsh9.181.92.90-kEXAMPLE.COM
telnet-x9.181.92.90-kEXAMPLE.COM