在 MIT Kerberos 和 Active Directory 之间设置跨领域信任时“KDC 不支持加密类型”

Eli*_*son 5 active-directory kerberos nfs4 pam-krb

我目前正在设置一个环境,其中我有一组 Solaris 和 Linux 机器,使用专用的 Krberos 5 领域(MIT,在 Solaris 11 上,krb5-config --version返回:)Solaris Kerberos (based on MIT Kerberos 5 release 1.6.3)。我们还有一个用于单独领域的 Active Directory (Windows 2003) 服务器。

我的目标是让 AD 服务器中的所有用户,以及基于 MIT 的领域中的 host/nnn、nfs/nnn 和 cifs/nnn 主体。我正在尝试在这两个领域之间建立跨域信任。

假设如下:

  • Unix 领域:EXAMPLE.COM
  • AD领域:AD.EXAMPLE.COM

我已经根据Microsoft 文档设置了 AD 跨领域信任,具有双向信任。

发生的情况是跨领域身份验证仅在一个方向上起作用。从 AD 到 Unix 的工作原理:

# kinit adtest@AD.EXAMPLE.COM
Password for adtest@AD.EXAMPLE.COM: 
root@clienttest2:~# kvno ltest@EXAMPLE.COM
ltest@EXAMPLE.COM: kvno = 1
Run Code Online (Sandbox Code Playgroud)

但是,相反的情况并没有,并给我一条错误消息:KDC 在获取 adtest@AD.EXAMPLE.COM 的凭据时不支持加密类型

# kinit ltest@EXAMPLE.COM
Password for ltest@EXAMPLE.COM: 
root@clienttest2:~# kvno adtest@AD.EXAMPLE.COM
kvno: KDC has no support for encryption type while getting credentials for adtest@AD.EXAMPLE.COM
Run Code Online (Sandbox Code Playgroud)

请注意,我尝试了各种不同的东西。其中一些是:

  • 将 Unix 端的跨域密钥配置为rc4-hmac仅使用,导致调用kvno甚至无法在 Microsoft 端找到 KDC。
  • 添加default_tkt_enctypesdefault_tgs_enctypes条目以强制使用rc4-hmac. 这对于获得针对 AD 的登录身份验证是必要的。

造成这种情况的原因是什么,我怎样才能弄清楚实际发生了什么?特别是,准确了解 KDC 不支持的加密类型将非常有帮助。了解发送错误的 KDC 也很有用。

为了完整起见,这里是krb5.conf文件的内容:

[libdefaults]
    default_realm = EXAMPLE.COM
    allow_weak_crypto = true
        verify_ap_req_nofail = false
        default_tkt_enctypes = rc4-hmac
        default_tgs_enctypes = rc4-hmac

[realms]
    EXAMPLE.COM = {
        kdc = unix-server.example.com
        admin_server = unix-server.example.com
    }
    AD.EXAMPLE.COM = {
        kdc = ad-server.ad.example.com
        admin_server = ad-server.ad.example.com
    }

[domain_realm]
    .example.com = EXAMPLE.COM
    .ad.example.com = AD.EXAMPLE.COM

[capaths]
    EXAMPLE.COM = {
        AD.EXAMPLE.COM = .
    }
    AD.EXAMPLE.COM = {
        EXAMPLE.COM = .
    }

[logging]
    default = FILE:/var/krb5/kdc.log
    kdc = FILE:/var/krb5/kdc.log
    kdc_rotate = {
        period = 1d
        versions = 10
    }

[appdefaults]
    kinit = {
        renewable = true
        forwardable = true
    }
Run Code Online (Sandbox Code Playgroud)

Eli*_*son 3

我已经解决了这个问题。我在这里发布回复,以防其他人遇到同样的问题。

解决方案非常简单。我需要确保跨领域身份验证主体是使用单一编码类型创建的,类型为rc4-hmac

addprinc -e rc4-hmac krbtgt/AD.EXAMPLE.COM@EXAMPLE.COM
addprinc -e rc4-hmac krbtgt/EXAMPLE.COM@AD.EXAMPLE.COM
Run Code Online (Sandbox Code Playgroud)

据我所知,MIT KDC 在将票证发送到 AD 服务器时使用最安全的编码类型。AD 服务器无法处理该编码,因此回复错误,表示不支持该加密类型。由于主体只有单一编码类型,MIT 服务器在与 AD 服务器通信时将使用该类型。