Kerberos 是一个网络附加系统/协议, 它使得用户能够通过一个安全服务器的服务来验证身份。 象远程登录,远程拷贝,系统间的相互文件拷贝和其他完成高风险任务的服务将被变得相当安全和可控制。
下面将具体介绍如何配置随 FreeBSD 发行的 Kerberos。 不过, 您还是应该阅读相应的联机手册以获得完整的说明。
Kerberos 是 FreeBSD 的一项可选组件。 安装该软件最简单的办法就是 在使用 sysinstall 安装 FreeBSD 时选择 krb4 或 krb5。 这样将会安装 “eBones” (KerberosIV) 或 “Heimdal” (Kerberos5) 的 Kerberos 实现。 采用实现的原因是它们在美国/加拿大 以外的地区开发, 因此这些国家之外的人使用, 而不必受美国的加密代码出口管制的限制。
此外, 您可以从 security/krb5 获取 Kerberos 的 MIT 实现。
这项工作只需要在 Kerberos 服务器上完成。 首先确认没有旧的 Kerberos 数据库存在。 您应该进入到 /etc/kerberosIV 目录中并检查下述文件是否已经存在:
# cd /etc/kerberosIV # ls README krb.conf krb.realms
如果您发现了除此之外的其它文件 (例如 principal.* 或 master_key) 已经存在, 请使用 kdb_destroy 命令来销毁旧的数据库, 或者, 如果 Kerberos 没有在运行,简单地删除掉那些多余的文件。
现在必须编辑 krb.conf 和 krb.realms 文件来定义您的 Kerberos 领域。 在本例中, 这个领域将是 EXAMPLE.COM 而其服务器是 grunt.example.com。 我们编辑或创建如下的 krb.conf 文件:
# cat krb.conf EXAMPLE.COM EXAMPLE.COM grunt.example.com admin server CS.BERKELEY.EDU okeeffe.berkeley.edu ATHENA.MIT.EDU kerberos.mit.edu ATHENA.MIT.EDU kerberos-1.mit.edu ATHENA.MIT.EDU kerberos-2.mit.edu ATHENA.MIT.EDU kerberos-3.mit.edu LCS.MIT.EDU kerberos.lcs.mit.edu TELECOM.MIT.EDU bitsy.mit.edu ARC.NASA.GOV trident.arc.nasa.gov
在这个例子中, 除此之外的其它领域并不时必须的。 把他们在这里一并展示是为了演示如何让机器了解多个领域的存在。 简单起见, 在实际的配置中可以省略它们。
第一行命名了这个系统工作的领域。 其它行包含了领域/主机的记录。 每行的第一项是一个领域, 其后是在这个领域中充当 “密钥分发中心” 的主机名。 其后的 admin server 表示该主机同时还提供管理数据库服务。进一步的详细说明请参考 Kerberos 联机手册。
现在应该添加 grunt.example.com 到 EXAMPLE.COM 领域, 同时追加一项以便将出现在 EXAMPLE.COM 领域中 .example.com 域的所有主机也加入进来。 krb.realms 这个文件需要按照下面的方法修改:
# cat krb.realms grunt.example.com EXAMPLE.COM .example.com EXAMPLE.COM .berkeley.edu CS.BERKELEY.EDU .MIT.EDU ATHENA.MIT.EDU .mit.edu ATHENA.MIT.EDU
再次强调, 其它领域并不时必需的。 在这里只是要展示如何使用多个领域。 可以删掉它们以简化配置。
第一行将 指定的 系统置于所指名字的领域内。 这一行的其它部分则指明了特定子域内的主机应该默认属于哪个领域。
接下来我们就可以创建数据库了。 只有在 Kerberos 服务器上 (或密钥分发中心上) 才需要它。 可以通过 kdb_init 命令来完成这一步:
# kdb_init Realm name [default ATHENA.MIT.EDU ]: EXAMPLE.COM You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter Kerberos master key:
现在我们应该保存密钥, 这样本机上运行的其他服务就能够了解这一变化。 用 kstash 命令来完成这一步:
# kstash Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE!
这一操作将把主口令保存到 /etc/kerberosIV/master_key。
有两个主要的东西需要被添加到要用 Kerberos 来确保安全的 每一个 系统上。 它们的名字是 kpasswd 和 rcmd。 这些程序允许另外系统改变 Kerberos 的密码, 在不同的系统上可能有不同的名字。
服务程序 kpasswd 和 rcmd 使得其他系统能够修改 Kerberos 口令, 以及执行类似 rcp(1), rlogin(1) 和 rsh(1) 这样的命令。
我们添加下面这些记录:
# kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: passwd Instance: grunt <Not found>, Create [y] ? y Principal: passwd, Instance: grunt, kdc_key_ver: 1 New Password: <---- enter RANDOM here Verifying password New Password: <---- enter RANDOM here Random password [y] ? y Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: rcmd Instance: grunt <Not found>, Create [y] ? Principal: rcmd, Instance: grunt, kdc_key_ver: 1 New Password: <---- enter RANDOM here Verifying password New Password: <---- enter RANDOM here Random password [y] ? Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- null entry here will cause an exit
现在需要分析在每台机器上定义的服务的所有情况。 为了做到这一点, 可以使用 ext_srvtab 命令。 这将创建一个文件, 它需要被 通过安全的途径 复制或移动到每一个 Kerberos 客户端的 /etc/kerberosIV 目录中。 在每一台服务器上都必须存在这个文件, 它对 Kerberos 的运行至关重要。
# ext_srvtab grunt Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Generating 'grunt-new-srvtab'....
现在,这个命令只产生一个临时文件,必须被重命名为 srvtab 以便所有的服务可以识别它。 用 mv(1) 命令把它挪到原系统的这个位置:
# mv grunt-new-srvtab srvtab
如果文件是针对客户系统的, 而且网络可能会不安全, 则应把 client-new-srvtab 复制到可移动的介质上, 并通过物理上安全的方式拿走。 将其改名为 srvtab 并放到客户机的 /etc/kerberosIV 目录中, 并赋予 mode 600:
# mv grumble-new-srvtab srvtab # chmod 600 srvtab
现在添加一些用户记录到数据库。 首先为用户 jane 创建其对应的项。 使用 kdb_edit 命令来完成此项工作:
# kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: <Not found>, Create [y] ? y Principal: jane, Instance: , kdc_key_ver: 1 New Password: <---- enter a secure password here Verifying password New Password: <---- re-enter the password here Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- null entry here will cause an exit
首先必须启动 Kerberos 的服务程序。 这里需要指出, 如果您正确地修改了 /etc/rc.conf 则系统在启动时会自动完成这个工作。 只有在 Kerberos 服务器上才需要这么做。 Kerberos 客户程序将自动地从 /etc/kerberosIV 目录中的文件或去所需要的信息。
# kerberos & Kerberos server starting Sleep forever on error Log file is /var/log/kerberos.log Current Kerberos master key version is 1. Master key entered. BEWARE! Current Kerberos master key version is 1 Local realm: EXAMPLE.COM # kadmind -n & KADM Server KADM0.0A initializing Please do not use 'kill -9' to kill this job, use a regular kill instead Current Kerberos master key version is 1. Master key entered. BEWARE!
接下来应使用 kinit 命令来获取与我们刚刚创建的 ID jane 对应的 ticket:
% kinit jane MIT Project Athena (grunt.example.com) Kerberos Initialization for "jane" Password:
尝试使用 klist 列出句柄以了解是否真的拥有它们:
% klist Ticket file: /tmp/tkt245 Principal: [email protected] Issued Expires Principal Apr 30 11:23:22 Apr 30 19:23:22 [email protected]
现在可以试试看用 passwd(1) 来修改口令, 以验证 kpasswd 服务程序是否能够从 Kerberos 数据库中获得需要的授权:
% passwd realm EXAMPLE.COM Old password for jane: New Password for jane: Verifying password New Password for jane: Password changed.
Kerberos 使我们能够给予 每一个 需要使用 root 特权的用户使用他们自己 s单独的 su(1) 口令。 现在我们追加一个被授予 su(1) 到 root 权限的 ID。 这件事是由与 root 相关联的一个 principal 实例来控制的。使用 kdb_edit 可以在 Kerberos 数据库中建立一个 jane.root 条目:
# kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: root <Not found>, Create [y] ? y Principal: jane, Instance: root, kdc_key_ver: 1 New Password: <---- enter a SECURE password here Verifying password New Password: <---- re-enter the password here Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? 12 <--- Keep this short! Attributes [ 0 ] ? Edit O.K. Principal name: <---- null entry here will cause an exit
现在试试看获得相应的句柄, 以确认它已经正常工作了:
# kinit jane.root MIT Project Athena (grunt.example.com) Kerberos Initialization for "jane.root" Password:
接下来我们需要把用户添加到 root的 .klogin 文件里:
# cat /root/.klogin [email protected]
试试看 su(1):
% su Password:
然后看看我们拥有哪些句柄:
# klist Ticket file: /tmp/tkt_root_245 Principal: [email protected] Issued Expires Principal May 2 20:43:12 May 3 04:43:12 [email protected]
在前文给出的粒子中, 我们创建了一个称为 jane 的用户, 以及一个 root 实例。 此处的用户名和它的 principal 相同, 这是 Kerberos 默认的; 一个形如 <username>.root 的 <principal>.<instance> 将允许 <username> 使用 su(1) 成为 root, 只要所需的那些条目在 root home 目录中的 .klogin 中存在的话:
# cat /root/.klogin [email protected]
类似地, 如果用户的 home 目录中有这样的设置:
% cat ~/.klogin [email protected] [email protected]
则表明在 EXAMPLE.COM 领域的经过身份验证的 jane 或者 jack (通过 kinit, 详情见前文) 能够使用 jane 的身份或系统 (grunt) 中的文件, 无论通过 rlogin(1), rsh(1) 或是 rcp(1)。
举例来说, jane 现在通过 Kerberos 登入了其它系统:
% kinit MIT Project Athena (grunt.example.com) Password: % rlogin grunt Last login: Mon May 1 21:14:47 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995
Or jack logs into jane's account on the same machine (jane having set up the .klogin file as above, and the person in charge of Kerberos having set up principal jack with a null instance):
% kinit % rlogin grunt -l jane MIT Project Athena (grunt.example.com) Password: Last login: Mon May 1 21:16:55 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995