跳过导航链接 | |
退出打印视图 | |
系统管理指南:安全性服务 Oracle Solaris 10 8/11 Information Library (简体中文) |
19. 使用 Oracle Solaris 安全 Shell(任务)
20. Oracle Solaris 安全 Shell(参考)
如何使用多种 Kerberos 安全模式设置安全的 NFS 环境
如何禁用票证授予票证 (Ticket Granting Ticket, TGT) 的验证
如何以 root 用户身份访问受 Kerberos 保护的 NFS 文件系统
Kerberos 数据库是 Kerberos 的主干,必须正确维护。本节介绍有关如何管理 Kerberos 数据库的一些过程,例如备份和恢复数据库、设置增量或并行传播以及管理存储文件。如何手动配置主 KDC 服务器中介绍了该数据库的初始设置步骤。
将 Kerberos 数据库从主 KDC 服务器传播到从 KDC 服务器是最重要的配置任务之一。如果传播发生频率不够高,主 KDC 服务器与从 KDC 服务器将无法保持同步。因此,如果主 KDC 服务器关闭,从 KDC 服务器将不能获取最新的数据库信息。此外,如果出于负载平衡目的将从 KDC 服务器配置为主 KDC 服务器,则将该从 KDC 服务器用作主 KDC 服务器的客户机将不能获取最新的信息。所以,必须确保传播发生频率足够高,或者基于更改 Kerberos 数据库的频率配置服务器以进行增量传播。增量传播优先于手动传播,因为手动传播数据库时需要更多的管理开销。此外,执行完全数据库传播时效率也较低。
配置主 KDC 服务器时,可以在 cron 作业中设置 kprop_script 命令以自动将 Kerberos 数据库备份到 /var/krb5/slave_datatrans 转储文件,并将该数据库传播到从 KDC 服务器。不过,与其他任何文件一样,Kerberos 数据库可能会受损。如果在从 KDC 服务器上发生数据受损,您可能不会注意到,因为下一次数据库自动传播会安装一个全新的副本。但是,如果在主 KDC 服务器上发生数据受损,则在下一次传播期间会将损坏的数据库传播到所有从 KDC 服务器。而且,损坏的备份会覆盖主 KDC 服务器上先前未损坏的备份文件。
由于在这种情况下不存在任何“安全”的备份副本,因此还应设置 cron 作业,以便定期将 slave_datatrans 转储文件复制到其他位置,或者使用 kdb5_util 的 dump 命令创建另一个单独的备份副本。这样,即使数据库受损,也可以使用 kdb5_util 的 load 命令在主 KDC 服务器上恢复最新的备份。
另一个重要注意事项是:数据库转储文件包含主体密钥,因此需要防止未经授权的用户访问该文件。缺省情况下,只有 root 身份才具有读写数据库转储文件的权限。要防止未经授权的访问,请仅使用 kprop 命令传播数据库转储文件,该命令会对传送中的数据进行加密。此外,kprop 命令仅将数据传播到从 KDC 服务器,这可以最大程度地降低将数据库转储文件意外发送到未经授权的主机的几率。
注意 - 如果传播 Kerberos 数据库之后对其进行了更新,而在下一次传播之前该数据库受损,则从 KDC 服务器将不包含这些更新。这些更新将会丢失。因此,如果在计划的定期传播之前向 Kerberos 数据库添加了重要的更新,应手动传播该数据库,以避免数据丢失。 |
从 KDC 服务器上的 kpropd.acl 文件提供主机主体名称的列表(每个名称占一行),用于指定该 KDC 可以通过传播从其接收更新数据库的系统。如果使用主 KDC 服务器传播到所有从 KDC 服务器,则每个从 KDC 服务器上的 kpropd.acl 文件仅需包含主 KDC 服务器的主机主体名称。
但是,本书中的 Kerberos 安装和后续配置步骤将引导您将同一个 kpropd.acl 文件添加到主 KDC 服务器和从 KDC 服务器。该文件包含所有 KDC 主机主体名称。通过此配置,在传播端 KDC 临时不可用时,可以从任何 KDC 进行传播。而且,通过在所有 KDC 上保留相同副本,可以轻松地维护配置。
kprop_script 命令使用 kprop 命令将 Kerberos 数据库传播到其他 KDC。如果在从 KDC 服务器上运行 kprop_script 命令,则会将该从 KDC 服务器的 Kerberos 数据库副本传播到其他 KDC。kprop_script 接受主机名列表作为参数,该列表以空格分隔,表示要传播的 KDC。
运行 kprop_script 时,将在 /var/krb5/slave_datatrans 文件中创建 Kerberos 数据库的备份,并将该文件复制到指定的 KDC。在完成传播之前,Kerberos 数据库处于锁定状态。
# /usr/sbin/kdb5_util dump [-verbose] [-d dbname] [filename [principals...]]
显示要备份的每个主体和策略的名称。
定义要备份的数据库的名称。请注意,可以指定文件的绝对路径。如果未指定 -d 选项,则缺省数据库名称为 /var/krb5/principal。
定义用于备份数据库的文件。可以指定该文件的绝对路径。如果未指定文件,数据库将转储到标准输出。
定义要备份的一个或多个主体的列表(以空格分隔)。必须使用全限定主体名称。如果未指定任何主体,则将备份整个数据库。
示例 23-12 备份 Kerberos 数据库
在以下示例中,Kerberos 数据库将备份到名为 dumpfile 的文件。由于指定了 -verbose 选项,备份时会显示每个主体。
# kdb5_util dump -verbose dumpfile kadmin/kdc1.eng.example.com@ENG.EXAMPLE.COM krbtgt/ENG.EXAMPLE.COM@ENG.EXAMPLE.COM kadmin/history@ENG.EXAMPLE.COM pak/admin@ENG.EXAMPLE.COM pak@ENG.EXAMPLE.COM changepw/kdc1.eng.example.com@ENG.EXAMPLE.COM
在以下示例中,将备份 Kerberos 数据库中的 pak 和 pak/admin 主体。
# kdb5_util dump -verbose dumpfile pak/admin@ENG.EXAMPLE.COM pak@ENG.EXAMPLE.COM pak/admin@ENG.EXAMPLE.COM pak@ENG.EXAMPLE.COM
kdc1 # svcadm disable network/security/krb5kdc kdc1 # svcadm disable network/security/kadmin
# /usr/sbin/kdb5_util load [-verbose] [-d dbname] [-update] [filename]
显示要恢复的每个主体和策略的名称。
定义要恢复的数据库的名称。请注意,可以指定文件的绝对路径。如果未指定 -d 选项,则缺省数据库名称为 /var/krb5/principal。
更新现有数据库。否则,会创建新数据库或覆盖现有数据库。
定义用于恢复数据库的文件。可以指定该文件的绝对路径。
kdc1 # svcadm enable -r network/security/krb5kdc kdc1 # svcadm enable -r network/security/kadmin
示例 23-13 恢复 Kerberos 数据库
在以下示例中,将从 dumpfile 文件将名为 database1 的数据库恢复到当前目录。由于未指定 -update 选项,恢复操作将创建一个新数据库。
# kdb5_util load -d database1 dumpfile
如果您的 KDC 数据库是在运行 Solaris 8 或 Solaris 9 发行版的服务器上创建的,转换该数据库可允许您利用改进的数据库格式。
开始之前
确保数据库使用的是旧格式。
kdc1 # svcadm disable network/security/krb5kdc kdc1 # svcadm disable network/security/kadmin
kdc1 # mkdir /var/krb5/tmp kdc1 # chmod 700 /var/krb5/tmp
kdc1 # kdb5_util dump /var/krb5/tmp/prdb.txt
kdc1 # cd /var/krb5 kdc1 # mv princ* tmp/
kdc1 # kdb5_util load /var/krb5/tmp/prdb.txt
kdc1 # svcadm enable -r network/security/krb5kdc kdc1 # svcadm enable -r network/security/kadmin
此过程中的步骤可用于重新配置现有的主 KDC 服务器,以使用增量传播。此过程中使用以下配置参数:
领域名称 = EXAMPLE.COM
DNS 域名 = example.com
主 KDC = kdc1.example.com
从 KDC = kdc2.example.com
admin 主体 = kws/admin
需要启用增量传播,并选择主 KDC 服务器在日志中记录的更新的数目。有关更多信息,请参见 kdc.conf(4) 手册页。
kdc1 # cat /etc/krb5/kdc.conf [kdcdefaults] kdc_ports = 88,750 [realms] EXAMPLE.COM= { profile = /etc/krb5/krb5.conf database_name = /var/krb5/principal admin_keytab = /etc/krb5/kadm5.keytab acl_file = /etc/krb5/kadm5.acl kadmind_port = 749 max_life = 8h 0m 0s max_renewable_life = 7d 0h 0m 0s sunw_dbprop_enable = true sunw_dbprop_master_ulogsize = 1000 }
kiprop 主体用于验证主 KDC 服务器以及授权来自主 KDC 服务器的更新。
kdc1 # /usr/sbin/kadmin -p kws/admin Enter password: <Type kws/admin password> kadmin: addprinc -randkey kiprop/kdc1.example.com Principal "kiprop/kdc1.example.com@EXAMPLE.COM" created. kadmin: addprinc -randkey kiprop/kdc2.example.com Principal "kiprop/kdc2.example.com@EXAMPLE.COM" created. kadmin:
通过将 kiprop 主体添加到 kadm5.keytab 文件中,允许 kadmind 命令在启动时对自身进行验证。
kadmin: ktadd -k /etc/krb5/kadm5.keytab kiprop/kdc1.example.com Entry for principal kiprop/kdc1.example.com with kvno 3, encryption type AES-256 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/etc/krb5/kadm5.keytab. Entry for principal kiprop/kdc1.example.com with kvno 3, encryption type AES-128 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/etc/krb5/kadm5.keytab. Entry for principal kiprop/kdc1.example.com with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5/kadm5.keytab. Entry for principal kiprop/kdc1.example.com with kvno 3, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5/kadm5.keytab. Entry for principal kiprop/kdc1.example.com with kvno 3, encryption type DES cbc mode with RSA-MD5 added to keytab WRFILE:/etc/krb5/kadm5.keytab. kadmin: quit
通过此项,主 KDC 服务器可以接收来自 kdc2 服务器的增量传播请求。
kdc1 # cat /etc/krb5/kadm5.acl */admin@EXAMPLE.COM * kiprop/kdc2.example.com@EXAMPLE.COM p
此步骤禁止从 KDC 服务器传播其 KDC 数据库副本。
kdc1 # crontab -e #ident "@(#)root 1.20 01/11/06 SMI" # # The root crontab should be used to perform accounting data collection. # # The rtc command is run to adjust the real time clock if and when # daylight savings time changes. # 10 3 * * * /usr/sbin/logadm 15 3 * * 0 /usr/lib/fs/nfs/nfsfind 1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1 30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean #10 3 * * * /usr/lib/krb5kprop_script kdc2.example.sun.com #SUNWkr5ma
kdc1 # svcadm restart network/security/kadmin
有关完整说明,请参见如何重新配置从 KDC 服务器以使用增量传播。
这些新项启用增量传播并将轮询时间设置为 2 分钟。
kdc2 # cat /etc/krb5/krb5.conf [kdcdefaults] kdc_ports = 88,750 [realms] EXAMPLE.COM= { profile = /etc/krb5/krb5.conf database_name = /var/krb5/principal admin_keytab = /etc/krb5/kadm5.keytab acl_file = /etc/krb5/kadm5.acl kadmind_port = 749 max_life = 8h 0m 0s max_renewable_life = 7d 0h 0m 0s sunw_dbprop_enable = true sunw_dbprop_slave_poll = 2m }
kdc2 # /usr/sbin/kadmin -p kws/admin Enter password: <Type kws/admin password> kadmin: ktadd kiprop/kdc2.example.com Entry for principal kiprop/kdc2.example.com with kvno 3, encryption type AES-256 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/etc/krb5/krb5.keytab. Entry for principal kiprop/kdc2.example.com with kvno 3, encryption type AES-128 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/etc/krb5/krb5.keytab. Entry for principal kiprop/kdc2.example.com with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5/krb5.keytab. Entry for principal kiprop/kdc2.example.com with kvno 3, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5/krb5.keytab. Entry for principal kiprop/kdc2.example.com with kvno 3, encryption type DES cbc mode with RSA-MD5 added to keytab WRFILE:/etc/krb5/krb5.keytab. kadmin: quit
kdc2 # svcadm disable network/security/krb5_prop
kdc2 # svcadm restart network/security/krb5kdc
此过程说明如何重新配置运行 Solaris 10 发行版的从 KDC 服务器,以使用完全传播。通常,只有当主 KDC 服务器运行 Solaris 9 发行版或更早发行版时才需要使用此过程。在这种情况下,主 KDC 服务器不支持增量传播,因此需要配置从 KDC 服务器以允许进行传播。
在此过程中,将配置名为 kdc3 的从 KDC 服务器。此过程使用以下配置参数:
领域名称 =EXAMPLE.COM
DNS 域名 = example.com
主 KDC = kdc1.example.com
从 KDC = kdc2.example.com 和 kdc3.example.com
admin 主体 = kws/admin
联机帮助 URL = http://denver:8888/ab2/coll.384.1/SEAM/@AB2PageView/6956
开始之前
必须配置主 KDC 服务器。要了解交换从 KDC 服务器的具体说明,请参见交换主 KDC 服务器与从 KDC 服务器。
必须使用在配置主 KDC 服务器时创建的一个 admin 主体名称登录。
kdc1 # /usr/sbin/kadmin -p kws/admin Enter password: <Type kws/admin password> kadmin:
需要为每个从 KDC 服务器添加一个项。有关该文件的完整说明,请参见 krb5.conf(4) 手册页。
kdc1 # cat /etc/krb5/krb5.conf . . [realms] EXAMPLE.COM = { kdc = kdc1.example.com kdc = kdc2.example.com kdc = kdc3.example.com admin_server = kdc1.example.com }
有关此文件的完整说明,请参见 kprop(1M) 手册页。
kdc1 # cat /etc/krb5/kpropd.acl host/kdc1.example.com@EXAMPLE.COM host/kdc2.example.com@EXAMPLE.COM host/kdc3.example.com@EXAMPLE.COM
需要在所有的从 KDC 服务器上执行该步骤,因为主 KDC 服务器已经更新了每个 KDC 服务器需要的信息。可以使用 ftp 或类似的传输机制从主 KDC 服务器获取以下文件的副本:
/etc/krb5/krb5.conf
/etc/krb5/kdc.conf
/etc/krb5/kpropd.acl
未修改的 kadm5.acl 文件类似如下示例:
kdc2 # cat /etc/krb5/kadm5.acl */admin@___default_realm___ *
如果该文件中包含 kiprop 项,请将其删除。
必须使用在配置主 KDC 服务器时创建的一个 admin 主体名称登录。
kdc2 # /usr/sbin/kadmin -p kws/admin Enter password: <Type kws/admin password> kadmin:
该项可使 kprop 及其他基于 Kerberos 的应用程序正常工作。请注意,当主体实例为主机名时,无论 /etc/resolv.conf 文件中的域名是大写还是小写,都必须以小写字母指定 FQDN。
kadmin: ktadd host/kdc3.example.com Entry for principal host/kdc3.example.com with kvno 3, encryption type AES-256 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/etc/krb5/krb5.keytab. Entry for principal host/kdc3.example.com with kvno 3, encryption type AES-128 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/etc/krb5/krb5.keytab. Entry for principal host/kdc3.example.com with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5/krb5.keytab. Entry for principal host/kdc3.example.com with kvno 3, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5/krb5.keytab. Entry for principal host/kdc3.example.com with kvno 3, encryption type DES cbc mode with RSA-MD5 added to keytab WRFILE:/etc/krb5/krb5.keytab. kadmin:
kadmin: quit
在 kprop_script 行的末尾添加每个从 KDC 服务器的名称。
10 3 * * * /usr/lib/krb5/kprop_script kdc2.example.com kdc3.example.com
您可能还希望更改备份的时间。此项将在每天的凌晨 3:10 启动备份过程。
kdc3 # svcadm enable network/security/krb5_prop
如果已存在数据库的备份副本,则不必完成其他备份。有关进一步的说明,请参见如何手动将 Kerberos 数据库传播到从 KDC 服务器。
kdc1 # /usr/lib/krb5/kprop_script kdc3.example.com Database propagation to kdc3.example.com: SUCCEEDED
kdc3 # /usr/sbin/kdb5_util stash kdb5_util: Cannot find/read stored master key while reading master key kdb5_util: Warning: proceeding without master key Enter KDC database master key: <Type the key>
安装和使用网络时间协议 (Network Time Protocol, NTP) 并非必须的。但是,要成功进行验证,每个时钟必须遵守 krb5.conf 文件的 libdefaults 部分中定义的缺省时间。有关 NTP 的信息,请参见同步 KDC 与 Kerberos 客户机的时钟。
kdc3 # svcadm enable network/security/krb5kdc
如果配置了增量传播,则此过程可确保已更新从 KDC 服务器上的信息。
kdc1 # /usr/sbin/kproplog -h
kdc2 # /usr/sbin/kproplog -h
示例 23-14 检验 KDC 服务器是否同步
以下是在主 KDC 服务器上运行 kproplog 命令的结果样例。
kdc1 # /usr/sbin/kproplog -h Kerberos update log (/var/krb5/principal.ulog) Update log dump: Log version #: 1 Log state: Stable Entry block size: 2048 Number of entries: 2500 First serial #: 137966 Last serial #: 140465 First time stamp: Fri Nov 28 00:59:27 2004 Last time stamp: Fri Nov 28 01:06:13 2004
以下是在从 KDC 服务器上运行 kproplog 命令的结果样例。
kdc2 # /usr/sbin/kproplog -h Kerberos update log (/var/krb5/principal.ulog) Update log dump: Log version #: 1 Log state: Stable Entry block size: 2048 Number of entries: 0 First serial #: None Last serial #: 140465 First time stamp: None Last time stamp: Fri Nov 28 01:06:13 2004
请注意,最后一个序列号和最后一个时间戳的值相同,表示从 KDC 服务器与主 KDC 服务器同步。
在从 KDC 服务器的输出中,可以注意到从 KDC 服务器的更新日志中不存在任何更新项。这是因为与主 KDC 服务器不同,从 KDC 服务器不保留更新。此外,由于第一个序列号或第一个时间戳不是相关信息,因此从 KDC 服务器也不包括这些信息。
此过程说明如何使用 kprop 命令传播 Kerberos 数据库。如果需要在定期的 cron 作业之外将从 KDC 服务器与主 KDC 服务器同步,可使用此过程。与 kprop_script 不同,可以使用 kprop 仅传播当前数据库备份,而无需先创建 Kerberos 数据库的新备份。
注 - 如果使用的是增量传播,则不要使用此过程。
# /usr/sbin/kdb5_util dump /var/krb5/slave_datatrans
# /usr/lib/krb5/kprop -f /var/krb5/slave_datatrans slave-KDC
示例 23-15 使用 kprop_script 手动将 Kerberos 数据库传播到从 KDC 服务器
如果要备份数据库,并在定期的 cron 作业之外将该数据库传播到从 KDC 服务器,还可以按如下所示使用 kprop_script 命令:
# /usr/lib/krb5/kprop_script slave-KDC
大多数情况下,会以独占的方式使用主 KDC 服务器将其 Kerberos 数据库传播到从 KDC 服务器。但是,如果站点上有很多从 KDC 服务器,可以考虑分担传播过程的负荷,称为并行传播。
注 - 如果使用的是增量传播,则不要使用此过程。
通过并行传播,特定的从 KDC 服务器可以与主 KDC 服务器分担传播工作负荷。通过这种分担,可以更快地完成传播并减轻主 KDC 服务器的工作负荷。
例如,假设站点上有一个主 KDC 服务器和六个从 KDC 服务器(如图 23-2 所示),其中,slave-1 到 slave-3 组成一个逻辑组,slave-4 到 slave-6 组成另一个逻辑组。要设置并行传播,可以使主 KDC 服务器将数据库传播到 slave-1 和 slave-4。然后,这些从 KDC 服务器又可将该数据库传播到自己组中的其他从 KDC 服务器。
图 23-2 并行传播配置示例
以下不是详细的逐步过程,而是用于启用并行传播的配置步骤的概要列表。这些步骤包括:
在主 KDC 服务器上,更改其 cron 作业中的 kprop_script 项,以仅包括将执行后续传播的从 KDC 服务器(从 KDC 传播服务器)的参数。
在每个从 KDC 传播服务器上,将 kprop_script 项添加到其 cron 作业中,其中必须包括要传播的从 KDC 服务器的参数。要成功实现并行传播,应设置 cron 作业,使其在将新 Kerberos 数据库传播到从 KDC 传播服务器本身之后再运行。
注 - 向从 KDC 传播服务器进行传播所需的时间取决于多种因素,例如网络带宽和 Kerberos 数据库的大小。
在每个从 KDC 服务器上,设置适当的传播权限。通过将传播端 KDC 的主机主体名称添加到其 kpropd.acl 文件中,可完成此步骤。
示例 23-16 设置并行传播
以图 23-2 为例,主 KDC 服务器的 kprop_script 项与以下示例类似:
0 3 * * * /usr/lib/krb5/kprop_script slave-1.example.com slave-4.example.com
slave-1 的 kprop_script 项类似于以下示例:
0 4 * * * /usr/lib/krb5/kprop_script slave-2.example.com slave-3.example.com
请注意,从 KDC 服务器上的传播在主 KDC 服务器将数据库传播到它一小时后开始。
从 KDC 传播服务器上的 kpropd.acl 文件将包含以下项:
host/master.example.com@EXAMPLE.COM
要从 slave-1 传播到的从 KDC 服务器上的 kpropd.acl 文件将包含以下项:
host/slave-1.example.com@EXAMPLE.COM
存储文件包含 Kerberos 数据库的主密钥,该密钥在创建 Kerberos 数据库时自动创建。如果存储文件损坏,可以使用 kdb5_util 实用程序的 stash 命令替换损坏的文件。仅在使用 kdb5_util 的 destroy 命令删除 Kerberos 数据库后,才需要删除存储文件。由于存储文件不会自动随数据库一起删除,所以您必须手动删除存储文件以完成清除。