当前位置: 首页 > 科技观察

在Fedora上为SSH设置双因素身份验证

时间:2023-03-14 09:28:18 科技观察

每天似乎都有新闻报道称安全漏洞使我们的数据处于危险之中。尽管SSH是一种远程连接系统的安全方式,您仍然可以使其更加安全。本文将向您展示如何做到这一点。这时候,双因素认证(2FA)就派上用场了。即使您禁用密码并只允许使用公钥和私钥进行SSH连接,如果未经授权的用户窃取了您的密钥,他仍然可以使用它来访问系统。使用双因素身份验证,您不能只使用SSH密钥连接到服务器,您还需要提供从手机上的身份验证器应用程序随机生成的号码。本文提出的方法是基于时间的一次性密码(TOTP)算法。GoogleAuthenticator用作服务器应用程序。默认情况下,GoogleAuthenticator在Fedora中可用。对于手机,您可以使用任何支持双因素身份验证的TOTP兼容应用程序。有许多适用于Andorid或iOS的免费应用程序可与TOTP和GoogleAuthenticator配合使用。本文以FreeOTP为例。安装和设置GoogleAuthenticator首先,在您的服务器上安装GoogleAuthenticator。$sudodnfinstall-ygoogle-authenticator运行应用程序:$google-authenticator该应用程序会提出一系列问题。以下代码片段显示了如何进行合理的安全设置:Doyouwantauthenticationtokenstobetime-based(y/n)yDoyouwantmetoupdateyour"/home/user/.google_authenticator"file(y/n)?y本应用程序为您提供密钥、验证码和恢复码。将它们放在安全的地方。如果您丢失了手机,恢复代码是访问服务器的唯一途径。设置移动身份验证在您的手机上安装身份验证器应用程序(FreeOTP)。如果您有Android手机,则可以在GooglePlay或AppleiPhone上的iTunes商店中找到它。GoogleAuthenticator会在屏幕上显示一个二维码。打开手机上的FreeOTP应用程序,选择添加新帐户,选择应用程序顶部的二维码形状工具,然后扫描二维码。设置完成后,每次远程连接到服务器时,您都必须提供验证器应用程序生成的随机数。完成应用程序配置后将询问您更多问题。下面的例子展示了如何设置合理的安全配置。您要禁止多次使用同一身份验证令牌吗?这会限制您大约每30秒登录一次,但它会增加您注意到甚至防止中间人攻击的机会(是/否)y默认情况下,令牌有效期为30秒。为了补偿客户端和服务器之间可能存在的时间偏差,我们允许在当前时间之前和之后使用额外的令牌。如果您遇到时间同步不佳的问题,可以将窗口从其默认大小+-1分钟(窗口大小为3)增加到大约+-4分钟(窗口大小为17个可接受的标记)。您要这样做吗?(y/n)n如果您登录的计算机没有针对暴力登录尝试进行强化,您可以为身份验证模块启用速率限制。默认情况下,这将攻击者限制为每30秒不超过3次登录尝试。是否要启用速率限制(y/n)y现在,您必须设置SSH来利使用新的双路验证。配置SSH在完成此步骤之前,请确保您有一个使用公钥的有效SSH连接,因为我们将禁用密码连接。如果出现问题或错误,建立的连接将允许您解决问题。在您的服务器上,使用sudo编辑/etc/pam.d/sshd文件。$sudovi/etc/pam.d/ssh注释掉行authsubstackpassword-auth:#authsubstackpassword-auth将以下行添加到文件底部:authsufficientpam_google_authenticator.so保存并关闭文件。然后编辑/etc/ssh/sshd_config文件:$sudovi/etc/ssh/sshd_config找到ChallengeResponseAuthentication行并将其更改为yes:ChallengeResponseAuthenticationyes找到PasswordAuthentication行并将其更改为no:PasswordAuthenticationno添加以下行到底部文件的:AuthenticationMethodspublickey,passwordpublickey,keyboard-interactive保存并关闭文件,然后重启SSH:$sudosystemctlrestartsshd测试双因素身份验证当您尝试连接到服务器时,系统会提示您输入身份验证码:[user@client~]$sshuser@example.com验证码:验证码由您手机上的验证程序随机生成。由于此数字每隔几秒更改一次,因此您需要在更改前输入它。如果不输入验证码,将无法访问系统,会收到permissiondenied错误:[user@client~]$sshuser@example.comVerificationcode:Verificationcode:Verificationcode:Permissiondenied(keyboard-interactive).[user@client~]$结论通过添加这种简单的双向身份验证,未经授权的用户现在将更难访问您的服务器。