使用Kerberos实现统一认证(一)

日期: 2008-04-20 作者:Alf Wachsmann 来源:TechTarget中国

  Kerberos可以解决你的账号管理方面的痛苦。在一个分布式的Uinux/Linux环境中,如果通过手工进行账号管理,将变得复杂、混乱。大型站点使用特殊的工具来解决这个问题,在本文中,我叙述的是针对少量计算机的环境如何解决这个问题,如家里的三台电脑组成的小网络。


  在一个分布式环境中的问题是,如果发生账号改动的情况,每台机器上的password文件和shadow文件需要一个一个地去修改,账号改动包括修改密码、添加/删除账号、账号名修改(任何情况下,修改UID/GID是一个大问题)、添加/删除登陆计算机的权限等。我也将叙述如何用Kerberos解决分布式计算环境中的认证问题,在第二部分,我将叙述一个解决认证问题的解决方案。


  认证一个连接到计算机的用户大多数是通过密码来解决的,尽管有其他方法(包括智能卡和生物特征)是可用的,这些密码存储在/etc/passwd中,现在使用影子密码,它存储在/etc/shadow中,因为这些文件是在本地计算机上的,要保持是最新状态是很大的一个问题,目录服务如NIS、NIS+和LDAP能解决这个问题,但是这些服务引入了新的问题:它们工作在网络上,密码也是暴露在网络上的,它们只使用了很弱的加密。


  通过Kerberos实施的认证协议联合网络服务的优势,完全不需要在两台计算机之间传输密码了,要实现这个,Kerberos需要你在一个安全的服务器上运行两个后台进程,密钥分发中心(KDC)后台进程处理所有的密码验证请求,并生成Kerberos证书,叫做凭证授予凭证(TGT),第二个后台进程,Kerberos管理进程,它允许你远程添加、删除和修改账号,而不用登陆到运行Kerberos管理进程的计算机上,它也处理来自用户的密码修改请求,使用Kerberos,只有一个密码修改需要通过网络传输一个强壮的加密密码。


  在认证用户的过程中,Kerberos KDC给用户授予一个临时的证书,TGT,典型地,这些证书有10或24小时的有效期,这个有效期是可以配置的,但是不能超过24小时,万一TGT被偷,小偷只能在TGT的有效期时间内使用,如果你只使用Kerberos进行身份认证,证书失效了不会引起问题,但是,如果你正在使用Kerberized服务,你需要培训你的用户在他们目前的证书失效后获取新的证书,即使他们仍然可以登陆。


  Kerberos是在MIT创造出来的,最新的版本是Kerberos 5,它的协议定义在RFC 1510。今天,Kerberos有两个实现是可用的,参考文章后面的资源。MIT的Kerberos 5包括在Red Hat Linux中,而Heimdal包括在SuSe和Debian Linux发行版中,Kerberos 5实现也包括在微软的windows(2000以及更高版本)、Sun的Solaris(SEAM,Solaris2.6及更高版本)和Apple的Mac OS X中,我使用MIT的Kerberos发布版贯穿本文,因为它提供了简单密码质量检查功能,密码老化和密码历史,这些功能都是开箱即用的。


  先决条件


  在你转到Kerberos认证前需要满足两个先决条件,首先,所有包括在Kerberos中的计算机的时钟需要与运行KDC的机器进行同步,最简单的方法就是在所有的机器上使用网络时间协议(NTP)来同步。


  第二个先决条件很难满足,所有计算机上的账号名、UID和GID都必需一样,这是必需的,因为这些账号变成一个新的与Kerberos账号无关的了,叫做委托人,你不得不仔细检查所有的本地文件/etc/passwd,以及检查这个需求是否满足,如果没有,你需要合并你的账号,如果你想添加windows或Mac OS X客户端到你的Kerberos设备上,你需要考虑那些机器上的所有帐户。


  如果你决定使用来自你Linux发行版中的Kerberos程序包,简单地安装它,如果你想自己编译Kerberos发布包,请按照下面的指令做:


  创建和安装MIT Kerberos


  1) 从资源中列出的URL中选择一个源下载源码包,并获取它的PGP签名,用下面的命令校验包的完整性和准确性:
  % gpg –verify krb5-1.3.4.targz.asc


  2) 用下面的命令解压源码包
  % tar zxvf krb5-1.3.4.tar.gz


  3) 进入源码目录
  % cd krb5-1.3.4/src


  4) 执行
  % ./configure –help


  这个命令执行结果将告诉你可用的配置选项,/usr/local/是默认的安装位置,如果你需要将软件安装到另外的目录,在下一步使用一个—prefix=/新的目录路径 参数。


  5) 在大多数情况下,默认的配置就能工作得很好
  % ./configure


  6) 用下面的命令编译
  % make


  我遇到了一个问题,在krb5-1.3.4/src/kadmin/testing/util目录中有个文件有点问题,但可以安全地忽略掉,在本例中,使用%make –i重新启动编译过程


  7) 使用下面的命令检查编译的准确性
  % make check


  8) 如果检查顺利通过,就可以开始安装了
  % sudo make install


  永远不要用root进行编译,仅当必需的时候才使用root权限,在这些步骤中都一样


  9) 现在你将MIT Krb5安装到/usr/local/中了,还需要手动创建一些目录和设置它们的权限


  10)
  % sudo mkdir -p /usr/local/var/krb5kdc
  % sudo chown root /usr/local/var/krb5kdc
  % sudo chmod 700 /usr/local/var/krb5kdc


  如果你真需要或想编译属于你自己的PAM模块,这里提供一下步骤,首先获取软件包并解压:


  % tar zxf pam_krb5-1.3-rc7.tar.gz
  % cd pam_krb5-1.3-rc7


  首先,你需要在你的$PATH环境变量中设置Kerberos的路径,例如:


  % PATH=/usr/local/bin:$PATH


  如果你自己已经将其安装到/usr/local中,那么执行:
  % ./configure


  然后编译和安装该软件包:
  % make


  创建你自己的区域


  Kerberos区域是一个管理域,它有它自己的Kerberos数据库,每个Kerberos区域都有它自己的一套Kerberos服务员,你的区域名可以是任何内容,但是它应该映射到你在DNS中的区域,如果新Kerberos区域是为你的整个DNS域example.com准备的,你应该将你的Kerberos区域取一个相同的名字(所有字母大写,这是Kerberos的惯例):EXAMPLE.COM,或者,如果你正在example.com下创建一个新的工程部区域,你应该选项ENG.EXAMPLE.COM作为区域名。


  创建你自己的区域的第一步是创建/etc/krb5.conf文件,它包括了所有关于这个区域的必需的信息,每个想访问你新的Kerberos区域的计算机都必需要krb5.conf文件,这里有一个区域EXAMPLE.COM的样本文件,KDC和管理服务器都运行在机器kdc.example.com上:






