Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

11.2. 配置 Kerberos KDC

首先安装主 KDC,然后在设置主服务器后安装任何必要的次要服务器。
重要
不建议手动设置 Kerberos KDC。在 Red Hat Enterprise Linux 环境中引入 Kerberos 的建议方法是使用身份管理功能。

11.2.1. 配置主 KDC 服务器

重要
KDC 系统应为专用计算机。此计算机需要非常安全 - 如果可能,它不应运行 KDC 以外的任何服务。
  1. 为 KDC 安装所需的软件包:
    [root@server ~]# yum install krb5-server krb5-libs krb5-workstation
  2. 编辑 /etc/krb5.conf/var/kerberos/krb5kdc/kdc.conf 配置文件,以反映 realm 名称和 domain-to-realm 映射。例如:
    [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.COMexample.com 的实例替换为正确的域名来构建一个简单的域 - 务必使大写和小写名称保留正确的格式 - 并通过将 KDC 从 kerberos.example.com 更改为 Kerberos 服务器的名称。按照惯例,所有域名均为大写,所有 DNS 主机名和域名均为小写。这些配置文件的 man page 提供有关文件格式的完整详情。
  3. 使用 kdb5_util 实用程序创建数据库。
    [root@server ~]# kdb5_util create -s
    create 命令创建为 Kerberos 域存储密钥的数据库。-s 参数会创建一个存储主服务器密钥的 stash 文件。如果没有从中读取密钥的 stash 文件,则 Kerberos 服务器(krb5kdc)会提示用户输入 master 服务器密码(可用于重新生成密钥)。
  4. 编辑 /var/kerberos/krb5kdc/kadm5.acl 文件。kadmind 使用此文件来确定哪些主体对 Kerberos 数据库及其访问级别具有管理访问权限。例如:
    */admin@EXAMPLE.COM  *
    大多数用户在数据库中由一个主体(使用 NULL 或空实例,如 joe@EXAMPLE.COM)表示。在这个配置中,具有第二个主体的用户 例如 joe/admin@EXAMPLE.COM)可以全面控制域的 Kerberos 数据库。
    在服务器上启动 kadmind 后,任何用户都可以在域中的任何客户端或服务器上运行 kadmin 来访问其服务。但是,除了更改自己的密码外,只有 kadm5.acl 文件中列出的用户才能以任何方式修改数据库。
    注意
    kadmin 工具通过网络与 kadmind 服务器通信,并使用 Kerberos 处理身份验证。因此,第一个主体必须已经存在,然后才能通过网络连接到服务器来管理它。使用 kadmin.local 命令创建第一个主体,该命令专门设计为在与 KDC 相同的主机上使用,且不使用 Kerberos 进行身份验证。
  5. 在 KDC 终端中使用 kadmin.local 创建第一个主体:
    [root@server ~]# kadmin.local -q "addprinc username/admin"
  6. 使用以下命令启动 Kerberos:
    [root@server ~]# systemctl start krb5kdc.service
    [root@server ~]# systemctl start kadmin.service
  7. kadmin 中使用 addprinc 命令为用户添加主体。kadminkadmin.local 是 KDC 的命令行界面。因此,启动 kadmin 程序后,可以使用许多命令,如 addprinc -。如需更多信息,请参阅 kadmin 手册页。
  8. 验证 KDC 是否在签发票据。首先,运行 kinit 以获取 ticket 并将其存储在凭证缓存中。接下来,使用 klist 查看缓存中凭据列表,并使用 kdestroy 销毁缓存及其包含的凭证。
    注意
    默认情况下,kinit 会尝试使用相同的系统登录用户名(而不是 Kerberos 服务器)进行身份验证。如果该用户名与 Kerberos 数据库中的主体没有对应,则 kinit 会发出错误消息。如果发生这种情况,请在命令行中以正确的主体名称作为参数提供 kinit
    kinit principal

11.2.2. 设置第二个 KDC

