第 16a 章 客户端、Groupware & CLI 管理:#pIdentity

Kerberos SSO:域内电脑、Outlook 和邮件应用无需密码即可登录

借助 Kerberos,公司网络中的 Windows 电脑无需输入密码即可登录:Webmail 和管理界面通过 SPNEGO("使用 Windows 登录"),Outlook 通过 MAPI、EWS、ActiveSync 和 Autodiscover 使用 Negotiate,Thunderbird 及其他邮件应用通过 IMAP、SMTP、POP3 和 ManageSieve 使用 SASL GSSAPI。nextxch 使用上传的 keytab 自行验证票据;这在 Linux 以及非域成员的 Windows 服务器上均可工作。当 nextxch 运行在域成员上时,可以使用计算机账户代替 keytab。有意不支持 NTLM。

运维提示与架构说明

SPN 中的主机名必须与客户端使用的名称完全一致(例如 mail.example.com),并可通过 A 记录解析。服务账户每次更改密码后,都要重新创建并上传 keytab;"检查 Kerberos" 会显示每个 SPN 的密钥版本和加密方式。

Active Directory:服务账户、SPN 和 keytab

以域管理员身份运行 PowerShell。只需为第一个 SPN 运行一次 ktpass;同一账户的其他所有 SPN 共享该密钥,只需执行 setspn。

参考 / 配置
# 1. Service account (password never expires, AES only)
New-ADUser -Name svc-nextxch -AccountPassword (Read-Host -AsSecureString) `
  -Enabled $true -PasswordNeverExpires $true -KerberosEncryptionType AES256

# 2. Register the service principals (host name = name clients use)
setspn -S HTTP/mail.example.com  CORP\svc-nextxch
setspn -S imap/mail.example.com  CORP\svc-nextxch
setspn -S smtp/mail.example.com  CORP\svc-nextxch
setspn -S pop/mail.example.com   CORP\svc-nextxch
setspn -S sieve/mail.example.com CORP\svc-nextxch

# 3. Create the keytab (resets the account password)
ktpass -princ HTTP/mail.example.com@CORP.LOCAL -mapuser CORP\svc-nextxch `
  -crypto AES256-SHA1 -ptype KRB5_NT_PRINCIPAL -pass * -out nextxch.keytab

# 4. nextxch Admin > Identity sources > Kerberos
#    realm CORP.LOCAL, SPNs as above, upload the keytab, "Check Kerberos"

# Machine account mode (nextxch on domain member MAILSRV, no keytab):
setspn -S HTTP/mail.example.com CORP\MAILSRV$
setspn -S imap/mail.example.com CORP\MAILSRV$

MIT Kerberos、Heimdal 和 FreeIPA

创建主体并将其密钥导出到 keytab;FreeIPA:ipa service-add 和 ipa-getkeytab。

参考 / 配置
# MIT / Heimdal
kadmin -q "addprinc -randkey HTTP/mail.firma.de@FIRMA.LOCAL"
kadmin -q "addprinc -randkey imap/mail.firma.de@FIRMA.LOCAL"
kadmin -q "addprinc -randkey smtp/mail.firma.de@FIRMA.LOCAL"
kadmin -q "ktadd -k /tmp/nextxch.keytab HTTP/mail.firma.de imap/mail.firma.de smtp/mail.firma.de"

# FreeIPA
ipa service-add HTTP/mail.firma.de
ipa service-add imap/mail.firma.de
ipa-getkeytab -s ipa.firma.local -p HTTP/mail.firma.de -k /tmp/nextxch.keytab
ipa-getkeytab -s ipa.firma.local -p imap/mail.firma.de -k /tmp/nextxch.keytab

# Test vom Client:
kinit anna && curl --negotiate -u : https://mail.firma.de/api/auth/kerberos

使用真实 AD 进行手动测试

自动化测试会使用生成的 keytab 验证票据。若有真实的域控制器,还请按以下方式测试:

参考 / 配置
# Auf einem Domänen-PC als normaler Benutzer:
klist purge
Invoke-WebRequest https://mail.firma.de/api/auth/kerberos -UseDefaultCredentials
klist                     # zeigt Ticket für HTTP/mail.firma.de
# Erwartet: 200 {"ok":true,"email":"anna@firma.de"}

# IMAP mit GSSAPI (Linux-Client in der Domäne):
kinit anna@FIRMA.LOCAL
curl -v --login-options AUTH=GSSAPI --negotiate -u : imaps://mail.firma.de/INBOX

设置、默认值与最佳实践

设置 / 位置 说明 默认值 生产环境最佳实践
Keytab 由 ktpass、ktutil 和 kadmin 写出的 MIT 格式。使用服务器密钥环加密存储,之后不再显示;管理页面只列出主体、kvno 和加密类型。 Keytab-Modus 请使用 AES256。RC4 密钥可以使用,但 "检查 Kerberos" 会对其发出警告。
Benutzerzuordnung Kerberos 主体 (anna@CORP.LOCAL) 通过身份源进行映射:userPrincipalName、sAMAccountName 或邮件地址。仅接受已配置的领域(以及其他允许的领域)。 Realm Pflicht 请先设置并同步 AD 身份源,然后再启用 Kerberos。
Browser 浏览器只会向受信任的 Intranet 地址发送 Kerberos 票据。否则会显示常规登录页面。 Automatischer Versuch aus GPO "站点到区域的分配列表":https://mail.example.com = 1(Intranet)。Chrome/Edge:AuthServerAllowlist,Firefox:network.negotiate-auth.trusted-uris。
Outlook und ActiveSync MAPI、EWS、Autodiscover 和 ActiveSync 除 Basic 外还提供"WWW-Authenticate: Negotiate"。域内 PC 上的 Outlook 随后会使用已登录用户的票据。 Negotiate + Basic 在 Outlook 的“账户设置 > 其他设置 > 安全性”中关闭"始终提示输入登录凭据"。
Mail-Programme (GSSAPI) IMAP、SMTP 提交、POP3 和 ManageSieve 提供 SASL GSSAPI(带双向认证,RFC 4752)。Thunderbird:账户设置 > 服务器 > 身份验证 "Kerberos / GSSAPI"。 imap/, smtp/, pop/, sieve/ 在 Linux 客户端上先运行 kinit;随后 klist 会显示 imap/mail.example.com 的票据。