AndrewYuan 2016-09-05
Kerberos是一种基于可信性的第三方的网络认证系统。其他两方为用户和用户希望对其进行身份验证的服务。并不是所有的服务和应用程序可以使用Kerberos,但是对于那些可以使用的,它使得网络环境更接近于一步到位,就是所谓的Single Sign On (SSO)。
这一节介绍Kerberos服务器的安装和配置,和一些客户端配置的实例。
如果你刚接触Kerberos,有几个概念,最好在设置一个Kerberos服务器之前了解清楚。大多数概念将和你在其他环境中所熟悉的概念相关。
总得来讲就是,一个域至少包含一个KDC,最好能有更多的冗余,它包含一个principal数据库。当用户登录一个被Kerberos认证定义的工作站中,KDC发布一个TGT。如果用户提供的证书匹配,用户得到认证,之后就能从TGS请求被kerberos注册过的服务的票据,用户凭票据就可以认证并访问服务,而不需要再提供用户名和密码。
这里,我们将提供一个包含以下属性MIT Kerberos域(根据自己的需要修改它们):
Realm: EXAMPLE.COM Primary KDC: kdc01.example.com (192.168.0.1) Secondary KDC: kdc02.example.com (192.168.0.2) User principal: steve Admin principal: steve/admin
tips:强烈建议你的网络认证用户的uid和你其他本地用户的uid不在同一个范围(比如:从5000开头)。
在安装Kerberos服务之前,你需要为你的域名配置合理的DNS。由于按照约定Kerberos的域与域名相匹配,本节使用EXAMPLE.COM这个域定义DNS。
另外,Kerberos是一个时间敏感的协议。因此,如果客户机和服务器之间的本地系统时间超过五分钟(默认情况下),工作站将无法进行身份验证。要纠正这个问题,所有的主机都应该把自己的时间与统一一个(NTP)服务器同步。细节设置NTP参阅使用NTP进行时间同步。
创造Kerberos领域的第一步是安装krb5-KDC和rb5-admin-server软件包。从终端输入:
sudo apt-get install krb5-kdc krb5-admin-server
在安装的最后你将被要求为realm提供Kerberos的主机名和管理服务器名,不一定相同。
tips:默认情况下,realm是从KDC域名创建。
下一步,使用kdb5_newrealm工具创建新域。
sudo krb5_newrealm
安装过程中所问到的问题用于配置/etc/krb5.conf文件。如果你需要调整kdc的设置,你只需要简单的编辑这个文件即可并重新i动krb5-kdc守护进程。如果你需要从头到尾重新配置,比如重命名realm的名字,你可以输入:
sudo dpkg-reconfigure krb5-kdc
一旦KDC正常运行,则需要一个管理员用户–the admin principal。建议使用和平时经常用的用户名有所区别。在终端提示符下输入kadmin.local:
sudo kadmin.local Authenticating as principal root/[email protected] with password. kadmin.local: addprinc steve/admin WARNING: no policy specified for steve/[email protected]; defaulting to no policy Enter password for principal "steve/[email protected]": Re-enter password for principal "steve/[email protected]": Principal "steve/[email protected]" created. kadmin.local: quit
在上面的例子中,steve是这个Principal,/admin是一个Instance,@EXAMPLE.COM代表这个realm(域)。“日常”Principal,即用户Principal,将会是这样:[email protected],并且只有普通用户的权限。
tips:把这里的EXAMPLE.COM和steve替换成你的realm和管理员用户名。
接下来,这个新的管理员用户需要有合适的访问控制列表(ACL)权限。它被配置在/etc/krb5kdc/kadm5.acl文件中:
steve/[email protected]
这赋予steve/admin对域中所有principals进行任何操作的能力。你可以对principals配置更加严格的权限。这是很方便的,如果你需要一个admin principal在kerberos客户端中具有较低的权限。更多细节请查看kadm5.acl文件。
现在重ikrb5-admin-server 使新的ACL生效:
sudo service krb5-admin-server restart
现在这个新的user principal 可以通过kinit命令进行测试:
kinit steve/admin steve/[email protected]'s Password:
输入密码后,使用klist命令查看TGT的信息:
klist Credentials cache: FILE:/tmp/krb5cc_1000 Principal: steve/[email protected] Issued Expires Principal Jul 13 17:53:34 Jul 14 03:53:34 krbtgt/[email protected]
其中的缓存文件krb5cc_1000由krb5cc_ 前缀和用户的id(uid)组成,这里是1000.你应该在/etc/host文件中添加一个入口,这样客户端才能访问到KDC。比如:
192.168.0.1 kdc01.example.com kdc01
把 192.168.0.1 替换成你的KDC的ip地址。这经常发生在你的Kerberos域包含被路由分割的不同的网络。
使客户端自动定位KDC的Realm的最佳方式,是实用DNS SRV 记录。添加下面的内容到 /etc/named/db.example.com:
_kerberos._udp.EXAMPLE.COM. IN SRV 1 0 88 kdc01.example.com. _kerberos._tcp.EXAMPLE.COM. IN SRV 1 0 88 kdc01.example.com. _kerberos._udp.EXAMPLE.COM. IN SRV 10 0 88 kdc02.example.com. _kerberos._tcp.EXAMPLE.COM. IN SRV 10 0 88 kdc02.example.com. _kerberos-adm._tcp.EXAMPLE.COM. IN SRV 1 0 749 kdc01.example.com. _kpasswd._udp.EXAMPLE.COM. IN SRV 1 0 464 kdc01.example.com.
tips:用你的主机名,主KDC和从KDC替换掉EXAMPLE.COM, kdc01, 和 kdc02
参考 域名解析服务 (DNS) 获得设置DNS相关细节.
现在,你的新Kerberos域已经为认证客户端准备好。
一旦你在你的网络中有了一个KDC,拥有一个Secondary KDC是一个好的实践,以防主KDC不可用。如果你的Kerberos客户端在不同的网络中(可能被使用NAT的路由分隔开),在每一个网络中配置secondary KDC是一个明智的选择。
首先,安装包,当被询问Kerberos和管理服务器名时填入主KDC的名字:
sudo apt-get install krb5-kdc krb5-admin-server
一旦包被安装后,创建Secondary KDC的主机实体。在命令提示符下输入:
kadmin -q "addprinc -randkey host/kdc02.example.com"
tips:随后,使用任何kadmin的命令是,你将被提示输入username/[email protected]实体的密码。
提取keytab文件:
kadmin -q "ktadd -norandkey -k keytab.kdc02 host/kdc02.example.com"
现在在你当前目录应该有一个keytab.kdc02的文件,把他移动到/etc/krb5.keytab:
sudo mv keytab.kdc02 /etc/krb5.keytab
tips:如果keytab.kdc02的路径不同,看情况调整。
你还可以在Keytab文件中列出这些实体,在解决故障时很有用,使用klist命令:
sudo klist -k /etc/krb5.keytab
-k选项表示这是一个keytab文件。
接下来在每个KDC节点上需要有kpropd.acl文件来列出所有域中的KDC,在主KDC和secondary KDC,创建/etc/krb5kdc/kpropd.acl:
host/[email protected] host/[email protected]
在Secondary KDC上创建一个空的数据库:
sudo kdb5_util -s create
现在,开启kpropd守护进程,用来监听kprop功能的连接。kprop是用来传输转储文件的。
sudo kpropd -S
在主KDC的终端创建实体数据库的转储文件:
sudo kdb5_util dump /var/lib/krb5kdc/dump
提取主KDC的keytab文件并拷贝到/etc/krb5.keytab:
kadmin -q "ktadd -k keytab.kdc01 host/kdc01.example.com" sudo mv keytab.kdc01 /etc/krb5.keytab
tips:保证在提取keytab之前有kdc01.example.com的主机。
使用kprop功能向Secondary KDC推送数据库:
sudo kprop -r EXAMPLE.COM -f /var/lib/krb5kdc/dump kdc02.example.com
tips:如果传输成功的话,应该会有一个成功的信息。如果是一个错误信息,请在secondary KDC上的/var/log/syslog中查看更多信息。
你可能需要创建一个cron任务,来周期性地跟新Secondary KDC数据库。比如,下面的命令将每个小时推送一次数据库(请注意,长行已被拆分,以适应本文档的格式):
# m h dom mon dow command 0 * * * * /usr/sbin/kdb5_util dump /var/lib/krb5kdc/dump && /usr/sbin/kprop -r EXAMPLE.COM -f /var/lib/krb5kdc/dump kdc02.example.com
回到Secondary KDC,创建一个stash用来保存Kerberos master key:
sudo kdb5_util stash
最后,在 Secondary KDC开启krb5-kdc守护进程:
sudo service krb5-kdc start
现在Secondary KDC应该已经可以在这个Realm签发票据了。你可以在Primary KDC上停止krb5-kdc进程,并使用kinit请求票据来测试。如果一切运行正常的话,你可以从Secondary KDC请求到票据。否则,查看下Secondary KDC上的/var/log/syslog and /var/log/auth.log吧。
本节主要包含配置一个Linux系统成为Kerberos客户端。一旦用户成功登陆系统,他将有权限访问任何被Kerberos认证过后的服务。
为了能够在Kerberos Realm中被认证,需要krb5-user和libpam-krb5两个包。其他的几个包不是必要的但是可以让生态更加友好。在命令提示符下输入以下命令来安装包:
sudo apt-get install krb5-user libpam-krb5 libpam-ccreds auth-client-config
auth-client-config包使得多个来源认证的PAM配置更简单;libpam-ccreds包将会保存你登录的认证证书,以防KDC挂掉。这个包在笔记本使用公司网络进行Kerberos认证,却需要被网络接受时,也很有用。
配置客户端,在终端输入:
sudo dpkg-reconfigure krb5-config
你将被提示输入Kerberos Realm的名字。另外,如果你没有用Kerberos SRV记录设置DNS,菜单会提示你输入KDC和Realm Administration服务器的主机名。
dpkg-reconfigure为你的Realm在/etc/krb5.conf文件中填入了一些内容。这些内容应该与下列内容类似:
[libdefaults] default_realm = EXAMPLE.COM ... [realms] EXAMPLE.COM = { kdc = 192.168.0.1 admin_server = 192.168.0.1 }
tips:如果你设置的网络认证用户都和“安装”的建议一样从500开始,然后,你就可以告诉PAM只尝试验证UID>5000的Kerberos用户:
# Kerberos should only be applied to ldap/kerberos users, not local ones. for i in common-auth common-session common-account common-password; do sudo sed -i -r \ -e 's/pam_krb5.so minimum_uid=1000/pam_krb5.so minimum_uid=5000/' \ /etc/pam.d/$i done
这将避免在一个本地用户修改密码时被要求输入(不存在的)Kerberos密码。
你可以用kinit功能请求一个票据来测试你的配置,比如:
kinit [email protected] Password for [email protected]:
当票据被授权,你可以用klist查看票据的详情:
klist Ticket cache: FILE:/tmp/krb5cc_1000 Default principal: [email protected] Valid starting Expires Service principal 07/24/08 05:18:56 07/24/08 15:18:56 krbtgt/[email protected] renew until 07/25/08 05:18:57 Kerberos 4 ticket cache: /tmp/tkt1000 klist: You have no tickets cached
接着,使用auth-client-config来配置libpam-krb5模块,来在登录时请求票据:
sudo auth-client-config -a -p kerberos_example
现在你应该在成功登录认证后获得了一个票据。