当给定域有多个 KDC 时,一个 KDC ( 主 KDC)会保留 realm 数据库的可写副本并运行 kadmind。主 KDC 也是域的 管理服务器。其他辅助 KDC 保留数据库的只读副本,并运行 kpropd
主和从属传播过程要求主 KDC 将其数据库转储到临时转储文件中,然后将该文件传输到每个从卷,然后使用转储文件的内容覆盖之前收到的数据库只读副本。
设置二级 KDC:
  1. 为 KDC 安装所需的软件包:
    [root@slavekdc ~]# yum install krb5-server krb5-libs krb5-workstation
  2. 将主 KDC 的 krb5.confkdc.conf 文件复制到辅助 KDC 中。
  3. 从主 KDC 上的 root shell 启动 kadmin.local
    1. 使用 kadmin.local add_principal 命令为主 KDC 的主机服务创建新条目
      [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
    2. 使用 kadmin.local ktadd 命令为服务设置随机密钥,并将随机密钥存储在 master 的默认 keytab 文件中。
      注意
      kprop 命令使用此密钥向次要服务器进行身份验证。无论您安装多少次要 KDC 服务器,您只需执行此操作一次。
  4. 从辅助 KDC 上的 root shell 启动 kadmin
    1. 使用 kadmin.local add_principal 命令为辅助 KDC 的主机服务创建新条目
      [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
    2. 使用 kadmin.local ktadd 命令为服务设置随机密钥,并将随机密钥存储在次要 KDC 服务器的默认 keytab 文件中。在验证客户端时,kpropd 服务使用此密钥。
  5. 借助其服务密钥,次要 KDC 可以验证要与之连接的任何客户端。显然,并非所有潜在的客户端都应被允许为 kprop 服务提供新的 realm 数据库。要限制访问,二级 KDC 上的 kprop 服务将只接受来自 /var/kerberos/krb5kdc/kpropd.acl 中列出的主体名称的客户端。
    将主 KDC 主机服务的名称添加到该文件中。
    [root@slavekdc ~]# echo host/masterkdc.example.com@EXAMPLE.COM > /var/kerberos/krb5kdc/kpropd.acl
  6. 辅助 KDC 获取数据库的副本后,还需要用于加密的主密钥。如果 KDC 数据库的主密钥存储在主 KDC 上的 stash 文件中(通常称为 /var/kerberos/krb5kdc/.k5.REALM),则将其复制到辅助 KDC 中,或使用任何可用的安全方法将其复制到辅助 KDC 中,或者通过运行 kdb5_util create -s 并提供相同的密码。dummy 数据库将被第一次成功数据库传播覆盖。
  7. 确保辅助 KDC 的防火墙允许主 KDC 使用端口 754 (krb5_prop)上的 TCP 联系,并启动 kprop 服务。
  8. 验证 kadmin 服务 是否已禁用
  9. 通过将主 KDC 上的 realm 数据库转储到要读取的默认数据文件(/var/kerberos/krb5kdc/slave_datatrans)来执行手动数据库传播测试。
    [root@masterkdc ~]# kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
  10. 使用 kprop 命令将其内容传输到辅助 KDC。
    [root@masterkdc ~]# kprop slavekdc.example.com
  11. 使用 kinit,验证客户端系统是否能够从 KDC 正确获取初始凭证。
    客户端的 /etc/krb5.conf 应该只列出 KDC 列表中的辅助 KDC。
    [realms]
      EXAMPLE.COM = {
      kdc = slavekdc.example.com.:88
      admin_server = kdc.example.com
      default_domain = example.com
     }
  12. 创建一个转储 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
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 服务器:
  1. /etc/ipa/kdcproxy/kdcproxy.conf 文件中,将 [global] 部分中的 use_dns 参数设置为 false
    [global]
    use_dns = false
    
  2. 将代理域信息放在 /etc/ipa/kdcproxy/kdcproxy.conf 文件中。对于 [AD.EXAMPLE.COM] realm with proxy,例如:
    [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.confkdc.conf,其中某些选项可以多次指定。
  3. 重启 IdM 服务:
    # ipactl restart

例 11.2. 配置 KKDCP 服务器 II

这个示例服务器配置依赖于 DNS 服务记录来查找要与之通信的 AD 服务器。
  1. /etc/ipa/kdcproxy/kdcproxy.conf 文件中,使用 [global] 部分,将 use_dns 参数设置为 true
    [global]
    configs = mit
    use_dns = true
    
    configs 参数允许您载入其他配置模块。在这种情况下,配置是从 MIT libkrb5 库读取的。
  2. 可选: 如果您不想使用 DNS 服务记录,请将显式 AD 服务器添加到 /etc/krb5.conf 文件的 [realms] 部分。如果带有代理的域为:AD.EXAMPLE.COM,请添加:
    [realms]
    AD.EXAMPLE.COM = {
        kdc = ad-server.ad.example.com
        kpasswd_server = ad-server.ad.example.com
    }
    
  3. 重启 IdM 服务:
    # ipactl restart

KKDCP 客户端

客户端系统通过其 /etc/krb5.conf 文件指向 KDC 代理。按照以下步骤访问 AD 服务器。
  1. 在客户端上,打开 /etc/krb5.conf 文件,并将 AD 域的名称添加到 [realms] 部分:
    [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
    }
    
  2. 打开 /etc/sssd/sssd.conf 文件,并将 krb5_use_kdcinfo = False 行添加到您的 IdM 域部分:
    [domain/example.com]
    krb5_use_kdcinfo = False
    
  3. 重启 SSSD 服务:
    # systemctl restart sssd.service

其它资源