11.2. 配置 Kerberos KDC
首先安装主 KDC,然后在设置主服务器后安装任何必要的次要服务器。
重要
不建议手动设置 Kerberos KDC。在 Red Hat Enterprise Linux 环境中引入 Kerberos 的建议方法是使用身份管理功能。
11.2.1. 配置主 KDC 服务器
重要
KDC 系统应为专用计算机。此计算机需要非常安全 - 如果可能,它不应运行 KDC 以外的任何服务。
- 为 KDC 安装所需的软件包:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow yum install krb5-server krb5-libs krb5-workstation
[root@server ~]# yum install krb5-server krb5-libs krb5-workstation
- 编辑
/etc/krb5.conf
和/var/kerberos/krb5kdc/kdc.conf
配置文件,以反映 realm 名称和 domain-to-realm 映射。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = EXAMPLE.COM dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true allow_weak_crypto = true [realms] EXAMPLE.COM = { kdc = kdc.example.com.:88 admin_server = kdc.example.com default_domain = example.com } [domain_realm] .example.com = EXAMPLE.COM example.com = EXAMPLE.COM
[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = EXAMPLE.COM dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true allow_weak_crypto = true [realms] EXAMPLE.COM = { kdc = kdc.example.com.:88 admin_server = kdc.example.com default_domain = example.com } [domain_realm] .example.com = EXAMPLE.COM example.com = EXAMPLE.COM
可以通过将 EXAMPLE.COM 和 example.com 的实例替换为正确的域名来构建一个简单的域 - 务必使大写和小写名称保留正确的格式 - 并通过将 KDC 从 kerberos.example.com 更改为 Kerberos 服务器的名称。按照惯例,所有域名均为大写,所有 DNS 主机名和域名均为小写。这些配置文件的 man page 提供有关文件格式的完整详情。 - 使用 kdb5_util 实用程序创建数据库。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kdb5_util create -s
[root@server ~]# kdb5_util create -s
create 命令创建为 Kerberos 域存储密钥的数据库。-s 参数会创建一个存储主服务器密钥的 stash 文件。如果没有从中读取密钥的 stash 文件,则 Kerberos 服务器(krb5kdc)会提示用户输入 master 服务器密码(可用于重新生成密钥)。 - 编辑
/var/kerberos/krb5kdc/kadm5.acl
文件。kadmind 使用此文件来确定哪些主体对 Kerberos 数据库及其访问级别具有管理访问权限。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow */admin@EXAMPLE.COM *
*/admin@EXAMPLE.COM *
大多数用户在数据库中由一个主体(使用 NULL 或空实例,如 joe@EXAMPLE.COM)表示。在这个配置中,具有第二个主体的用户 ( 例如 joe/admin@EXAMPLE.COM)可以全面控制域的 Kerberos 数据库。在服务器上启动 kadmind 后,任何用户都可以在域中的任何客户端或服务器上运行 kadmin 来访问其服务。但是,除了更改自己的密码外,只有kadm5.acl
文件中列出的用户才能以任何方式修改数据库。注意kadmin 工具通过网络与 kadmind 服务器通信,并使用 Kerberos 处理身份验证。因此,第一个主体必须已经存在,然后才能通过网络连接到服务器来管理它。使用 kadmin.local 命令创建第一个主体,该命令专门设计为在与 KDC 相同的主机上使用,且不使用 Kerberos 进行身份验证。 - 在 KDC 终端中使用 kadmin.local 创建第一个主体:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kadmin.local -q "addprinc username/admin"
[root@server ~]# kadmin.local -q "addprinc username/admin"
- 使用以下命令启动 Kerberos:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl start krb5kdc.service systemctl start kadmin.service
[root@server ~]# systemctl start krb5kdc.service [root@server ~]# systemctl start kadmin.service
- 在 kadmin 中使用 addprinc 命令为用户添加主体。kadmin 和 kadmin.local 是 KDC 的命令行界面。因此,启动 kadmin 程序后,可以使用许多命令,如 addprinc -。如需更多信息,请参阅 kadmin 手册页。
- 验证 KDC 是否在签发票据。首先,运行 kinit 以获取 ticket 并将其存储在凭证缓存中。接下来,使用 klist 查看缓存中凭据列表,并使用 kdestroy 销毁缓存及其包含的凭证。注意默认情况下,kinit 会尝试使用相同的系统登录用户名(而不是 Kerberos 服务器)进行身份验证。如果该用户名与 Kerberos 数据库中的主体没有对应,则 kinit 会发出错误消息。如果发生这种情况,请在命令行中以正确的主体名称作为参数提供 kinit :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kinit principal
kinit principal
11.2.2. 设置第二个 KDC
当给定域有多个 KDC 时,一个 KDC ( 主 KDC)会保留 realm 数据库的可写副本并运行 kadmind。主 KDC 也是域的 管理服务器。其他辅助 KDC 保留数据库的只读副本,并运行 kpropd。
主和从属传播过程要求主 KDC 将其数据库转储到临时转储文件中,然后将该文件传输到每个从卷,然后使用转储文件的内容覆盖之前收到的数据库只读副本。
设置二级 KDC:
- 为 KDC 安装所需的软件包:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow yum install krb5-server krb5-libs krb5-workstation
[root@slavekdc ~]# yum install krb5-server krb5-libs krb5-workstation
- 将主 KDC 的
krb5.conf
和kdc.conf
文件复制到辅助 KDC 中。 - 从主 KDC 上的 root shell 启动 kadmin.local。
- 使用 kadmin.local add_principal 命令为主 KDC 的主机服务创建新条目。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kadmin.local -r EXAMPLE.COM
[root@masterkdc ~]# kadmin.local -r EXAMPLE.COM Authenticating as principal root/admin@EXAMPLE.COM with password. kadmin: add_principal -randkey host/masterkdc.example.com Principal "host/masterkdc.example.com@EXAMPLE.COM" created. kadmin: ktadd host/masterkdc.example.com Entry for principal host/masterkdc.example.com with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/masterkdc.example.com with kvno 3, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/masterkdc.example.com with kvno 3, encryption type DES with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/masterkdc.example.com with kvno 3, encryption type DES cbc mode with RSA-MD5 added to keytab WRFILE:/etc/krb5.keytab. kadmin: quit
- 使用 kadmin.local ktadd 命令为服务设置随机密钥,并将随机密钥存储在 master 的默认 keytab 文件中。注意kprop 命令使用此密钥向次要服务器进行身份验证。无论您安装多少次要 KDC 服务器,您只需执行此操作一次。
- 从辅助 KDC 上的 root shell 启动 kadmin。
- 使用 kadmin.local add_principal 命令为辅助 KDC 的主机服务创建新条目。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kadmin -p jsmith/admin@EXAMPLE.COM -r EXAMPLE.COM
[root@slavekdc ~]# kadmin -p jsmith/admin@EXAMPLE.COM -r EXAMPLE.COM Authenticating as principal jsmith/admin@EXAMPLE.COM with password. Password for jsmith/admin@EXAMPLE.COM: kadmin: add_principal -randkey host/slavekdc.example.com Principal "host/slavekdc.example.com@EXAMPLE.COM" created. kadmin: ktadd host/slavekdc.example.com@EXAMPLE.COM Entry for principal host/slavekdc.example.com with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/slavekdc.example.com with kvno 3, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/slavekdc.example.com with kvno 3, encryption type DES with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/slavekdc.example.com with kvno 3, encryption type DES cbc mode with RSA-MD5 added to keytab WRFILE:/etc/krb5.keytab. kadmin: quit
- 使用 kadmin.local ktadd 命令为服务设置随机密钥,并将随机密钥存储在次要 KDC 服务器的默认 keytab 文件中。在验证客户端时,kpropd 服务使用此密钥。
- 借助其服务密钥,次要 KDC 可以验证要与之连接的任何客户端。显然,并非所有潜在的客户端都应被允许为 kprop 服务提供新的 realm 数据库。要限制访问,二级 KDC 上的 kprop 服务将只接受来自
/var/kerberos/krb5kdc/kpropd.acl
中列出的主体名称的客户端。将主 KDC 主机服务的名称添加到该文件中。Copy to Clipboard Copied! Toggle word wrap Toggle overflow echo host/masterkdc.example.com@EXAMPLE.COM > /var/kerberos/krb5kdc/kpropd.acl
[root@slavekdc ~]# echo host/masterkdc.example.com@EXAMPLE.COM > /var/kerberos/krb5kdc/kpropd.acl
- 辅助 KDC 获取数据库的副本后,还需要用于加密的主密钥。如果 KDC 数据库的主密钥存储在主 KDC 上的 stash 文件中(通常称为
/var/kerberos/krb5kdc/.k5.REALM
),则将其复制到辅助 KDC 中,或使用任何可用的安全方法将其复制到辅助 KDC 中,或者通过运行 kdb5_util create -s 并提供相同的密码。dummy 数据库将被第一次成功数据库传播覆盖。 - 确保辅助 KDC 的防火墙允许主 KDC 使用端口 754 (krb5_prop)上的 TCP 联系,并启动 kprop 服务。
- 验证 kadmin 服务 是否已禁用。
- 通过将主 KDC 上的 realm 数据库转储到要读取的默认数据文件(
/var/kerberos/krb5kdc/slave_datatrans
)来执行手动数据库传播测试。Copy to Clipboard Copied! Toggle word wrap Toggle overflow kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
[root@masterkdc ~]# kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
- 使用 kprop 命令将其内容传输到辅助 KDC。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kprop slavekdc.example.com
[root@masterkdc ~]# kprop slavekdc.example.com
- 使用 kinit,验证客户端系统是否能够从 KDC 正确获取初始凭证。客户端的
/etc/krb5.conf
应该只列出 KDC 列表中的辅助 KDC。Copy to Clipboard Copied! Toggle word wrap Toggle overflow [realms] EXAMPLE.COM = { kdc = slavekdc.example.com.:88 admin_server = kdc.example.com default_domain = example.com }
[realms] EXAMPLE.COM = { kdc = slavekdc.example.com.:88 admin_server = kdc.example.com default_domain = example.com }
- 创建一个转储 realm 数据库的脚本,并运行 kprop 命令将数据库传送到每个辅助 KDC 中,并将 cron 服务配置为定期运行脚本。
11.2.3. Kerberos 密钥分发中心代理
有些管理员可能选择使其部署无法访问默认的 Kerberos 端口。要允许用户、主机和服务获取 Kerberos 凭据,您可以使用 HTTPS 服务作为通过
HTTPS
端口 443 与 Kerberos 通信的代理。
在 Identity Management(IdM)中,Kerberos 密钥分发中心代理 (KKDCP)提供此功能。
KKDCP 服务器
在 IdM 服务器上,KKDCP 默认启用。如果目录中存在属性和值对 ipaConfigString=kdcProxyEnabled,则 KKDCP 每次启动时会自动启用。在这种情况下,会创建符号链接
/etc/httpd/conf.d/ipa-kdc-proxy.conf
。因此,您可以通过检查是否存在符号链接来验证在 IdM 服务器中是否启用了 KKDCP。
ls -l /etc/httpd/conf.d/ipa-kdc-proxy.conf
$ ls -l /etc/httpd/conf.d/ipa-kdc-proxy.conf
lrwxrwxrwx. 1 root root 36 Aug 15 09:37 /etc/httpd/conf.d/ipa-kdc-proxy.conf -> /etc/ipa/kdcproxy/ipa-kdc-proxy.conf
更多详情请见以下示例服务器配置。
例 11.1. 配置 KKDCP 服务器 I
使用以下示例配置,您可以启用 TCP 作为 IdM KKDCP 和 Active Directory 域之间的传输协议,其中使用多个 Kerberos 服务器:
- 在
/etc/ipa/kdcproxy/kdcproxy.conf
文件中,将 [global] 部分中的use_dns
参数设置为 false :Copy to Clipboard Copied! Toggle word wrap Toggle overflow [global] use_dns = false
[global] use_dns = false
- 将代理域信息放在
/etc/ipa/kdcproxy/kdcproxy.conf
文件中。对于 [AD.EXAMPLE.COM] realm with proxy,例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow [AD.EXAMPLE.COM] kerberos = kerberos+tcp://1.2.3.4:88 kerberos+tcp://5.6.7.8:88 kpasswd = kpasswd+tcp://1.2.3.4:464 kpasswd+tcp://5.6.7.8:464
[AD.EXAMPLE.COM] kerberos = kerberos+tcp://1.2.3.4:88 kerberos+tcp://5.6.7.8:88 kpasswd = kpasswd+tcp://1.2.3.4:464 kpasswd+tcp://5.6.7.8:464
重要realm 配置参数必须列出由空格分隔的多个服务器,而不是/etc/krb5.conf
和kdc.conf
,其中某些选项可以多次指定。 - 重启 IdM 服务:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ipactl restart
# ipactl restart
例 11.2. 配置 KKDCP 服务器 II
这个示例服务器配置依赖于 DNS 服务记录来查找要与之通信的 AD 服务器。
- 在
/etc/ipa/kdcproxy/kdcproxy.conf
文件中,使用 [global] 部分,将use_dns
参数设置为 true :Copy to Clipboard Copied! Toggle word wrap Toggle overflow [global] configs = mit use_dns = true
[global] configs = mit use_dns = true
configs
参数允许您载入其他配置模块。在这种情况下,配置是从 MITlibkrb5
库读取的。 - 可选: 如果您不想使用 DNS 服务记录,请将显式 AD 服务器添加到
/etc/krb5.conf
文件的 [realms] 部分。如果带有代理的域为:AD.EXAMPLE.COM,请添加:Copy to Clipboard Copied! Toggle word wrap Toggle overflow [realms] AD.EXAMPLE.COM = { kdc = ad-server.ad.example.com kpasswd_server = ad-server.ad.example.com }
[realms] AD.EXAMPLE.COM = { kdc = ad-server.ad.example.com kpasswd_server = ad-server.ad.example.com }
- 重启 IdM 服务:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ipactl restart
# ipactl restart
KKDCP 客户端
客户端系统通过其
/etc/krb5.conf
文件指向 KDC 代理。按照以下步骤访问 AD 服务器。
- 在客户端上,打开
/etc/krb5.conf
文件,并将 AD 域的名称添加到 [realms] 部分:Copy to Clipboard Copied! Toggle word wrap Toggle overflow [realms] AD.EXAMPLE.COM { kdc = https://ipa-server.example.com/KdcProxy kdc = https://ipa-server2.example.com/KdcProxy kpasswd_server = https://ipa-server.example.com/KdcProxy kpasswd_server = https://ipa-server2.example.com/KdcProxy }
[realms] AD.EXAMPLE.COM { kdc = https://ipa-server.example.com/KdcProxy kdc = https://ipa-server2.example.com/KdcProxy kpasswd_server = https://ipa-server.example.com/KdcProxy kpasswd_server = https://ipa-server2.example.com/KdcProxy }
- 打开
/etc/sssd/sssd.conf
文件,并将 krb5_use_kdcinfo = False 行添加到您的 IdM 域部分:Copy to Clipboard Copied! Toggle word wrap Toggle overflow [domain/example.com] krb5_use_kdcinfo = False
[domain/example.com] krb5_use_kdcinfo = False
- 重启
SSSD
服务:Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl restart sssd.service
# systemctl restart sssd.service
其它资源
- 有关为 Active Directory 域配置 KKDCP 的详情,请参阅在红帽知识库 中将 IPA 服务器配置为用于 AD Kerberos 通信的 KDC 代理。