FreeBSD 使用手册
上一页 | 第14章 　安全 | 下一页

# 14.7 KerberosIV

撰写者 Mark Murray. 初稿 Mark Dapoz.

Kerberos 是一个网络附加系统/协议， 它使得用户能够通过一个安全服务器的服务来验证身份。 象远程登录， 远程复制， 系统间的相互文件复制和其他完成高风险任务的服务将被变得相当安全和可控制。

下面将具体介绍如何配置随 FreeBSD 发行的 Kerberos。 不过， 您还是应该阅读相应的联机手册以获得完整的说明。

## 14.7.1 安装 KerberosIV

Kerberos 是 FreeBSD 的一项可选组件。 安装该软件最简单的办法就是 在使用 sysinstall 安装 FreeBSD 时选择 `krb4` 或 `krb5`。 这样将会安装 “eBones” (KerberosIV) 或 “Heimdal” (Kerberos5) 的 Kerberos 实现。 采用实现的原因是它们在美国/加拿大 以外的地区开发， 以便允许在这些国家之外的人使用， 而不必受美国的加密代码出口管制的限制。

此外， 您可以从 `security/krb5` 得到 Kerberos 的 MIT 实现。

## 14.7.2 创建最初的数据库

这项工作只需要在 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`。

## 14.7.3 让一切运转起来

有两个主要的东西需要被添加到要用 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

## 14.7.4 创建服务器文件

现在需要分析在每台机器上定义的服务的所有情况。 为了做到这一点， 可以使用 `ext_srvtab` 命令。 这将创建一个文件， 它需要被 通过安全的途径 复制或移动到每一个 Kerberos 客户端的 `/etc` 目录中。 在每一台服务器上都必须存在这个文件， 它对 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` 复制到可移动介质上， 并以安全的实物交付方法拿走。 把文件复制到客户机的 `/etc` 目录中， 并将其改名为 `srvtab`， 并赋予 mode 600:

    # mv grumble-new-srvtab srvtab
    # chmod 600 srvtab

## 14.7.5 复制数据库

现在添加一些用户记录到数据库。 首先为用户 `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

## 14.7.6 测试全部相关信息

首先必须启动 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:      jane@EXAMPLE.COM

      Issued           Expires          Principal
    Apr 30 11:23:22  Apr 30 19:23:22  krbtgt.EXAMPLE.COM@EXAMPLE.COM

现在可以试试看用 passwd(1) 来修改口令， 以验证 kpasswd 服务程序是否能够从 Kerberos 数据库中获得需要的授权：

    % passwd
    realm EXAMPLE.COM
    Old password for jane:
    New Password for jane:
    Verifying password
    New Password for jane:
    Password changed.

## 14.7.7 授予 `su` 特权

Kerberos 使我们能够给予 每一个 需要使用 `root` 特权的用户使用他们自己 单独的 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
    jane.root@EXAMPLE.COM

试试看 su(1)：

    % su
    Password:

然后看看我们拥有哪些句柄：

    # klist
    Ticket file:    /tmp/tkt_root_245
    Principal:      jane.root@EXAMPLE.COM

      Issued           Expires          Principal
    May  2 20:43:12  May  3 04:43:12  krbtgt.EXAMPLE.COM@EXAMPLE.COM

## 14.7.8 使用其它命令

在前文给出的例子中， 我们创建了一个称为 `jane` 的用户， 以及一个 `root` 实例。 此处的用户名和它的 principal 相同， 这是 Kerberos 默认的； 一个形如 `<username>.``root` 的 `<principal>.<instance>` 将允许 `<username>` 使用 su(1) 成为 `root`， 只要所需的那些条目在 `root` home 目录中的 `.klogin` 中存在的话：

    # cat /root/.klogin
    jane.root@EXAMPLE.COM

类似地， 如果用户的 home 目录中有这样的设置：

    % cat ~/.klogin
    jane@EXAMPLE.COM
    jack@EXAMPLE.COM

则表明在 `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

或者， 当 `jack` 登录到 `jane` 在同一台机器上的账号 (`jane` 按照前面所介绍的那样配置了 `.klogin` 文件， 而负责 Kerberos 的管理员， 则为 jack 的 principal 配置了一个空的 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

上一页 | 起始页 | 下一页
TCP Wrappers | 上一级 | Kerberos5

本文档和其它文档可从这里下载：ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题，请先阅读文档，如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.