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
kadmin.local:addprinc-randkeyhost/server.example.com
kadmin.local:ktadd-k/etc/krb5.confhost/server.example.com
检查防火墙和selinux
重启跟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是否有下列语句:
*/[email protected]*
若没有,那么就添上。
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