[realms]
    EXAMPLE.COM = {
        # specifies where the servers are and on
        # which ports they listen (88 and 749 are
        # the standard ports)
        kdc = kdc.example.com:88
        admin_server = kdc.example.com:749
    }
[domain_realm]
    # maps your DNS domain name to your Kerberos
    # realm name
    .example.com = EXAMPLE.COM
[logging]
    # determines where each service should write its
    # logging info
    kdc = SYSLOG:INFO:DAEMON
    admin_server = SYSLOG:INFO:DAEMON
default = SYSLOG:INFO:DAEMON


  下一个文件是/usr/local/var/krb5kdc/kdc.conf,KDC服务器的配置文件,只有运行了KDC后台服务的计算机才需要这个文件,每个条目都有一个合理的默认值,创建一个空文件应该满足大多数情况:


% sudo touch /usr/local/var/krb5kdc/kdc.conf


  下面的命令应该在你的KDC计算机上执行:
% sudo /usr/local/sbin/kdb5_util create –s


  为新区域创建一个初始化Kerberos数据库,它要求你提供新区域数据库管理密码,并将其存储在文件/usr/local/var/krb5kdc/.k5.EXAMPLE.COM中,这个命令也创建了第一套委托人在你的Kerberos 5 帐户数据库中,你可以使用下面的命令列出它们:


% sudo /usr/local/sbin/kadmin.local


  然后在kadmin.local提示符处输入listprincs,打印出一个列表:


K/M@EXAMPLE.COM
kadmin/admin@EXAMPLE.COM
kadmin/changepw@EXAMPLE.COM
kadmin/history@EXAMPLE.COM
krbtgt/EXAMPLE.COM@EXAMPLE.COM


  在这时候,我们没有准备好使用远程的kadmin工具。


  在你新的区域下开始创建任何委托人之前,你应该定义一个策略,由它来决定如何处理密码:






kadmin.local:  add_policy -maxlife 180days -minlife
?2days -minlength 8 -minclasses 3
?-history 10 default


  这个输入为我们从现在开始创建的委托人定义了默认的策略,它确定了密码的最长有效期是180天,最小是2天;密码最小长度是8个字符,这些字符必须来自5个可用类型中3个不同的类型:小写字母、大写字母、数字、标点符号和其他,保留最后10个密码的历史以便重新使用。如果你想用字典检查密码,象下面这样添加一个dict_file定义:






[realms]
    EXAMPLE.COM = {
        dict_file = /usr/share/dict/words
}


  到你的kdc.conf文件中。
  现在你就准备好给你自己创建一个管理委托人了:


kadmin.local: addprinc john/admin


  调整名字为你的账号名,但保留/admin。然后它将要求你为这个委托人输入两次新密码。你可以用下面的命令来查看新账号:


kadmin.local:  getprinc john/admin


  它在屏幕上打印出类似下面的内容:






Principal: john/admin@EXAMPLE.COM
Expiration date: [never]
Last password change: Wed Dec 24 09:55:17 PST 2003
Password expiration date: Mon Jun 21 10:55:17 PDT 2004
Maximum ticket life: 1 day 00:00:00
Maximum renewable life: 0 days 00:00:00
Last modified: Wed Dec 24 09:55:17 PST 2003 (root/admin@EXAMPLE.COM)
Last successful authentication: [never]
Last failed authentication: [never]
Failed password attempts: 0
Number of keys: 2
Key: vno 1, Triple DES cbc mode with HMAC/sha1, no salt
Key: vno 1, DES cbc mode with CRC-32, no salt
Attributes:
Policy: default


  输入quit退出kadmin.local程序,用下面的命令启动KDC后台服务:
% sudo /usr/local/sbin/krb5kdc
  输入下面的目录获取一个Kerberos 5 TGT:
% /usr/local/bin/kinit john/admin@EXAMPLE.COM


  用下面的命令查看你的TGT:







% /usr/local/bin/klist
Ticket cache: FILE:/tmp/krb5cc_5828
Default principal: john/admin@EXAMPLE.COM
Valid starting     Expires            Service principal
12/23/03 14:15:39  12/24/03 14:15:39  krbtgt/EXAMPLE.COM@EXAMPLE.COM


  祝贺你!你刚好完成你的第一次成功的Kerberos认证。现在你应该给这个管理账号指定权限了,它由文件/usr/local/var/krb5kdc/kadm5.acl中的条目决定。你可以给john/admin授予管理所有委托人的权限,通过添加下面这样一行到/usr/local/var/krb5kdc/kadm5.acl中,并使用通配符实现:
john/admin@EXAMPLE.COM  *


  在你能通过网络启动管理后台服务(kadmind)之前,你需要创建一个包含密钥的keytab文件:
kadmin.local:  ktadd -k /usr/local/var/krb5kdc/
?kadm5.keytab kadmin/changepw


  现在为Kerberos管理后台服务的事情都准备好了,可以启动它了:
