Putty Kerberos/GSSAPI身份验证

我在RHEL6上配置了几台Linux服务器,使用sssd进行Active Directory Kerberos身份验证。我还启用了GSSAPI身份验证,希望实现无密码登录。
但是我似乎无法让Putty(0.63版本)在没有密码的情况下进行身份验证。
在已配置为AD身份验证的Linux系统(openSSH客户端)之间,GSSAPI可以正常工作,只需在.ssh/config设置中启用GSSAPI即可。
在Cygwin(openSSH客户端)上也可以正常工作,需要使用相同的.ssh/config设置,并运行kinit命令获取票证。
此外,所有Linux系统上的Samba共享,包括个人目录,在Windows资源管理器中都可以无需密码访问(我不确定GSSAPI是否起作用)。
我应该尝试哪些方法来解决这个问题?我的大多数用户使用Putty。另外,我不是Windows管理员,因此无法在域控制器上进行任何操作。我的账户只有将服务器添加到AD域的权限。
我打开了Putty的SSH数据包日志记录。我觉得这很有趣,但还不确定如何处理这些信息。
Event Log: Server version: SSH-2.0-OpenSSH_5.3
Event Log: Using SSH protocol version 2
Event Log: We claim version: SSH-2.0-PuTTY_Release_0.63
Outgoing packet #0x0, type 20 / 0x14 (SSH2_MSG_KEXINIT)
Incoming packet #0x0, type 20 / 0x14 (SSH2_MSG_KEXINIT)
Event Log: Doing Diffie-Hellman group exchange
Outgoing packet #0x1, type 30 / 0x1e (SSH2_MSG_KEX_DH_GEX_REQUEST)
Incoming packet #0x1, type 31 / 0x1f (SSH2_MSG_KEX_DH_GEX_GROUP)
Event Log: Doing Diffie-Hellman key exchange with hash SHA-256
Outgoing packet #0x2, type 32 / 0x20 (SSH2_MSG_KEX_DH_GEX_INIT)
Incoming packet #0x2, type 33 / 0x21 (SSH2_MSG_KEX_DH_GEX_REPLY)
Outgoing packet #0x3, type 21 / 0x15 (SSH2_MSG_NEWKEYS)
Event Log: Initialised AES-256 SDCTR client->server encryption
Event Log: Initialised HMAC-SHA1 client->server MAC algorithm
Outgoing raw data at 2014-11-25 00:21:08
Incoming packet #0x3, type 21 / 0x15 (SSH2_MSG_NEWKEYS)
Event Log: Initialised AES-256 SDCTR server->client encryption
Event Log: Initialised HMAC-SHA1 server->client MAC algorithm
Outgoing packet #0x4, type 5 / 0x05 (SSH2_MSG_SERVICE_REQUEST)
Incoming packet #0x6, type 51 / 0x33 (SSH2_MSG_USERAUTH_FAILURE)
...%gssapi-keyex
,gssapi-with-mic
,password.
Event Log: Using SSPI from SECUR32.DLL
Event Log: Attempting GSSAPI authentication
Outgoing packet #0x6, type 50 / 0x32 (SSH2_MSG_USERAUTH_REQUEST)
Incoming packet #0x7, type 60 / 0x3c (SSH2_MSG_USERAUTH_GSSAPI_RESPONSE)
Event Log: GSSAPI authentication initialised
Outgoing packet #0x7, type 61 / 0x3d (SSH2_MSG_USERAUTH_GSSAPI_TOKEN)
Incoming packet #0x8, type 61 / 0x3d (SSH2_MSG_USERAUTH_GSSAPI_TOKEN)
Event Log: GSSAPI authentication initialised
Event Log: GSSAPI authentication loop finished OK
Outgoing packet #0x8, type 66 / 0x42 (SSH2_MSG_USERAUTH_GSSAPI_MIC)
Incoming packet #0x9, type 51 / 0x33 (SSH2_MSG_USERAUTH_FAILURE)
...%gssapi-keyex
,gssapi-with-mic
,password.

1打开ssh守护进程的调试模式可以显示有用的信息。您可以在不同的端口上启动第二个实例进行测试。 - Paul Haldane
3个回答

