我正在尝试配置一个密钥表文件,以便与我的服务主体一起使用,以在 Linux (RHEL9) 服务器和 Microsoft Windows 2022 Server 之间进行 Kerberos 身份验证。服务主体是 MSSQLSvc/[电子邮件受保护]。当我在我的 AD 主机(控制器)上生成 keytab 文件,然后将其上传到我的 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 主机上生成了一个密钥表文件:
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 主机上的密钥表文件时:
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
我尝试了很多事情:
我尝试这样做:
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
– 这不是一个有效的数字。
除此之外:您有两个实体(客户端和服务),但两者之间只有一个 AD 帐户,这不是您应该使用 Kerberos 的方式。
作为一般规则,服务的客户端永远不应该使用与该服务相同的主体 - 您应该为每个客户端创建一个专用的用户帐户(没有 SPN)。
(当您这样做时
kinit MSSQLSvc/MSSQL-whatever
,您不会获得MSSQL服务器的票证——您会获得作为MSSQL服务器的票证,这与您可能想要做的相反。)
请记住,密钥表是“字面上”不同形式的帐户密码,因此,如果您通常不会告诉客户服务帐户的密码,那么您也不应该向客户提供服务密钥表。 (就像您也不会给 webapp 用户提供服务器的 HTTPS 私钥的副本一样......)