-
在Ubuntu服务器上设置SSH双因素身份验证(2FA)
本教程将向您展示如何使用著名的Google Authenticator在Ubuntu服务器上设置SSH双因素身份验证。这将大大提高Ubuntu服务器上SSH服务的安全性。 双因素身份验证的工作原理 通常,您只需要输入密码或使用SSH密钥即可远程登录到Ubuntu服务器。双因素身份验证(2FA)要求您输入两条信息才能登录。因此,您还需要输入基于时间的一次性密码才能登录到SSH服务器。该一次性密码使用TOTP算法计算,该算法是IETF标准。如今,许多网站和服务(Facebook、谷歌、Twitter等)为用户提供2FA来保护他们的帐户,在SSH服务器上启用2FA也是一个好主意。 本教程将向您展示如何设置 使用2FA进行密码验证 使用2FA进行公钥认证 注意:本文中使用的开源服务器软件名为libpam google authenticator,它是从默认的Ubuntu存储库安装的。谷歌公司不以任何形式参与认证过程。服务器软件和移动应用不需要网络访问。 第一步:在Ubuntu服务器上安装并配置Google Authenticator 登录Ubuntu服务器,运行以下命令,从默认的Ubuntu软件包存储库安装Google Authenticator。 sudo apt安装-y libpam谷歌认证器 然后运行google authenticator命令在主目录中创建一个新密钥。 谷歌认证器 当被问及“您希望身份验证令牌基于时间吗?”回答y。 然后你会看到一个二维码,你可以在手机上使用TOTP应用程序扫描。我推荐两款应用: Google Authenticator是最著名的TOTP移动应用程序。你可以通过Google Play或Apple app store在手机上安装它。 Google Authenticator移动应用程序不是开源的。如果你不信任谷歌,你可以使用FreeOTP,一个由Red Hat开发的开源TOTP移动应用。 用谷歌验证器或FreeOTP在手机上扫描二维码。请注意,您需要放大终端窗口来扫描完整的二维码。 二维码代表密钥,只有SSH服务器和TOTP移动应用程序知道该密钥。扫描二维码后,您可以在手机上看到六位数的一次性密码。默认情况下,它每30秒更改一次。以后需要输入这个一次性密码,才能通过SSH登录Ubuntu服务器。 在终端窗口中,您可以看到密钥、验证码和紧急刮擦码。建议您将此信息保存到安全的地方,以便以后使用。 然后您可以输入y来回答所有剩余的问题。这将更新Google Authenticator配置文件,禁用同一身份验证令牌的多次使用,增加时间窗口,并启用速率限制以防止暴力登录尝试。 第2步:配置SSH守护进程以使用Google Authenticator 使用2FA进行密码验证 使用2FA进行公钥认证 使用2FA进行密码验证 如果不使用SSH密钥,请按照以下说明操作。 打开SSH服务器配置文件。 sudo nano/etc/ssh/sshd_config 在文件中找到以下两个参数,并确保它们都设置为“是”。 UsePAM yes ChallengeResponseAuthentication yes PAM代表可插拔身份验证模块。它提供了一种将不同的身份验证方法插入Linux系统的简单方法。要使用SSH启用Google Authenticator,必须启用PAM和质询响应身份验证。 如果要允许root用户使用2FA,请找到permitrotlogin参数并将其值设置为yes。它不能是PermitroLogin no或PermitroLogin prohibit password。 Permitrotlogin是的 保存并关闭文件。接下来,编辑SSH守护程序的PAM规则文件。 sudo nano/etc/pam。d/sshd 在这个文件的开头,您可以看到下面一行,当ChallengeResponseAuthentication设置为yes时,它将启用密码验证。 @包括公共授权 要在SSH中启用2FA,请添加以下两行。 #通过Google Authenticator进行双因素身份验证需要pam_Google_Authenticator。所以 保存并关闭文件。然后重启SSH守护进程,使更改生效。 sudo systemctl重启ssh 从现在起,SSH守护进程将要求您输入用户密码和验证码(由Google Authenticator生成的一次性密码)。下面的屏幕截图显示了从CentOS box到Ubuntu 20.04服务器的SSH登录会话。 使用2FA进行公钥认证 如果使用SSH密钥登录SSH服务器,请按照以下说明操作。 打开SSH服务器配置文件。 sudo nano/etc/ssh/sshd_config 在文件中找到以下两个参数,并确保它们都设置为“是”。 UsePAM yes ChallengeResponseAuthentication yes PAM代表可插拔身份验证模块。它提供了一种将不同的身份验证方法插入Linux系统的简单方法。要使用SSH启用Google Authenticator,必须启用PAM和质询响应身份验证。 如果要允许root用户使用2FA,请找到permitrotlogin参数并将其值设置为yes。它不能是PermitroLogin no或PermitroLogin prohibit password。 Permitrotlogin是的 接下来,在文件末尾添加以下行。这会告诉SSH守护进程,用户必须同时通过公钥身份验证和质询响应身份验证。 身份验证方法公钥、键盘交互 保存并关闭文件。接下来,编辑SSH守护程序的PAM规则文件。 sudo nano/etc/pam。d/sshd 在这个文件的开头,您可以看到下面一行,当ChallengeResponseAuthentication设置为yes时,它将启用密码验证。我们需要注释掉这一行,因为我们将使用SSH密钥而不是密码。 @包括公共授权 要在SSH中启用2FA,请添加以下两行。 #通过Google Authenticator进行双因素身份验证需要pam_Google_Authenticator。所以 保存并关闭文件。然后重启SSH守护进程,使更改生效。 sudo systemctl重启ssh 从现在起,您需要使用SSH密钥和Google Authenticator验证码登录。 笔记 Ubuntu服务器上的每个用户都需要运行google authenticator命令并扫描二维码才能使用双因素身份验证。如果用户未设置并尝试登录,将显示错误消息“权限被拒绝(键盘交互)”。 紧急恢复码是你的备份码。如果手机丢失,您可以输入五个紧急刮擦码中的一个,而不是一次性密码,以完成两步验证。这些代码仅供一次性使用。 如果您想更改密钥,只需登录服务器并再次运行google authenticator命令来更新~/。谷歌认证文件。 由于一次性密码是使用共享密钥和当前时间计算的,所以在Ubuntu服务器上启用NTP时间同步以保持准确时间是一个好主意,尽管之前我们允许Ubuntu服务器和移动应用之间的时间偏差为4分钟。你的Ubuntu服务器和TOTP移动应用可以使用不同的时区。 如何禁用SSH双因素身份验证 编辑SSH守护程序的PAM规则文件。 sudo nano/etc/pam。d/sshd 注释掉下面这行。 身份验证需要pam_google_身份验证程序。所以 保存并关闭文件。如果在/etc/ssh/sshd_config文件中添加了以下行, 身份验证方法公钥、键盘交互 删除键盘交互身份验证方法。 身份验证方法公钥 保存并关闭文件。然后重启SSH守护进程。 sudo systemctl重启ssh 收尾 我希望本教程能帮助您在Ubuntu服务器18.04和20.04上设置SSH双因素身份验证。一如既往,如果你觉得这篇文章有用,那么订阅我们的免费时事通讯。你也可以在Google+、Twitter或我们的Facebook页面上关注我们。