多KDC环境下SSH Kerberos认证配置问题求助
让我来帮你梳理下这个Kerberos+SSH的跨域认证问题——我之前在管理多域集群时也碰到过几乎一模一样的场景,咱们一步步来排查和解决:
你的需求很明确:两个KDC分别托管服务/主机主体和用户主体,SSH要走用户域认证,但目前PAM配置只改了account接口导致登录异常。咱们从核心配置到细节排查逐一调整:
1. 先把krb5.conf的基础配置捋顺
你的krb5.conf必须清晰定义两个域的KDC信息,以及域名和服务域的绑定,示例配置如下:
[libdefaults] default_realm = MY_FIRST_REALM # 服务/主机所在的域,符合你的要求 dns_lookup_kdc = false dns_lookup_realm = false ticket_lifetime = 24h renew_lifetime = 7d [realms] MY_FIRST_REALM = { kdc = kdc-service.example.com # 服务域的KDC地址 admin_server = kdc-service.example.com } MY_SECOND_REALM = { kdc = kdc-user.example.com # 用户域的KDC地址 admin_server = kdc-user.example.com } [domain_realm] # 把机器所在的域名绑定到服务域,确保服务主体被正确识别 .example.com = MY_FIRST_REALM example.com = MY_FIRST_REALM
这里要注意:两个域的KDC地址必须能被服务器访问,domain_realm的映射不能搞反,否则服务主体会找不到对应的KDC。
2. 修正PAM配置——不止account接口要改!
你只在PAM的account阶段加了realm=MY_SECOND_REALM是不够的,SSH认证涉及**auth(身份验证)和account(账户有效性验证)**两个关键阶段,都得指定用户域。
找到你的PAM SSH配置文件(通常是/etc/pam.d/sshd),修改Kerberos相关的行:
# Auth阶段:告诉PAM去MY_SECOND_REALM验证用户身份 auth sufficient pam_krb5.so realm=MY_SECOND_REALM use_first_pass # Account阶段:验证用户在MY_SECOND_REALM的账户是否有效 account sufficient pam_krb5.so realm=MY_SECOND_REALM
如果你的PAM配置里用的是required而非sufficient,也要给对应的行加上realm=MY_SECOND_REALM参数。
3. 调整sshd_config的Kerberos设置
SSH服务端需要明确启用Kerberos认证,并且允许跨域票据验证。编辑/etc/ssh/sshd_config:
# 启用Kerberos身份认证 KerberosAuthentication yes # 如果Kerberos认证失败,允许 fallback 到本地密码(可选,根据你的需求调整) KerberosOrLocalPasswd yes # 登录结束后自动清理票据 KerberosTicketCleanup yes # 如果你用了GSSAPI认证(很多环境会开),也要确保这两个选项开启 GSSAPIAuthentication yes GSSAPIKeyExchange yes
这里不需要强制服务域和用户域一致,因为PAM已经指定了用户要去MY_SECOND_REALM验证。
4. 验证流程,排查具体错误
做完上面的配置后,先在客户端测试用户票据获取:
kinit your-username@MY_SECOND_REALM
用klist确认票据成功获取后,再尝试SSH登录。如果还是失败,立刻去服务器看认证日志(比如/var/log/auth.log或/var/log/secure),日志里会明确告诉你失败原因:比如用户主体不存在、KDC连接不上、realm映射错误等等。
5. 几个容易踩的坑
- 防火墙:确保SSH服务器能访问MY_SECOND_REALM的KDC(开放UDP/TCP 88端口)
- 服务主体:确认SSH服务器的
host/your-machine@MY_FIRST_REALM主体已经在服务域KDC注册,并且/etc/krb5.keytab里有对应的条目(用klist -k查看) - 用户主体:在用户域KDC上确认用户存在,用
kadmin -p admin@MY_SECOND_REALM getprinc your-username@MY_SECOND_REALM验证
按照这个流程调整后,跨域SSH Kerberos认证应该就能正常工作了。
内容的提问来源于stack exchange,提问作者Serg

