Ubuntu 14.04-Kerberos安装和配置

AndrewYuan 2016-09-05

Kerberos是一种基于可信性的第三方的网络认证系统。其他两方为用户和用户希望对其进行身份验证的服务。并不是所有的服务和应用程序可以使用Kerberos,但是对于那些可以使用的,它使得网络环境更接近于一步到位,就是所谓的Single Sign On (SSO)。

这一节介绍Kerberos服务器的安装和配置,和一些客户端配置的实例。

概览

如果你刚接触Kerberos,有几个概念,最好在设置一个Kerberos服务器之前了解清楚。大多数概念将和你在其他环境中所熟悉的概念相关。

  1. Principal:任何服务器所提供的用户、计算机、服务都将被定义成Principal。
  2. Instances:用于服务principals和特殊管理Principal。
  3. Realms:Kerberos安装提供的独特的域的控制,把它想象成你的主机和用户所属的主机或者组。官方约定这域需要大写。默认的,Ubuntu将把DNS域名转换为大写当成这里的域。
  4. Key Distribution Center: (KDC)由三部分组成,一是principal数据库,认证服务器,和票据授予服务器。每个Realm至少要有一个。
  5. Ticket Granting Ticket:由认证服务器(AS)签发,Ticket Granting Ticket (TGT)使用用户的密码加密,这个密码只有用户和KDC知道。
  6. Ticket Granting Server: (TGS) 根据请求签发服务的票据。
  7. Tickets:确认两个Principal的身份。一个主体是用户,另一个是由用户请求的服务。门票会建立一个加密密钥,用于在身份验证会话中的安全通信。
  8. 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
  1. 一旦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和管理员用户名。

  2. 接下来,这个新的管理员用户需要有合适的访问控制列表(ACL)权限。它被配置在/etc/krb5kdc/kadm5.acl文件中:

    steve/[email protected]

    这赋予steve/admin对域中所有principals进行任何操作的能力。你可以对principals配置更加严格的权限。这是很方便的,如果你需要一个admin principal在kerberos客户端中具有较低的权限。更多细节请查看kadm5.acl文件。

  3. 现在重ikrb5-admin-server 使新的ACL生效:

    sudo service krb5-admin-server restart
  4. 现在这个新的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域包含被路由分割的不同的网络。

  5. 使客户端自动定位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是一个明智的选择。

  1. 首先,安装包,当被询问Kerberos和管理服务器名时填入主KDC的名字:

    sudo apt-get install krb5-kdc krb5-admin-server
  2. 一旦包被安装后,创建Secondary KDC的主机实体。在命令提示符下输入:

    kadmin -q "addprinc -randkey host/kdc02.example.com"

    tips:随后,使用任何kadmin的命令是,你将被提示输入username/[email protected]实体的密码。

  3. 提取keytab文件:

    kadmin -q "ktadd -norandkey -k keytab.kdc02 host/kdc02.example.com"
  4. 现在在你当前目录应该有一个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文件。

  5. 接下来在每个KDC节点上需要有kpropd.acl文件来列出所有域中的KDC,在主KDC和secondary KDC,创建/etc/krb5kdc/kpropd.acl:

    host/[email protected]
    host/[email protected]
  6. 在Secondary KDC上创建一个空的数据库:

    sudo kdb5_util -s create
  7. 现在,开启kpropd守护进程,用来监听kprop功能的连接。kprop是用来传输转储文件的。

    sudo kpropd -S
  8. 在主KDC的终端创建实体数据库的转储文件:

    sudo kdb5_util dump /var/lib/krb5kdc/dump
  9. 提取主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的主机。

  10. 使用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
  11. 回到Secondary KDC,创建一个stash用来保存Kerberos master key:

    sudo kdb5_util stash
  12. 最后,在 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 [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

现在你应该在成功登录认证后获得了一个票据。

资源

  1. 查看更多Kerberos的MIT版本信息,请访问MIT Kerberos官网。
  2. Ubuntu Wiki Kerberos有更多的细节。
  3. O’Reilly的Kerberos: The Definitive Guide在配置Kerberos方面是一个非常好的参考。
  4. 另外,当你有Kerberos的相关问题时,欢迎到Freenode的#ubuntu-server和#kerberos IRC频道查看或提问。

相关推荐