第 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 的票据。 |