% sudo /usr/local/sbin/kadmind


  这个后台服务允许你使用kadmin客户端工具远程管理你的Kerberos委托人,而不需要登陆到你的KDC,如果你想让你的Kerberos后台服务随系统启动而启动,将它们添加到你KDC中的/etc/rc文件中。


  使用前面获取到的Kerberos TGT,启动远程管理工具:






% /usr/local/sbin/kadmin
Authenticating as principal john/admin@EXAMPLE.COM
with password.
Password for john/admin@EXAMPLE.COM:


  添加新账号


  新账号仍然需要添加到你的shadow文件或你的密码映射中,无论如何,不要将密码放入这些位置,你要创建一个新的Kerberos委托人并将它的密码存储在KDC中。
使用kadmin工具:
% /usr/local/sbin/kadmin


  用下面的命令给常规用户添加一个委托人:






kadmin:  addprinc john
NOTICE: no policy specified for john@EXAMPLE.COM; assigning “default”
Enter password for principal “john@EXAMPLE.COM”:
Re-enter password for principal “john@EXAMPLE.COM”:
Principal “john@EXAMPLE.COM” created.


  创建委托人过程中输入的密码在john获取Kerberos TGT时需要或登陆到一个被配置成使用你的Kerberos 5区域的计算机时需要。现在你可以手工给你所有的账号创建委托人或使用下一小节将要介绍的迁移技术。


  添加从KDC


  如果你计划在你站点上的产品中使用Kerberos,你应该使用额外的从KDC来为你的安装提供故障容错功能。主KDC需要安装一个额外的传播服务,由它来发送KDC数据库版本更新到所有的从KDC服务器,从服务器需要为传播服务安装一个接收终端,请查看MIT文档。


  配置客户端


  启用Kerberos认证的最容易的方法是使用可插拔认证模块(PAM),因为它使用的是Kerberos API调用,它工作需要配置文件/etc/krb5.conf,因此,第一步是从你的KDC上拷贝/etc/krb5.conf到各个客户端机器。


  Kerberos不仅提供对用户的认证,也对计算机提供认证,防止你使用一个劫持的ip地址登陆到机器,要这样工作,每个计算机都需要它自己的Kerberos委托人和存储在文件(keytab文件)中的密钥(密码),计算机委托人构成如下:
host/.example.com@EXAMPLE.COM.


  第一步是为每个客户端计算机创建一个新的委托人,下面的命令用client1作为计算机名当例子,用客户端计算机主机名替换client1,登陆到你的每个客户端计算机并执行:
% sudo /usr/local/sbin/kadmin
kadmin: addprinc -randkey host/
?client1.example.com@EXAMPLE.COM


  它给新委托人指定一个随机密码,然后,提取密钥放入keytab文件:
kadmin: ktadd host/client1.example.com@EXAMPLE.COM


  它创建了/etc/krb5.keytab文件,要获得对/etc/目录的写入许可,你需要用suho运行kadmin命令,简单创建一个委托人不需要这些特殊的权限,小心/etc/krb5.keytab所有权和文件许可,无论如何,它只能对root是可读的,否则,这个机器的安全就会受到威胁。


  有几个为Kerberos 5准备的PAM可用,它们都叫pam_krb5。因为在MIT Kerberos 5 1.3版本中有一些API发生了变化,它们中的大部分都不再工作,你现在最好的选择是使用来自你的Linux发行版中的PAM模块,请查看前面的小节了解如何从源代码创建一个PAM模块。


  现在,通过编辑文件/etc/pam.d/system-auth (在Red Hat系统上)来添加一个新的PAM模块到你的系统认证堆栈:






