共计 7096 个字符,预计需要花费 18 分钟才能阅读完成。
Kerberos 是一种基于可信性的第三方的网络认证系统。其他两方为用户和用户希望对其进行身份验证的服务。并不是所有的服务和应用程序可以使用 Kerberos,但是对于那些可以使用的,它使得网络环境更接近于一步到位,就是所谓的 Single Sign On (SSO)。
这一节介绍 Kerberos 服务器的安装和配置,和一些客户端配置的实例。
概览
如果你刚接触 Kerberos,有几个概念,最好在设置一个 Kerberos 服务器之前了解清楚。大多数概念将和你在其他环境中所熟悉的概念相关。
- Principal:任何服务器所提供的用户、计算机、服务都将被定义成 Principal。
- Instances:用于服务 principals 和特殊管理 Principal。
- Realms:Kerberos 安装提供的独特的域的控制,把它想象成你的主机和用户所属的主机或者组。官方约定这域需要大写。默认的,Ubuntu 将把 DNS 域名转换为大写当成这里的域。
- Key Distribution Center:(KDC)由三部分组成,一是 principal 数据库,认证服务器,和票据授予服务器。每个 Realm 至少要有一个。
- Ticket Granting Ticket:由认证服务器(AS)签发,Ticket Granting Ticket (TGT) 使用用户的密码加密,这个密码只有用户和 KDC 知道。
- Ticket Granting Server: (TGS) 根据请求签发服务的票据。
- Tickets:确认两个 Principal 的身份。一个主体是用户,另一个是由用户请求的服务。门票会建立一个加密密钥,用于在身份验证会话中的安全通信。
- Keytab Files:从 KDC 主数据库中提取的文件,并且包含的服务或主机的加密密钥。
总得来讲就是,一个域至少包含一个 KDC,最好能有更多的冗余,它包含一个 principal 数据库。当用户登录一个被 Kerberos 认证定义的工作站中,KDC 发布一个 TGT。如果用户提供的证书匹配,用户得到认证,之后就能从 TGS 请求被 kerberos 注册过的服务的票据,用户凭票据就可以认证并访问服务,而不需要再提供用户名和密码。
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/admin@EXAMPLE.COM with password. kadmin.local: addprinc steve/admin WARNING: no policy specified for steve/admin@EXAMPLE.COM; defaulting to no policy Enter password for principal "steve/admin@EXAMPLE.COM": Re-enter password for principal "steve/admin@EXAMPLE.COM": Principal "steve/admin@EXAMPLE.COM" created. kadmin.local: quit
在上面的例子中,steve 是这个 Principal,/admin 是一个 Instance,@EXAMPLE.COM 代表这个 realm(域)。“日常”Principal,即用户 Principal,将会是这样:steve@EXAMPLE.COM, 并且只有普通用户的权限。
tips:把这里的 EXAMPLE.COM 和 steve 替换成你的 realm 和管理员用户名。
-
接下来,这个新的管理员用户需要有合适的访问控制列表(ACL)权限。它被配置在 /etc/krb5kdc/kadm5.acl 文件中:
steve/admin@EXAMPLE.COM
这赋予 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/admin@EXAMPLE.COM's Password:
输入密码后,使用 klist 命令查看 TGT 的信息:
klist Credentials cache: FILE:/tmp/krb5cc_1000 Principal: steve/admin@EXAMPLE.COM Issued Expires Principal Jul 13 17:53:34 Jul 14 03:53:34 krbtgt/EXAMPLE.COM@EXAMPLE.COM
其中的缓存文件 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 域已经为认证客户端准备好。
Secondary KDC
一旦你在你的网络中有了一个 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/admin@EXAMPLE.COM 实体的密码。
-
提取 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/kdc01.example.com@EXAMPLE.COM host/kdc02.example.com@EXAMPLE.COM
-
在 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 吧。
Kerberos Linux Client:
本节主要包含配置一个 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 steve@EXAMPLE.COM
Password for steve@EXAMPLE.COM:
当票据被授权,你可以用 klist 查看票据的详情:
klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: steve@EXAMPLE.COM
Valid starting Expires Service principal
07/24/08 05:18:56 07/24/08 15:18:56 krbtgt/EXAMPLE.COM@EXAMPLE.COM
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
现在你应该在成功登录认证后获得了一个票据。
资源
- 查看更多 Kerberos 的 MIT 版本信息,请访问 MIT Kerberos 官网。
- Ubuntu Wiki Kerberos 有更多的细节。
- O’Reilly 的 Kerberos: The Definitive Guide 在配置 Kerberos 方面是一个非常好的参考。
- 另外,当你有 Kerberos 的相关问题时,欢迎到 Freenode 的 #ubuntu-server 和#kerberos IRC 频道查看或提问。
更多 Ubuntu 相关信息见 Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-09/134949.htm