资金安全祈愿:使用多因子认证保护服务器

date
Apr 18, 2023
slug
ssh-mfa
status
Published
tags
ops
summary
type
Post

前言

随着在区块链领域研究的深入,某些服务器中私钥守护着的资产已经达到了危险的数量。曾经被我忽略的安全问题越发凸显。
公私钥验证的方式确实安全,然而:
  1. 使用 VSCode 远程连接,私钥文件必须保存在本地,则安全性全部依赖于密钥对 passphrase 的复杂程度,那和密码登录有什么区别?
  1. 使用 Termius 等客户端,确实能将私钥安全存储,但如果有人就在我没解锁的电脑旁边,他还是可以“点击即连”。
ChatGPT 给出了多因子认证(MFA)的方案。

步骤 by ChatGPT

Q:如果我想在SSH连接时增加一层动态认证,应该如何做

A:要在SSH连接时增加一层动态认证,您可以使用多因素认证(MFA)方法,例如谷歌身份验证器(Google Authenticator)。这将在用户名和密码的基础上添加一个额外的动态验证码,提高安全性。以下是在Linux系统中设置Google Authenticator的步骤:
  1. 安装Google Authenticator模块:
对于基于Debian的系统(例如Ubuntu),使用以下命令:
对于基于RHEL的系统(例如CentOS、Fedora),使用以下命令:
  1. 配置SSH以使用Google Authenticator:
编辑/etc/pam.d/sshd文件,将以下行添加到文件的顶部:
这将启用Google Authenticator PAM模块。
  1. 修改/etc/ssh/sshd_config文件以启用挑战-应答模式:
找到以下行:
将其更改为:
  1. 重启SSH服务以应用更改:
对于基于Debian的系统:
对于基于RHEL的系统:
  1. 对于每个用户,设置Google Authenticator:
以您要使用动态认证的用户身份登录或切换到该用户,然后运行以下命令:
按照提示操作。扫描生成的二维码或输入密钥以将其添加到您的谷歌身份验证器应用程序中。
此过程会在用户的主目录中生成一个名为.google_authenticator的文件,其中包含秘密密钥和配置信息。
  1. 完成设置后,下次登录SSH时,系统将提示您输入Google Authenticator应用生成的动态验证码。
以上步骤将在您的SSH连接中增加一层动态认证,提高系统的安全性。
 

Q:在配置google authenticator的过程中,我遇到这个问题:

By default, a new token is generated every 30 seconds by the mobile app. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. This allows for a time skew of up to 30 seconds between authentication server and client. If you experience problems with poor time synchronization, you can increase the window from its default size of 3 permitted codes (one previous code, the current code, the next code) to 17 permitted codes (the 8 previous codes, the current code, and the 8 next codes). This will permit for a time skew of up to 4 minutes between client and server. Do you want to do so? (y/n) 这是什么意思?
A:这个提示是在询问您是否要允许更大的时间偏移窗口,以解决可能存在的客户端和服务器之间的时间同步问题。
Google Authenticator默认每30秒生成一个新的动态验证码。为了补偿客户端和服务器之间可能的时间偏差,系统允许在当前时间之前和之后使用一个额外的验证码。这意味着,即使客户端和服务器之间的时间差达到30秒,仍然可以进行身份验证。
然而,在某些情况下,时间同步可能会有更大的偏差。因此,这个提示问您是否想要增加允许的时间偏移窗口。默认情况下,允许的验证码数量为3个(前一个验证码、当前验证码和下一个验证码),这使得最大时间偏差为30秒。如果您选择扩大窗口,允许的验证码数量将增加到17个(前8个验证码、当前验证码和接下来的8个验证码),这将允许客户端和服务器之间最多有4分钟的时间偏差。
选择“y”(是)将扩大允许的时间偏移窗口,选择“n”(否)将保持默认设置。如果您不确定,可以先尝试使用默认设置。如果在实际使用中遇到时间同步问题,您可以随时通过再次运行google-authenticator命令来更改此设置。

Q:经过刚才的设置,我发现密码登录会弹出输入谷歌验证码,公私钥匹配登录不会

A:您提到的情况是正确的。当您同时使用公私钥匹配认证和Google Authenticator时,SSH会优先使用公私钥认证。当公私钥认证成功时,服务器不会再请求Google Authenticator的动态验证码。这是因为公私钥认证本身就非常安全,不需要额外的动态验证码。
ChatGPT后面的回答是错误的,下面摘录了 参考资料 中的方法:
  1. /etc/ssh/sshd_config文件中查找AuthenticationMethods这一行,修改或直接在末尾添加该行:
这会告诉 SSH 需要哪些身份验证方法。这一行告诉 SSH 我们需要一个 SSH 密钥和一个密码或一个验证码(或所有三个)
  1. 打开 PAM 配置文件:/etc/pam.d/sshd,告诉 PAM 不要提示输入密码:
对于基于RHEL的系统: 注释掉 password-auth 行
对于基于 Debian 的系统: 注释掉 common-auth 行
  1. 重启 SSH:
or

总结

现在,再通过 SSH 远程登录该服务器,将会要求使用 SSH 密钥和 TOTP 令牌(例如,Google Autheticator 验证码)。注意,此时密码登录已被禁用,所以请一定保管好 SSH 密钥和 TOTP 密钥。
关于使用密码+密钥+验证码、丢失TOTP密钥时恢复访问等内容,请查阅参考资料中的文章。

参考资料

 

© e 2021 - 2024 site logo