如何在CentOS服务器上设置SSH双因素认证2FA
本教程将告诉你如何在CentOS/RHEL服务器上使用Google Authenticator设置SSH双因素认证。它将大大提高CentOS/RHEL服务器上SSH服务的安全性。
双因素认证如何工作
通常情况下,你只需要输入一个密码或者使用SSH密钥就可以登录到你的远程CentOS/RHEL服务器上。双因素认证(2FA)需要你输入两个信息才能登录,所以你还需要输入一个基于时间的一次性密码来登录你的SSH服务器。这个一次性密码是使用TOTP算法计算出来的,TOTP算法是IETF标准。如今,许多网站和服务都为用户提供了2FA,以保护他们的账户安全,最好也为你的SSH服务器启用2FA。
本教程将向您展示如何设置
用2FA进行密码认证
使用2FA的公钥认证
注:本文中我们将使用的开源服务器软件叫做google-authenticator,它是从EPEL仓库中安装的。谷歌公司不参与任何形式的认证过程。服务器软件和移动应用不需要网络访问。
1、在CentOS/RHEL服务器上安装和配置Google Authenticator。
登录到你的CentOS/RHEL服务器,并运行以下命令从EPEL(Extra Package for Enterprise Linux)仓库中安装Google Authenticator。qrencode用于在命令行中生成QR码。
sudo dnf install -y epel-release
sudo dnf install -y google-authenticator qrencode qrencode-libs
然后运行google-authenticator命令,在~/.ssh/目录下创建一个新的秘钥。
google-authenticator -s ~/.ssh/google_authenticator
当被问及 "Do you want authentication tokens to be time-based?" 回答:Y。

然后你会看到一个二维码,你需要用手机上的TOTP应用扫描。

这里推荐两款应用:
Google Authenticator是最知名的TOTP手机应用。你可以通过Google Play或苹果应用商店在手机上安装它。
Google Authenticator手机应用并不是开源的。如果你不信任谷歌,可以使用红帽开发的开源TOTP手机应用FreeOTP。
用手机上的Google Authenticator或FreeOTP扫描二维码。注意,你需要放大终端窗口才能扫描完整的二维码。
二维码代表的是秘钥,只有你的SSH服务器和你的TOTP手机应用才知道。扫描二维码后,你可以在手机上看到一个六位数的一次性密码。默认情况下,它每30秒就会改变一次。你需要在终端上输入这个一次性密码。

现在在终端窗口中,你应该可以看到紧急暂存代码。你要把这些信息保存到一个安全的地方,以防你的手机丢失。

然后你可以输入y来回答所有剩余的问题。这将更新你的Google Authenticator配置文件,禁止多次使用同一身份验证令牌,增加时间窗口,并启用速率限制,以防止暴力破解登录尝试。

2、配置SSH守护进程使用Google认证器
用2FA进行密码认证、使用2FA的公钥认证
用2FA进行密码认证
如果你没有使用SSH密钥,那么请按照以下说明进行操作。
打开SSH服务器的配置文件。
sudo nano /etc/ssh/sshd_config
在文件中找到以下两个参数,并确保它们都被设置为 "yes"。
UsePAM yes
ChallengeResponseAuthentication yes
PAM是可插拔认证模块的缩写。它提供了一个简单的方法来插入不同的认证方法到你的Linux系统。要使用SSH启用Google Authenticator,必须启用PAM和Challenge-Response认证。
如果你想允许根用户使用2FA,那么找到PermitRootLogin参数并将其值设置为yes。它不能是PermitRootLogin no或PermitRootLogin prohibit-password。
PermitRootLogin yes
保存并关闭该文件。接下来,编辑SSH守护进程的PAM规则文件。
sudo nano /etc/pam.d/sshd
要在SSH中启用2FA,请添加以下两行。
#two-factor authentication via Google Authenticator
auth required pam_google_authenticator.so secret=${HOME}/.ssh/google_authenticator

保存并关闭该文件。然后重新启动SSH守护进程,使更改生效。
sudo systemctl restart sshd
从现在开始,SSH守护进程将要求你输入用户密码和验证码(由Google Authenticator生成的一次性密码)。
用2FA进行公钥认证
如果您使用SSH密钥登录SSH服务器,那么请按照以下说明进行操作。
打开SSH服务器的配置文件。
sudo nano /etc/ssh/sshd_config
在文件中找到以下两个参数,并确保它们都被设置为 "YES"。
UsePAM yes
ChallengeResponseAuthentication yes
PAM是可插拔认证模块的缩写。它提供了一个简单的方法来插入不同的认证方法到你的Linux系统。要使用SSH启用Google Authenticator,必须启用PAM和Challenge-Response认证。
如果你想允许根用户使用2FA,那么找到PermitRootLogin参数并将其值设置为yes。它不能是PermitRootLogin no或PermitRootLogin prohibit-password。
PermitRootLogin yes
接下来,在这个文件的末尾添加以下一行。这将告诉SSH守护进程,用户必须同时通过公钥认证和挑战-响应认证。
AuthenticationMethods publickey,keyboard-interactive
保存并关闭该文件。接下来,编辑SSH守护进程的PAM规则文件。
sudo nano /etc/pam.d/sshd
要在SSH中启用2FA,请添加以下两行。
#two-factor authentication via Google Authenticator
auth required pam_google_authenticator.so secret=${HOME}/.ssh/google_authenticator
同时注释以下一行(在开头添加#),以禁用密码验证。
auth substack password-auth

保存并关闭该文件。然后重新启动SSH守护进程,使更改生效。
sudo systemctl restart sshd
从现在开始,你需要使用SSH密钥和谷歌验证码来登录。
注意事项
CentOS / RHEL服务器上的每个用户都需要运行google-authenticator -s ~/.ssh/google_authenticator命令并扫描QR码,才能使用两因素身份验证。如果用户未设置并尝试登录,则将显示错误消息“Permission denied (keyboard-interactive)",权限被拒绝(键盘交互) ”。
紧急暂存代码是您的备用代码。如果您丢失了手机,则可以输入五个紧急暂存代码之一而不是一次性密码来完成两步验证。这些代码仅供一次性使用。
如果你想更改秘钥,只需登录服务器,再次运行google-authenticator -s ~/.ssh/google_authenticator命令更新~/.ssh/google_authenticator文件即可。
3、如何在CentOS/RHEL服务器上禁用SSH双因素认证?
编辑SSH守护进程的PAM规则文件。
sudo nano /etc/pam.d/sshd
删掉下面这行。
auth required pam_google_authenticator.so secret=${HOME}/.ssh/google_authenticator
保存并关闭该文件。如果在/etc/ssh/sshd_config文件中添加了以下一行。
AuthenticationMethods publickey,keyboard-interactive
删除键盘交互式认证方法。
AuthenticationMethods publickey
保存并关闭该文件。然后重新启动SSH守护进程。
sudo systemctl restart sshd
希望本教程能帮助你在CentOS/RHEL服务器上设置SSH双因素认证。