Google 两步认证,是 Google 公司提供的,一种增强账户安全性的方式。 它使用 TOTP 算法(基于时间的一次性密码算法)。本文尤其感谢
安装 Google PAM
PAM(Pluggable Authentication Module) 是 Linux 系统上用于对用户进行身份验证的身份验证基础结构。由于 Google 制作了一个OATH-TOTP应用程序,他们还制作了一个生成 TOTP 的 PAM,并且与任何 OATH-TOTP应用程序(如 Google Authenticator 或 Authy )完全兼容。
首先,更新 Debian 仓库缓存
1 |
|
并安装 PAM
1 |
|
运行应用程序
1 |
|
1 |
|
您希望身份验证令牌是基于时间的吗? 回复 y
⚠️此处将会显示二维码,请保证 Shell 窗口足够大,否则会显示错误
1 |
|
无法扫码的话,可以通过手动输入此处显示的密钥来添加
1 |
|
请保存好此处提供的5组应急恢复密钥,您可以在必要时使用
1 |
|
是否更新验证文件? 回复 y
1 |
|
禁止同一时间使用同一个验证码登陆服务器,回复 y
1 |
|
默认情况下,验证码有效期为30秒。因为时间可能不同步,可以将时间延长至4分钟 建议选择 n
(默认30秒)
1 |
|
限制尝试次数,每30秒最大可尝试3次,回复 y
启用
配置 OpenSSH
编辑 sshd 文件
1 |
|
在文件底部添加以下内容
1 |
|
nullok
最后一行末尾的单词告诉 PAM 这种身份验证方法是可选的。这允许没有 OATH-TOTP 令牌的用户仍然使用他们的 SSH 密钥登录。一旦所有用户都拥有 OATH-TOTP 令牌,您就可以 nullok
从此行中删除以强制使用MFA。
保存并关闭文件
接下来,配置 SSH 来支持两步认证。
1 |
|
找到 ChallengeResponseAuthentication
并设置为 yes
。
1 |
|
保存并关闭文件,重新启动 SSH 来重新加载配置文件,不要关闭当前的连接,否则如果配置出现错误,您将无法连接到服务器
1 |
|
此时新建一个 SSH 连接, 如果您之前已创建 SSH 密钥并正在使用它,则会注意到您无需输入用户密码或MFA验证码。这是因为默认情况下 SSH 密钥会覆盖所有其他身份验证选项。否则,您应该已经获得密码和验证码提示。
配置两步认证
重新打开 sshd
配置文件
1 |
|
在配置文件最下方添加如下内容,添加后连接服务器时需要有SSH key + 密码 或 SSH key + 验证码 (或者同时输入三项)
1 |
|
保存并关闭文件,再次打开 PAM sshd
配置文件
1 |
|
找到 @include common-auth
在句首添加 # ,此举告诉服务器不要提示输入密码
1 |
|
保存并关闭文件,重新启动 SSH 来重新加载配置文件,不要关闭当前的连接,否则如果配置出现错误,您将无法连接到服务器
1 |
|
此时再次新建一个SSH连接, 与上次不同,SSH会要求您输入验证码。输入后,您将成功连接到服务器。即使您没有看到任何使用SSH密钥的迹象,您的登录尝试也会使用两个认证方式。如果要验证,可以在SSH命令后添加-v
(for verbose)
1 |
|
添加三次认证 (可选)
现在我们已经成功在 sshd_config 文件中添加并允许了以下认证方式:
- SSH key
- 密码
- MFA 两步认证
尽管我们允许了这三项,但是现在只能通过 SSH key 和 MFA 两步认证来连接到服务器,如果您希望同时启用上面的三种认证方式,修改 PAM 目录下的 sshd
配置文件,将我们之前在@include common-auth
前面添加的 #
删掉,并保存再重新加载 SSH 配置文件即可
到此,本文已经讲述了如何使用 SSH 密钥并同时启用基于时间的 MFA 一次性密码。下面会讲述如何恢复访问权限等内容
恢复访问权限
同时丢失 SSH key 和 MFA 认证
此情况下恢复访问权限,基于您能使用 VNC 或某些厂商提供的恢复模式的情况下,否则请直接去重装系统吧,或者回想一下是否有其他 sudo 账户
上文提到过的密钥和应急恢复代码保存在 ~/.google-authenticator
文件中,第一行即为密钥,重新添加至 OTP 应用程序中即可,您也可以删除此文件(不再使用现有密钥),此时您可以使用单一认证方式登录,登陆后重新运行 google-authenticator
生成新的密钥
仅丢失 OTP
您可以使用初次创建时,系统自动生成的应急恢复代码登录至服务器,每一个恢复代码仅可使用一次
参考文章
Ubuntu Two-Factor Login (public key + Google Authenticator)
How To Set Up Multi-Factor Authentication for SSH on Ubuntu 16.04
使用Google身份验证进行ssh二次验证
Google Authenticator安全配置ssh二次验证登录