Vigorous Pro

The world can always use more heroes.

  1. 1. 安装 Google PAM
  2. 2. 配置 OpenSSH
  3. 3. 配置两步认证
  4. 4. 添加三次认证 (可选)
  5. 5. 恢复访问权限
    1. 5.1. 同时丢失 SSH key 和 MFA 认证
    2. 5.2. 仅丢失 OTP
  6. 6. 参考文章

Google 两步认证,是 Google 公司提供的,一种增强账户安全性的方式。 它使用 TOTP 算法(基于时间的一次性密码算法)。本文尤其感谢

安装 Google PAM

PAM(Pluggable Authentication Module) 是 Linux 系统上用于对用户进行身份验证的身份验证基础结构。由于 Google 制作了一个OATH-TOTP应用程序,他们还制作了一个生成 TOTP 的 PAM,并且与任何 OATH-TOTP应用程序(如 Google Authenticator 或 Authy )完全兼容。
首先,更新 Debian 仓库缓存

1
apt update

并安装 PAM

1
apt install libpam-google-authenticator

运行应用程序

1
google-authenticator
1
Do you want authentication tokens to be time-based (y/n) y

您希望身份验证令牌是基于时间的吗? 回复 y

⚠️此处将会显示二维码,请保证 Shell 窗口足够大,否则会显示错误

1
Your new secret key is: ABCDEFG

无法扫码的话,可以通过手动输入此处显示的密钥来添加

1
2
3
4
5
6
7
Your verification code is 123456
Your emergency scratch codes are:
12345678
12345678
12345678
12345678
12345678

请保存好此处提供的5组应急恢复密钥,您可以在必要时使用

1
Do you want me to update your "/root/.google_authenticator" file (y/n) y

是否更新验证文件? 回复 y

1
2
3
Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y

禁止同一时间使用同一个验证码登陆服务器,回复 y

1
2
3
4
5
6
7
By default, tokens are good for 30 seconds. 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. If you experience problems with
poor time synchronization, you can increase the window from its default
size of +-1min (window size of 3) to about +-4min (window size of
17 acceptable tokens).
Do you want to do so? (y/n) n

默认情况下,验证码有效期为30秒。因为时间可能不同步,可以将时间延长至4分钟 建议选择 n (默认30秒)

1
2
3
4
If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n)

限制尝试次数,每30秒最大可尝试3次,回复 y 启用

配置 OpenSSH

编辑 sshd 文件

1
nano /etc/pam.d/sshd

在文件底部添加以下内容

1
2
3
# Standard Un*x password updating.
@include common-password
auth required pam_google_authenticator.so nullok

nullok 最后一行末尾的单词告诉 PAM 这种身份验证方法是可选的。这允许没有 OATH-TOTP 令牌的用户仍然使用他们的 SSH 密钥登录。一旦所有用户都拥有 OATH-TOTP 令牌,您就可以 nullok 从此行中删除以强制使用MFA。

保存并关闭文件

接下来,配置 SSH 来支持两步认证。

1
nano /etc/ssh/sshd_config

找到 ChallengeResponseAuthentication 并设置为 yes

1
2
3
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes

保存并关闭文件,重新启动 SSH 来重新加载配置文件,不要关闭当前的连接,否则如果配置出现错误,您将无法连接到服务器

1
systemctl restart sshd.service

此时新建一个 SSH 连接, 如果您之前已创建 SSH 密钥并正在使用它,则会注意到您无需输入用户密码或MFA验证码。这是因为默认情况下 SSH 密钥会覆盖所有其他身份验证选项。否则,您应该已经获得密码和验证码提示。

配置两步认证

重新打开 sshd 配置文件

1
nano /etc/ssh/sshd_config

在配置文件最下方添加如下内容,添加后连接服务器时需要有SSH key + 密码 或 SSH key + 验证码 (或者同时输入三项)

1
2
UsePAM yes
AuthenticationMethods publickey,password publickey,keyboard-interactive

保存并关闭文件,再次打开 PAM sshd 配置文件

1
nano /etc/pam.d/sshd

找到 @include common-auth 在句首添加 # ,此举告诉服务器不要提示输入密码

1
2
# Standard Un*x authentication.
#@include common-auth

保存并关闭文件,重新启动 SSH 来重新加载配置文件,不要关闭当前的连接,否则如果配置出现错误,您将无法连接到服务器

1
systemctl restart sshd.service

此时再次新建一个SSH连接, 与上次不同,SSH会要求您输入验证码。输入后,您将成功连接到服务器。即使您没有看到任何使用SSH密钥的迹象,您的登录尝试也会使用两个认证方式。如果要验证,可以在SSH命令后添加-v (for verbose)

1
2
3
4
5
6
7
8
9
# Example SSH output\. . .
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/sammy/.ssh/id_rsa
debug1: Server accepts key: pkalg rsa-sha2-512 blen 279
Authenticated with partial success.
debug1: Authentications that can continue: password,keyboard-interactive
debug1: Next authentication method: keyboard-interactive
Verification code:

添加三次认证 (可选)

现在我们已经成功在 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二次验证登录

本文作者 : Edison Jwa
本文使用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议
本文链接 : https://www.wevg.org/archives/ssh-add-mfa/

本文最后更新于 天前,文中所描述的信息可能已发生改变