我正在尝试配置一个密钥表文件,以便与我的服务主体一起使用,以便在我的 Linux (RHEL9) 服务器和我的 Microsoft Windows 2022 Server 之间进行 Kerberos 身份验证。服务主体是 MSSQLSvc/ [email protected]。当我在我的 AD 主机(控制器)上生成密钥表文件,然后将其上传到我的 RHEL 主机并尝试生成票证时。
kinit -V -t /etc/test.keytab MSSQLSvc/[email protected]
我总是得到:
Using keytab: /etc/test.keytab
kinit: Invalid integer value while getting initial credentials
还尝试过:
kinit MSSQLSvc/[email protected]
kinit: Invalid integer value while getting initial credentials
以下是我配置环境的背景。首先,我将 SQL Server 服务设置为使用我的域用户[email protected]运行。然后我为我的用户生成了一个服务原则:
PS C:\Users\Administrator> setSPN EvolvenDBUser
Registered ServicePrincipalNames for CN=EvolvenDBUser,CN=Users,DC=evolven,DC=corp:
MSSQLSvc/MSSQL-G1CFTVE.evolven.corp
MSSQLSvc/MSSQL-G1CFTVE.evolven.corp:1433
接下来,我通过以下命令在我的 AD 主机上生成了一个 keytab 文件:
ktpass -princ MSSQLSvc/[email protected] -mapuser [email protected] -crypto AES256-SHA1 -ptype KRB5_NT_PRINCIPAL -pass <password> -out test.keytab -SetPass
它返回的是:
Targeting domain controller: EC2AMAZ-AEHRC46.evolven.corp
Using legacy password setting method
Successfully mapped MSSQLSvc/MSSQL-G1CFTVE.evolven.corp to EvolvenDBUser.
Key created.
Output keytab to evolven.keytab:
Keytab version: 0x502
keysize 99 MSSQLSvc/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 20 etype 0x12 (AES256-SHA1) keylength 32 (0x0a32866cd2364109a006b483cedd8f6eee418f87b2b460d6be75e6763b1b0aef)
当我检查 RHEL 主机上的 keytab 文件时:
klist -k /etc/test.keytab
Keytab name: FILE:/etc/test.keytab
KVNO Principal
---- --------------------------------------------------------------------------
18 MSSQLSvc/[email protected]
在我的 RHEL 主机上,我的 krb5.conf 并不是很花哨,但我可以确认它支持我想要使用的加密设置。
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = EVOLVEN.CORP
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 30d
renew_lifetime = 30d
forwardable = true
udp_preference_limit = 1 # Forces TCP if UDP fails
default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96
default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96
permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96
[realms]
EVOLVEN.CORP = {
kdc = EC2AMAZ-AEHRC46.evolven.corp
admin_server = EC2AMAZ-AEHRC46.evolven.corp
}
[domain_realm]
.evolven.corp = EVOLVEN.CORP
evolven.corp = EVOLVEN.CORP
我尝试过很多事情:
- 我已在 AD 中启用用户支持 AES-128 和 AES-256。
- 更改了 AD 用户的密码,然后重新生成了 keytab 文件。我还删除了密码中的特殊字符,认为这可能会导致问题。结果还是一样。
- 执行了 kdestroy 来删除所有旧票。
- 我在这里看到一篇帖子:kinit:获取初始凭证时预认证失败。
- 不知道为什么,但即使我已启用日志记录,我也看不到任何日志。
我尝试过这样做:ktutil: add_entry -password -p MSSQLSvc/[email protected] -k 18 -e aes256-cts-hmac-sha1-96 -f
然后我回来
add_entry: Invalid integer value while adding new entry
显然,我的服务主体身份验证存在问题。我该如何解决才能生成票证?
Invalid integer
是在解析 krb5.conf 时发生的错误。这很可能是因为您的 udp_preference_limit 设置为1 # Forces TCP if UDP fails
– 那不是一个有效的数字,因为 krb5.conf 不支持同行注释。除此之外:您有两个实体(客户端和服务),但两者之间只有一个 AD 帐户,而这不是您应该使用 Kerberos 的方式。
一般来说,服务的客户端不应该使用与服务相同的主体——你应该为每个客户端创建一个专用的用户帐户(没有 SPN)。
(当您这样做时
kinit MSSQLSvc/MSSQL-whatever
,您不会获得MSSQL 服务器的票证 – 您获得的是MSSQL 服务器的票证,这与您可能尝试执行的操作相反。)请记住,keytab实际上是不同形式的帐户密码,因此如果您通常不会告诉客户端服务帐户的密码,那么您也不应该向客户端提供服务 keytab。(就像您也不会向 webapp 用户提供服务器 HTTPS 私钥的副本一样……)