双因子身份验证就是指,需要两种身份验证才能完成账号有效性的验证,可以是密码、SSH 密钥,也可以是第三方服务,比如 Google Authenticator。这意味着单个验证方式的缺陷,不会影响账号的安全。本文我们将介绍如何在 Debian 服务器上启用双因子验证。
请注意,本文涉及到多次修改 SSH 配置,当你修改配置时,请确保有至少两个到服务器终端的连接。打开的终端将一直保持,即便 SSH 服务重启。第二终端意味着你可以修复你在SSH配置的错误。
密钥和密码验证的SSH
SSH 支持对登录要求不止一个身份验证方法,我们首先启用密钥和密码验证。
在 /etc/sh/sshd_config 中的 SSH 服务器配置文件中的 AuthenticationMethods 选项中设置了身份验证方法。
当在 /etc/ssh/sshd_config 中新加一行配置,如下。这样在建立sshliaSSH 需要提交一个 SSH 密钥,然后提示输入密码:
AuthenticationMethods "publickey,password"
如果你想要对指定用户设置这些方法,那么请使用以下附加配置:
Match User joseph AuthenticationMethods "publickey,password"
当你已经编辑或保存了新的 sshd_config 文件,你应该通过运行以下程序来确保你没有犯任何错误:
sshd -t
任何导致 SSH 不能启动的语法或其他错误都将在这里标记出来。当 ssh-t 运行时没有错误,使用 systemctl 重新启动 SSH:
systemctl reload sshd
现在,你可以使用新终端登录,以核实你会被提示输入密码并需要 SSH 密钥。如果你用 ssh -v,例如 ssh -v joseph@example.com
,你将可以看到登录的每一步,可以加多个v来获取更多的 debug 信息。
注意,如果你确实将密码设置成必需的身份验证方法,你要确保将 PasswordAuthentication 选项设置成 yes。
使用 Google Authenticator 的 SSH
Google 在 Google 自己的产品上使用的双因子身份验证系统可以集成到你的 SSH 服务器中。如果你已经使用了Google Authenticator,那么此方法将非常方便。
虽然 libpam-google-authenticator 是由 Google 编写的,但它是开源的。此外 Google Authenticator 是由 Google 编写的,但不需要 Google 帐户也能工作,多亏了 Sitaram Chamarty 的贡献。
如果你还没有在手机上安装和配置 Google Authenticator,请参阅这里的介绍。
首先,我们需要在服务器上安装 Google Authenticatior 安装包。使用以下命令安装所需的软件包:
apt-get update apt-get install libpam-google-authenticator
现在,我们需要在你的手机上使用 Google Authenticatior 工具注册服务器。这是通过运行我们刚才安装的 Debian 软件包完成的,在命令行下运行:
google-authenticator
运行这个程序时,会问到几个问题。你应该以适合你的设置的方式回答,最安全的选项是对每个问题回答y。如果以后需要更改这些选项,你可以简单地重新运行 google-authenticator 并选择不同的选项。
当你运行 google-authenticator 时,一个二维码会被打印到终端上,二维码下方的代码样例如下:
Your new secret key is: 75YD5PTE6R65BYFR2AWQGUV6FE Your verification code is 781629 Your emergency scratch codes are: 12321432 29069242 34406891 34387624 79357602
你应该将所有这些代码记录到一个像密码管理器一样安全的位置。emergency scratch codes
是单一的使用代码,应急时使用。即使你的手机不可用,它总是允许你访问。
要将服务器注册到Authenticator
App中,只需打开应用程序并点击右下角的红色加号即可。然后选择扫描条码选项,扫描打印到终端的二维码。你的服务器和应用程序现在连接。
回到服务器上,我们现在需要编辑用于 SSH 的 PAM (可插入身份验证模块),以便它使用我们刚刚安装的身份验证器安装包。PAM 是独立系统,负责 Linux 服务器上的大多数身份验证。
需要修改的 SSH PAM 文件位于 /etc/pam.d/sshd ,用以下命令编辑:
vim /etc/pam.d/sshd
在文件顶部添加以下行:
auth required pam_google_authenticator.so
此外,我们还需要注释掉这一行 "@include common-auth”,这样 PAM 就不会提示输入密码,修改后如下:
# Standard Un*x authentication. # @include common-auth
接下来,我们需要编辑 SSH 服务器配置文件:
vim /etc/ssh/sshd_config
改变 ChallengeResponseAuthentication
的值为 yes,以便我们启用键盘交互的认证方式:
ChallengeResponseAuthentication yes
接下来,添加以下代码行来启用两个身份验证方案:SSH 密钥和谷歌认证器(需要键盘交互):
AuthenticationMethods "publickey,keyboard-interactive"
在重新加载 SSH 服务器之前,最好检查一下在配置中没有出现任何错误,执行以下命令测试:
sshd -t
如果没有标识出任何错误,用新的配置重载 SSH:
systemctl reload sshd.service
现在一切都应该开始工作了。现在,当你登录到你的服务器时,你将需要使用 SSH 密钥,并且当你被提示输入:
Verification code:
打开 Authenticator APP 并输入为您的服务器显示的 6 位代码。