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组拥有所有权限

*/admin@KDC.EXAMPLE.COM*

登录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#scproot@kdc.example.com:/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/EXAMPLE.NET@KDC.EXAMPLE.COM

以上是配置Kerberos统一认证的过程,全部都使用RHEL5.4,强烈推荐大家看看那个对话,非常经典。

kerberos是由MIT开发的提供网络认证服务的系统,很早就听说过它的大名,但一直没有使用过它。它可用来为网络上的各种server提供认证服,使得口令不再是以明文方式在网络上传输,并且联接之间通讯是加密的;它和PKI认证的原理不一样,PKI使用公钥体制(不对称密码体)kerberos基于私钥体制(对称密码体制)

本篇文章不打算详细讲解kerberos的工作原理,而是侧重介绍在redhat8.0环境下如何使用kerberos自己提供的KtelnetdKrlogindKrshd来替代传统的telnetdrlogindrshd服务,有关kerberos工作的原理可以参考《Kerberos:ANAuthenticationServicesforComputerNetworks》。

安装环境:一台i386机器。

安装包:krb5-server-1.2.5-6krb5-workstation-1.2.5-6krb5-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服务器,然后再配KtelnetdKrlogind,Krsh服务器,最后就可以使用krb5-workstation提供的telnetrloginrsh来登录这些服务了。下面是安装步骤:

1、生成kerberos的本地数据库

kdb5_utilcreate-rEXAMPLE.COM-s

个命令用来生成kerberos的本地数据库,包括几个文件:principalprincipal.OKprincipal.kadm5principal.kadm5.lock.-r指定realm(kerberos术语),我们随便取一个叫EXAMPLE.COM.

2、生成账号

kerberosprincipal(kerberos术语)来表示realm下的一个帐户,表示为primary/instance@realm,举个例子就是username/9.181.92.90@EXAMPLE.COM,这里假设9.181.92.90是你机器的ip地址.

在数据库中加入管理员帐户:

/usr/kerberos/sbin/kadmin.local

kadmin.local:addprincadmin/admin@EXAMPLE.COM

在数据库中加入用户的帐号:

kadmin.local:addprincusername/9.181.92.90@EXAMPLE.COM

在数据库中加入KtelnetdKrlogindKrshd公用的帐号:

kadmin.local:addprinc-randkeyhost/9.181.92.90@EXAMPLE.COM

3、检查/var/kerberos/krb5kdc/kadm5.keytab是否有下列语句:

*/admin@EXAMPLE.COM*

若没有,那么就添上。

4、修改/etc/krb5.conf文件,修改所有的realmEXAMPLE.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服务器和KtelnetdKrlogindKrshd

/etc/init.d/krb5kdcrestart

chkconfigkloginon

chkconfigkshellon

chkconfigekloginon

chkconfigkrb5-telneton

/etc/init.d/xinetdrestart

7、制作本地缓存

username/9.181.92.90@EXAMPLE.COMcredentials(kerberos术语)取到本地做为cache,这样以后就可以不用重复输入password了。

kinitusername/9.181.92.90

如果顺利的话,在/tmp下面会生成文件krb5*;这步如果不通,那么就必须检查以上步骤是否有漏。

可以用klist命令来查看credential

8、导出用户密匙

exporthost/9.181.92.90@EXAMPLE.COMkey/etc/krb5.keytabKtelnetdKrlogindKrshd需要/etc/krb5.keytab来验证username/9.181.92.90的身份。

kadmin.local:ktadd-k/etc/krb5.keytabhost/9.181.92.90

9、修改~/.k5login文件

在其中加入username/9.181.92.90@EXAMPLE.COM,表示允许username/9.181.92.90@EXAMPLE.COM登录该帐户

catusername/9.181.92.90@EXAMPLE.COM>>~/.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