在本教程中,您将学习如何在CentOS 7上使用一次性密码进行SSH上的双重身份验证。
无论您托管什么类型的数据,保护对CVM的访问权限都是防止您的信息泄露的重要手段。默认情况下,您需要密码才能登录,您还可以配置密钥对以获得更高的安全性。但是,我们还可以用另外一种方法令其更安全:那就是基于时间的一次性密码(TOTP)。
TOTP允许您使用一次性密码(每30秒更改一次)为SSH启用双重身份验证。通过将此方法与常规密码或公钥(或两者)相结合,您可以添加额外的安全层,从而进一步确保您的服务器得到充分保护。
本教程将说明如何安装必要的软件,配置系统以使用双重身份验证(2FA),并将TOTP与现有安全功能结合使用。
sudo yum update && sudo yum upgrade
注意 本教程是为非root用户编写的。您需要具有
sudo
权限。
在本节中,我们需要在您设备上安装相关软件,以便在CentOS 7上设置双重身份验证。该软件将在您的CVM上生成密钥,然后将其与客户端设备上的应用程序配对,生成一个一次性密码。
安装必要的软件包来启用EPEL存储库,该存储库托管您正在查找的软件包:
sudo wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo rpm -Uvh epel-release-latest-7.noarch.rpm
接下来,安装您将用于生成密钥和密码的软件包:
sudo yum install liboath gen-oath-safe pam_oath
CentOS 7使用几个OATH库来生成其密钥。它生成的TOTP与Google身份验证器以及各种其他流行的身份验证应用程序兼容。
既然已经安装了软件包,您将使用它们来生成密钥。客户端设备上的软件使用这些密钥生成TOTP。要了解这些密码与您已使用的密码之间的区别,让我们来分解一下TOTP概念:
以下说明将允许您指定要为其生成密码的用户。如果要为多个用户配置双重身份验证,请对每个用户执行以下步骤。
注意 请务必准备好您的手机或移动设备,因为您需要将密码添加到身份验证器。如果您尚未下载验证器应用程序,请下载。
gen-oath-safe example-user totp
替换example-user
为您启用双因素身份验证的用户名。totp
选项指定基于时间的一次性密码,而不是基于计数器的密码。
您还会注意到QR码上方和下方显示的一些其他信息。值得注意的是,URI
这行开头的密钥为您提供了一个十六进制代码,您可以使用它来手动配置设备上的代码。您还会在包含用户名的行上看到另一个十六进制代码。第二个十六进制代码将类似于以下内容:
HOTP/T30 example-user - 961497ad4942e19507006c1e849ab271c1f1cb75
/etc/liboath/users.oath
中,该文件将存储每个用户的密钥:echo 'HOTP/T30 example-user - 961497ad4942e19507006c1e849ab271c1f1cb75' | sudo tee /etc/liboath/users.oath
您已完成生成密钥并将其添加到客户端的过程,但在这些设置生效之前需要一些其他配置。请仔细阅读本教程中的以下部分,以获取有关如何对所有SSH登录尝试进行双重身份验证的说明。
本教程中的TOTP身份验证方法使用PAM或可插入身份验证模块。PAM将低级认证机制集成到可以为不同应用程序和服务配置的模块中。因为您正在使用其他软件,所以您需要配置PAM以正确验证用户身份。
警告 强烈建议您在配置身份验证设置时打开另一个终端会话。如果断开连接以测试身份验证或未正确配置某些内容时,您不会被锁定在CVM之外。您也可以使用Lish重新获得访问权限。
/etc/pam.d/sshd
,并添加下面那些引用pam_oath.so
的行(此处已注释标记,但您可以省略#
后面的所有内容)。该行必须在指定的行之间添加:auth required pam_sepermit.so
auth substack password-auth
auth required pam_oath.so usersfile=/etc/liboath/users.oath window=10 digits=6 #Add this line
auth include postlogin
此行指定了四个条件:作为附加身份验证方法的PAM OATH模块,用户文件的路径,指定将接受密码短语的窗口(以说明潜在的时间同步问题),以及6位数字验证码。
注意 如果您按照其余说明进行操作并发现仍无法连接,请尝试添加
debug=1
到password-auth
行尾,以便在身份验证失败时为您提供更多信息: auth required password-auth debug=1
/etc/ssh/sshd_config
,替换example-user
为您要为其启用双重身份验证的任何系统用户。这里包含注释(以#开头),但不应添加到实际配置文件中:# This line already exists in the file and should be changed from 'no' to 'yes'
ChallengeResponseAuthentication yes
...
# These lines should be added to the end of the file
Match User example-user
AuthenticationMethods keyboard-interactive
如果您为多个用户创建了TOTP并且您希望它们都使用双因素身份验证,请为每个用户创建额外的Match User
块,并复制上面显示的格式。
注意 如果要全局强制执行双重身份验证,则可以在
Match User
之外单独使用AuthenticationMethods
指令。但是,在向所有用户提供双重凭证之前,不应该这样做。
sudo systemctl restart sshd
恭喜!现在启用了双重身份验证。当您通过SSH连接到CVM时,身份验证过程将按如下方式进行:
注意 如果您的SSH客户端在您输入双重令牌之前断开连接,请检查是否为SSH启用了PAM。您可以通过编辑
/etc/ssh/sshd_config
来执行此操作:查找UsePAM
并将其设置为yes
。不要忘记重新启动SSH守护程序。
此部分是可选的。如果您想使用公共密钥身份验证而不是TOTP密码,请按照下列步骤操作:
注意 在完成本节之前,请确认您的公钥已复制到您的CVM。通过在终端中输入
ssh-add -l
来查看已安装的SSH密钥。
PasswordAuthentication
为no,
修改/etc/ssh/sshd_config
文件中的AuthenticationMethods
行:PasswordAuthentication no
...
Match User example-user
AuthenticationMethods publickey,keyboard-interactive
根据需要为每个用户在AuthenticationMethods
指令中配置此设置。当这些用户中的任何一个登录时,他们将需要提供他们的SSH密钥,并且他们也将通过TOTP进行身份验证。请务必重新启动SSH守护程序以应用这些更改。
/etc/pam.d/sshd
文件中的以下行:# auth substack password-auth
您现在应该能够使用SSH密钥作为第一种身份验证方法并将验证码作为第二种身份验证方法登录。要测试您的配置,请注销并尝试通过SSH再次登录。您将被要求提供6位数的验证码,因为密钥验证不会产生提示。
警告 如果您或您系统上的用户使用此方法,请确保SSH密钥和身份验证器应用程序位于不同的设备上。这样,如果一台设备丢失或受损,您的凭据仍将是独立的,双重身份验证的安全性将保持不变。
对TOTP使用双重身份验证时,需要考虑的重点是您已配置身份验证器应用程序的设备的物理安全性。请确保您的手机或设备使用密码保护,以便即使它落入坏人之手。如果您丢失了存储凭据的电话或设备,则可以使用控制台访问您的CVM并禁用双重身份验证。如果发生这种情况,您应该在此期间切换到另一种强化的SSH访问方法,例如公钥认证。
虽然双重身份验证是一项不错的安全功能,但总体的安全性是一个持续的过程,而不是仅仅通过添加额外的身份验证层就可以实现的。如果想为您的数据提供最佳保护,请始终进行安全的操作。更多Linux教程请前往腾讯云+社区学习更多知识。
参考文献:《Use One-Time Passwords for Two-Factor Authentication with SSH on CentOS 7》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。