auth  required    /lib/security/$ISA/pam_env.so
auth  sufficient  /lib/security/$ISA/pam_unix.so likeauth nullok
auth  sufficient  /lib/security/$ISA/pam_krb5.so use_first_pass
auth  required    /lib/security/$ISA/pam_deny.so
account   required      /lib/security/$ISA/pam_unix.so
account   [default=bad success=ok user_unknown=ignore
?service_err=ignore system_err=ignore]
?/lib/security/$ISA/pam_krb5.so
password  required    /lib/security/$ISA/pam_cracklib.so
?retry=3 type=
password  sufficient  /lib/security/$ISA/pam_unix.so
?nullok use_authtok md5 shadow
password  sufficient  /lib/security/$ISA/pam_krb5.so
?use_authtok
password  required    /lib/security/$ISA/pam_deny.so
session   required    /lib/security/$ISA/pam_limits.so
session   required    /lib/security/$ISA/pam_unix.so
session   optional    /lib/security/$ISA/pam_krb5.so


  这些改变使每个程序都要使用system-auth PAM堆栈(它的配置文件在/etc/pam.d/目录下)完成Kerberos认证。


  与非Linux客户端的内部操作


  如果你已经安装了一个windows活动目录(AD)KDC,你可以将它作为你Linux/Unix机器的主KDC,假如这样,你可以跳过全部服务器的安装,只需要安装上面叙述的设置你的客户端,你的/etc/krb5.conf文件需要定义windows KDC而不是Unix KDC,关于如何创建和拷贝keytab文件的更多信息请参考资源部分列出的文章。


  如果在你的工作组中有许多的windows机器,你也可以使用Unix KDC为它们提供服务,但是仅当你的windows客户端不属于windows AD域时才可以。


  在你的Kerberos 5区域中使用Mac OS X客户端很容易,只需要在你的Mac上配置好你的Unix KDC的名字就可以了。再说一下,账号名必须匹配。


  从本地或NIS/LDAP迁移密码到Kerberos


  现在你已经有一个在运行的Kerberos 5区域了,你的客户端也配置好了,你还需要转换你全部的用户账号,迄今为止,你账号的密码还是保存在本地的/etc/shadow文件或一个NIS/LDAP密码映射中,这些密码使用单向hash函数加密是不可能的,要破解它或转换为Kerberos 5格式,对于那些没有超级计算机的用户来说是不切实际的,一个好的办法是使用pam_krb5_migrate模块来从你现在的位置迁移到Kerberos,这个模块可以在少数计算机上安装,每当有人登陆时,它在你的Kerberos 5 KDC中为该账号创建一个新的委托人,并重复使用该账号当前的密码。


  在每个人都登陆到这些指定的机器后,你所有账号就有一个对应的Kerberos 5委托人了,然后你可以在本地的密码文件或你的NIS/LDAP密码映射中用一个占位符(如krb5)替换密码,现在Kerberos PAM模块就可以认证你的用户了,到此为止,你也可以从迁移系统移除pam_krb5_migrate模块了。


  支持Kerberos的应用程序


  现在你的Kerberos已经处于运行中了,你可以使用利用它的服务了,你应该安装支持Kerberos的telnet和ftp,但是你真正应该使用ssh,你可以使你的Apache web服务器和Mozilla浏览器支持Kerberos;在使用Kerberos之前,你要使用这些服务必须输入密码,使用Kerberos后,这些应用程序都使用存储的Kerberos证书进行内部认证,这就是传说中的单点登陆了。


  资源


  1、两个可用的Kerberos实现,一个来自MIT: web.mit.edu/kerberos/dist,另外一个叫Heimdal,来自瑞典的KTH: www.pdc.kth.se/heimdal.
2、pam_krb5_migrate: freshmeat.net/projects/pam_krb5_migrate
3、pam_krb5: sourceforge.net/projects/pam-krb5
4、MIT Kerberos 5发布版包括许多好的关于安装、管理和使用Kerberos的文档,最近O’Reilly发行了一般关于Kerberos的书: The Definitive Guide作者Jason Garman (ISBN 0-596-00403-6) 是关于如何创建一个新的区域和如何与其他操作系统一起工作的很好的书籍。
5、与Kerberos客户端一起使用微软的活动目录:
www.microsoft.com/windows2000/techinfo/planning/security/kerbsteps.asp

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