Kerberos
Kerberos 是一套强大的程序,它允许您与几乎任何事物建立加密连接:TELNET、FTP 甚至电子邮件。这对调制解调器用户来说没什么用处,但在使用以太网且嗅探是一个真正危险的较大环境中,Kerberos 提供了一个可行且强大的解决方案。然而,有一个问题——Kerberos 以其过于复杂且难以安装而臭名昭著。本文旨在帮助您良好地开始;在您意识到之前,通过一点实验,一切都会(勉强)工作。我希望我能在这里详细解释一切,但那样的话,这将是一本书,而不是一篇文章。
像几乎每次重大升级/更改一样,最好备份您的系统。如果可以,请备份。如果您没有磁带驱动器,请小心安装,Kerberos 不应该覆盖您的文件,但如果您想确保安全,请在某处复制 /sbin。这只需要两秒钟,如果出现问题,这将非常值得。
现在我们去获取文件。Kerberos 有 Linux 的二进制和源代码发行版。我发现源代码通常比二进制文件给我带来的问题更少。如果您有兴趣玩一下,请获取源代码,否则获取二进制文件。两者都可以在 http://web.mit.edu/kerberos/www/ 找到。我在这里只介绍二进制文件——仅仅因为编译源代码不属于本文的范围。我假设您已设法正确安装了东西。一个重要的注意事项:如果您确实选择使用源代码(我建议您这样做),请确保您提取所有 tar 存档文件,而不仅仅是包含源代码的文件。此外,如果您将东西安装在不同的目录(不是 /krb5)中,那么您需要修改下面提到的文件以反映您的安装目录。
这两个文件几乎控制着一切。它们控制着您的 REALM(见下文)的名称以及谁可以连接;但是,它们可能相当复杂。在您设置它们之前,您可能需要理解一些术语
REALM:我将 realm 视为一个“组”。机器将属于这个组。将 realm 设置为与您的域名相同,只是使用大写字母,这几乎已成为标准做法。在我的例子中,我将其称为 UNDER,但您可以将其称为您想要的任何名称。是的,您可以拥有多个 REALM,但您可能不需要一个。请记住——REALM 是 区分大小写的!选择一个标准并坚持下去。
KEYTAB:一个包含加密信息的文件,允许用户/机器验证自己的身份。每个尝试向 KDC(见下文)验证自身身份的机器都必须有一个。这通过在 kadmin 下发出 ktadd 命令来完成。
KDC:Kerberos 分发中心——让您头疼的那个。这是控制访问的机器。
PRINCIPAL:principal 是用户或主机的“定义”。它实际上是告诉服务器用户存在或服务器是受信任的。
INCIDENT:在创建新的 principal 时,表示法如下:incident/host@REALM。例如,使用 ktadd,执行类似如下的操作
ktadd host/pepsi.kellogg.nwu.edu@UNDER
将为属于 UNDER realm 的机器 pepsi.kellogg.nwu.edu 创建 incident host。
查看我的 /etc/krb5.conf 文件并注意以下内容
default_realm = UNDER:您的 realm 的名称。
profile = /krb5/var/krb5kdc/kdc.conf:您的 kdc.conf 文件的位置
另请注意名为 [realms] 的部分。在它下面,我有我的 realm 的名称 UNDER,以及托管该信息的机器,在本例中为 underground.kellogg.nwu.edu。这将是您刚刚安装 Kerberos 的机器的主机名。[domain_realm] 解释了谁可以连接到 realm:来自 kellogg 内和 res-hall 内(西北大学的宿舍房间)的任何人。将上面提到的所有信息替换为您的 REALM 的名称和您安装服务器的机器的名称。
现在转到您的 kdc.conf 文件。您需要将其放置在您在 /etc/krb5.conf 中定义的位置。我的建议是将它放在与我相同的目录中。这将意味着创建这些目录。如果您这样做,您可以直接复制我的 kdc.conf 并节省一些时间。只需将 realm 的名称更改为您在创建 krb5.conf 文件时选择的名称即可。这两个文件对于使事情正常工作至关重要。您可能需要仔细检查是否有错别字,并可能在以后省去一些麻烦。
现在,必须完成一些繁琐但容易的工作。通过发出以下命令创建控制谁可以在哪里登录的数据库
# kdb5_util create -r
Initializing database '/krb5/lvar/krb5kdc/principal' for
realm '
master key name 'K/M@YOUR_REALM'
在我的例子中,YOUR_REALM 将是 UNDER。只需将其替换为您现在所在的机器的主机名即可。系统会要求您输入主密码;选择您不会忘记的密码。
现在您必须创建一个 ACL 文件。这基本上控制谁可以连接和管理 REALM。它也可能很复杂,但为了我们的目的,我们将保持简单。编辑(或创建)由 kdc.conf 文件中的 acl = 定义的文件。将以下内容单独放在一行上
*/admin@
这意味着管理员可以控制一切。我不明白您为什么还需要其他任何东西。
现在是时候向机器添加用户了。首先,从管理员帐户开始。
# kadmin.local
kadmin.local: addprinc admin/admin@
Enter password for principal "admin/admin@
your_password
Re-enter password for principal "admin/admin@
your_password
Principal "admin/admin@YOUR_REALM" created.
然后在服务器上创建一个 keytab。这将验证谁可以修改服务器上的内容,谁不能。确保您将所有内容放在一行上(包括 kadmin/changepw)
kadmin.local: ktadd -k /etc/kadm5.keytab kadmin/admin kadmin/changepw Entry for principal kadmin/admin with kvno 3, encryption type DES-CBC-CRC added to keytab WRFILE:/etc/kadm5.keytab. Entry for principal kadmin/changepw with kvno 3, encryption type DES-CBC-CRC added to keytab WRFILE:/etc/kadm5.keytab.您应该看到一些类似的东西,但可能不完全相同。然后您必须将必要的信息添加到服务器。编辑您的 /etc/inetd.conf 并插入以下内容
krb5_prop 754/tcp # Kerberos v5 slave propagation kerberos-adm 749/tcp # Kerberos v5 admin/chpwd kerberos-adm 749/udp # Kerberos v5 admin/chpwd kpasswd 761/tcp kpwd # Kerberos "passwd" -kfall现在,以 root 身份,重启 inetd 并运行 krb5kdc 和 kadmind。恭喜,大部分痛苦已经结束了。我第一次尝试这个花了八个小时才到达这里——希望您做得更好。
现在测试一下。需要了解的几个命令是 kinit、klist 和 kdestory。这些命令初始化您的票证以授权您,列出它们并销毁它们。(是的,从用户的角度来看,一切都相当简单。)所以通过执行 kinit admin/admin@YOUR_REALM 来尝试一下
underground:~> kinit admin/admin Password for admin/admin@UNDER: underground:~> klist Ticket cache: /tmp/krb5cc_1000 Default principal: admin/admin@UNDER Valid starting Expires Service principal 08 May 98 15:04:45 09 May 98 01:04:43 krbtgt/UNDER@UNDER
如果您到目前为止都使其工作,那么您实际上已经完成了。将您自己添加为用户。运行 kadmin——它应该会要求您输入密码,与您在创建 kadmin/admin 时输入的密码相同。添加另一个用户的过程同样简单。每个用户都是一个“principal”(不要问我这个名字从哪里来的)。
kadmin: addprinc
Enter password for principal "user@
Re-enter password for principal "user@
Principal "user@YOUR_REALM" created.
如果您犯了错误,只需像这样删除 principalkadmin: delprinc user@
Are you sure you want to delete the principal "user@
Principal "user@YOUR_REALM" deleted.
现在以与您测试管理员相同的方式测试这个。您应该获得一张新票证。我仍然没有解释如何使用它,所以我们开始吧。为了使您能够在机器上使用 Kerberos 加密服务,它必须满足以下条件
它在服务器上有一个 principal host/hostname@REALM
它已设置了正确的服务。
它有一个 keytab 文件,并且 /etc/inetd.conf 设置正确。
尝试这个的最简单方法是设置服务器,使其在您尝试添加其他机器之前允许您建立加密连接。问题是它与设置另一台机器有点不同。因此,我们将说我们想在机器 pepsi.kellogg.nwu.edu 上使用 Kerberos 化的 TELNET 和 FTP 作为本例。为此,您需要满足上述三个要求。
让我们回顾一下第一个。您首先需要在您想要提供 Kerberos 化服务的机器上安装 Kerberos。所有这些都意味着将二进制文件放在机器上(在我们的示例中为 pepsi.kellogg.nwu.edu)。所以只需去安装二进制文件。如果需要,您可以直接复制它们。然后从 KDC(服务器)复制您的 /etc/krb5.conf 文件,并将其放在您提供 Kerberos 化服务的机器上(pepsi.kellogg.nwu.edu)。从该机器上,您必须运行 kinit admin/admin。然后从您的机器(或在我的例子中为 pepsi.kellogg.nwu.edu)运行 kadmind 并运行以下命令
kadmin: addprinc host/pepsi.kellogg.nwu.edu kadmin: addprinc telnet/pepsi.kellogg.nwu.edu kadmin: addprinc ftp/pepsi.kellogg.nwu.edu kadmin: ktadd host/pepsi.kellogg.nwu.edu telnet/pepsi.kellogg.nwu.edu ftp/pepsi.kellogg.nwu.edu
一个简短的解释是必要的。对于您计划提供的每个 Kerberos 化服务,您都必须有一个 principal。因此,将 telnet 和 ftp 与 addprinc 命令一起使用。然后您必须创建 keytab。这通过发出 ktadd 命令来完成。所有这些都必须在您正在设置以提供服务的机器上完成(在本例中为 pepsi.kellogg.nwu.edu)。
最后,编辑您的 /etc/inetd.conf 并添加以下行。您将需要注释掉 telnet 和 ftp 的任何先前定义。
klogin stream tcp nowait root /krb5/sbin/klogind klogind -ki eklogin stream tcp nowait root /krb5/sbin/klogind klogind -eki kshell stream tcp nowait root /krb5/sbin/kshd kshd -ki telnet stream tcp nowait root /krb5/sbin/telnetd telnetd -a valid ftp stream tcp nowait root /krb5/sbin/ftpd -a
返回主服务器并为您自己创建一个票证 (kinit user@YOUR_REALM)。现在为您自己创建一个用户(参见上面的 addprinc 命令)并尝试像这样使用 telnet 登录
underground:~> telnet -l cosimo pepsi Trying 129.105.197.33... Connected to pepsi.kellogg.nwu.edu (129.105.197.33). Escape character is '^]'. [ Kerberos V5 accepts you as "cosimo@UNDER" ] Last login: Fri May 8 13:44:44 on tty2 Linux 2.0.30. pepsi:~>请注意您不必输入密码。没关系,因为票证授予了您对机器的访问权限。票证最终会过期,但可以通过发出新的 kinit 命令来续订。(执行 klist 以查看它何时过期。如果您复制了我的 /etc/krb5.conf,则为 600 分钟。)
让我们整理一些遗漏:您应该意识到将 telnetd -a valid 更改为 telnetd -a user 将允许用户无需身份验证即可登录。如果他们不运行 kinit,如果您使用 telnet -a valid,他们甚至不会收到登录提示。请记住,由于密码存储在您的 KDC 上,请确保没有人闯入它;否则,他们将有权访问 KDC 授予访问权限的所有机器。了解术语 principal、realm、kdc 等——几乎您遇到的任何东西都会使用它们。
Cosimo Leipold (cleipold@kellogg.nwu.edu) 是西北大学的学生,除了学习 UNIX 之外,他没有什么更好的事情可做。他现在在 Kellogg 管理研究生院担任系统管理员。他和他的爱人 Chiara 住在一起,Chiara 说他是个呆子。