在Ubuntu服务器上设置SSH双向身份验证(2FA)

本教程将向您展示如何使用著名的Google Authenticator在Ubuntu服务器上设置SSH两因素验证。 这将大大提高Ubuntu服务器上SSH服务的安全性。

两因素身份验证如何工作

通常,您只需要输入密码或使用SSH密钥即可远程登录Ubuntu服务器。 两因素身份验证(2FA)要求您输入两条信息才能登录。 因此,您还需要输入基于时间的一次性密码来登录SSH服务器。 使用IETF标准的TOTP算法计算一次密码。 如今,许多网站和服务(Facebook,Google,Twitter等)为用户提供2FA保护其帐户的安全,最好在SSH服务器上启用2FA。

本教程将向您展示如何设置

  • 一次性密码认证
  • 具有一次性密码的公钥认证

注意:本文中将使用的开源服务器软件称为 libpam-google-authenticator,它是从默认的Ubuntu存储库安装的。 Google公司不以任何形式参与任何身份验证过程。 服务器软件和移动应用程序不需要网络访问。

步骤1:在Ubuntu服务器上安装和配置Google Authenticator

登录您的Ubuntu服务器并运行以下命令,以从默认的Ubuntu软件包存储库安装Google Authenticator。

sudo apt install libpam-google-authenticator

然后运行 google-authenticator 命令在您的主目录中创建一个新的密钥。

google-authenticator

当被问到“您是否希望身份验证令牌基于时间?” 回答 ÿ

然后,您将看到可以使用手机上的TOTP应用程序扫描的QR码。 我推荐两个应用程序:

  • Google身份验证器 是最著名的TOTP移动应用。 您可以通过手机上的Google Play或Apple应用商店安装它。
  • Google身份验证器 移动应用不是开源的。 如果您不信任Google,则可以使用FreeOTP,这是由Red Hat开发的开源TOTP移动应用程序。

使用手机上的Google Authenticator或FreeOTP扫描QR码。 请注意,您需要放大终端窗口以扫描完整的QR码。

SSH两因素认证Ubuntu

QR码表示密钥,只有您的SSH服务器和TOTP移动应用程序才知道该密钥。 扫描QR码后,您将在手机上看到一个六位数的一次性密码。 默认情况下,它每30秒更改一次。 您稍后需要输入此一次性密码,以便通过SSH登录Ubuntu服务器。

谷歌身份验证器

在终端窗口中,您可以看到密钥,验证码和紧急暂存码。 建议您将此信息保存到安全的地方以备后用。

然后您可以输入 ÿ 回答所有剩余的问题。 这将更新您的Google Authenticator配置文件,禁用同一身份验证令牌的多次使用,增加时间范围并启用速率限制以防止强行登录尝试。

SSH 2FA Ubuntu的

步骤2:将SSH守护程序配置为使用Google Authenticator

打开SSH服务器配置文件。

sudo nano /etc/ssh/sshd_config

在文件中找到以下两个参数,并确保将它们都设置为

UsePAM yes

ChallengeResponseAuthentication yes

PAM 代表可插入身份验证模块。 它提供了一种简便的方法,可以将不同的身份验证方法插入Linux系统。 要使用SSH启用Google Authenticator,必须启用PAM和质询响应身份验证。 保存并关闭文件。 然后重新启动SSH守护程序,以使更改生效。

sudo systemctl restart ssh

注意:要允许root用户使用2FA,您必须首先允许root使用此配置通过SSH登录 PermitRootLogin yes。 它不可能是 PermitRootLogin no 要么 PermitRootLogin prohibit-password

默认情况下,质询响应身份验证要求您输入用户密码才能登录。 现在,为SSH守护程序编辑PAM规则文件。

sudo nano /etc/pam.d/sshd

在此文件的开头,您可以看到以下行,该行在以下情况下启用密码验证 ChallengeResponseAuthentication 被设定为 yes

@include common-auth

要同时启用一次性密码身份验证,请添加以下两行。

#One-time password authentication via Google Authenticator
auth required pam_google_authenticator.so

auth-required-pam_google_authenticator

保存并关闭文件。 从现在开始,SSH守护程序将要求您输入用户密码和验证码(由Google Authenticator生成的一次性密码)。

ssh密码和验证

如何启用公钥身份验证和一次性密码身份验证

对于SSH安全性,建议您使用公共密钥身份验证而不是密码身份验证。 您可以按照以下教程进行设置。

  • 2在Ubuntu上设置无密码SSH登录的简单步骤

一旦设置了公共密钥身份验证并按照上述两个步骤进行操作,就可以将公共密钥身份验证与一次性密码身份验证结合使用。

编辑SSH守护程序配置文件。

sudo nano /etc/ssh/sshd_config

在上一步中,我们启用了质询响应身份验证,现在我们想让SSH守护进程知道用户必须同时通过公钥认证和质询响应身份验证。 在此文件的末尾添加以下行。

AuthenticationMethods publickey,keyboard-interactive

保存并关闭文件。 重新启动SSH守护程序,以使更改生效。

sudo systemctl restart ssh

我们还需要编辑SSH PAM配置文件。

sudo nano /etc/pam.d/sshd

注释掉以下行(在开头添加#)以禁用用户密码身份验证。

@include common-auth

保存并关闭文件。 从现在开始,您需要使用SSH密钥和Google Authenticator验证码登录。

笔记

  • Ubuntu服务器上的每个用户都需要运行 google-authenticator 命令并扫描QR码以使用两因素身份验证。 如果用户未设置并尝试登录,则错误消息“权限被拒绝(键盘交互)将会显示。
  • 紧急暂存代码是您的备用代码。 如果您丢失了手机,则可以输入五个紧急暂存代码之一而不是一次性密码来完成两步验证。 这些代码仅供一次性使用。
  • 如果要更改密钥,只需登录服务器并运行 google-authenticator 再次命令以更新 ~/.google_authenticator 文件。
  • 由于一次密码是使用共享密钥和当前时间计算的,因此在您的Ubuntu服务器上启用NTP时间同步以保持准确的时间是一个好主意,尽管以前我们允许Ubuntu之间的时间偏差为4分钟服务器和移动应用。 您的Ubuntu服务器和TOTP移动应用可以使用不同的时区。

如何禁用SSH两因素身份验证

编辑SSH守护程序配置文件。

sudo nano /etc/ssh/sshd_config

找到以下行。

AuthenticationMethods publickey,keyboard-interactive

删除键盘交互式身份验证方法。

AuthenticationMethods publickey

保存并关闭文件。 然后重新启动SSH守护程序。

sudo systemctl restart ssh

包起来

我希望本教程可以帮助您在Ubuntu服务器18.04和18.10上设置SSH两因素身份验证。 与往常一样,如果您发现此帖子有用,请订阅我们的免费新闻通讯。 您也可以在Google +,Twitter或喜欢我们的Facebook页面上关注我们。

Sidebar