在属于Active Directory域的Windows机器上,用户在登录Windows时会收到他们的Kerberos票据授予票证,如果在PuTTY配置连接|SSH|Auth|GSSAPI中启用了GSSAPI身份验证(并且在连接|SSH|Auth中尝试GSSAPI之前的其他身份验证方法,如通过Pageant的公钥身份验证未设置或禁用),PuTTY就能够使用该票证进行身份验证。
[如果您还需要票证委派(例如,在登录后挂载kerberized文件系统到服务器),请确保在PuTTY中也启用了GSSAPI委派,并且您登录的服务器在Active Directory的委派选项卡中标记为“信任此计算机以委派给任何服务(仅限Kerberos)”,默认情况下不会标记。奇怪的是,AD中的后一个信任设置只有在像PuTTY这样的Windows客户端进行委派时才需要;对于Linux的“ssh -K”客户端来说,它是不需要的。]
在未加入Active Directory域的自助管理(个人)Windows机器上,您仍然可以通过PuTTY使用Kerberos/GSSAPI身份验证(和票据委派),但您必须自己获取票据。不幸的是,Windows 7没有安装任何类似于kinit程序的等效物(供您手动请求票据),而且如果您没有票据,PuTTY也不会提示您输入Kerberos密码。因此,您需要安装MIT Kerberos for Windows软件包,其中包括常用的kinit/klist/kdestroy命令行工具,以及一个很棒的GUI工具“MIT Kerberos Ticket Manager”。使用这些工具获取您的票据,然后PuTTY将自动使用MIT GSSAPI库而不是Microsoft SSPI库,并且应该一切正常。如果“MIT Kerberos Ticket Manager”正在运行,当PuTTY需要票据时,它将自动提示您输入Kerberos密码,因此最好将其链接到启动文件夹中。
更新:自Windows 10版本21H1和Windows Server 2022起,内置于Windows中的OpenSSH for Windows(8.1版本或更高版本)客户端和服务器现在也支持GSSAPI身份验证和委派(即ssh -K)。因此,如果您只需要这个功能,从2021年开始,您就不再需要安装PuTTY和MIT Kerberos。

1我后来了解到,Windows实际上有一种类似于MIT Kerberos的kinit命令的等效命令叫做cmdkey - Markus Kuhn
1关于启用票据委派,如果你是那些理解_Active Directory_实际上只是_微软LDAPv3_的人之一:请确保你想要委派Kerberos票据的服务主体的LDAP条目在其userAccountControl中设置了位TRUSTED_FOR_DELEGATION = 0x80000 = 524288。 - Markus Kuhn
对于考虑配置“信任此计算机用于委派到任何服务(仅限Kerberos)”,例如无限制的Kerberos委派的任何人,我提醒你要认真考虑其严重的安全影响。我建议首先阅读https://adsecurity.org/?p=1667。 - Brad

首先,仔细检查在运行PuTTY的Windows电脑上的klist输出,确保显示一个有效的TGT。然后,在PuTTY会话的配置中,确保启用“尝试GSSAPI身份验证”选项,路径为“连接 - SSH - 身份验证 - GSSAPI”。最后,在“连接 - 数据”中配置自动登录您的用户名。您可以明确指定用户名,或选择“使用系统用户名”的单选按钮。
历史上,这就是我通过Kerberos实现无密码SSH登录所需做的全部。

1klist tgt 看起来对我来说是有意义的。它还显示可以转发。klist 显示了 5 个密钥,用于像 Exchange 这样的事物。我还有一个用于我正在尝试 SSH 到的 Linux 服务器的票证。我已经检查了 putty 配置 100 次。所有在线文档/指南基本上都说同样的事情,所以我相信那部分设置是正确的。 - xdfil

问题出在Windows Kerberos设置上。我觉得我们的Active Directory设置有点奇怪,我不太清楚,因为我不是Windows管理员。
但是我通过在Windows 7 CLI中手动配置Kerberos来解决了这个问题。
在重启远程工作站后,我无法登录我的电脑。这是因为在原始配置中,我的领域域名的顶级域部分始终不存在(domain\user),但在我手动配置后,我必须更改登录域以反映完整的领域域名(domain.TLD\user),然后才能登录到我的Windows PC,尽管认证时间似乎变长了一些。
在更改之前,ksetup的输出只显示了我的默认领域,并且是小写字母。
我使用“nslookup -type=SRV _kerberos._tcp.domain.TLD”获取了我领域的所有KDC服务器。
我没有设置任何标志。
我映射了我的用户名“ksetup /mapuser user@domain.TLD user”。
我使用的资源: https://wiki.ncsa.illinois.edu/display/ITS/Windows+7+Kerberos+Login+using+External+Kerberos+KDC

https://www.cgl.ucsf.edu/Security/CGLAUTH/CGLAUTH.html

如果有人对Windows管理员的工作有任何建议,可以让我知道,我会转达给他们。这个问题是不是出了什么问题?