如何在 Ubuntu 20.04 中使用二步验证 (Two-Factor Authentication)

已关闭留言

二次验证是目前比较常用的安全手段,通过设置二次验证,我们可以有效的避免账户密码可能的泄露导致的账户信息泄露,因为每次登录前我们都需要获取一个一次性验证码,没有验证码就无法成功登录。二次验证也叫两步验证、两步验证等。本文中老唐将说明如何在 Ubuntu 20.04 上使用 Google Authenticator PAM 模块进行 SSH 和 sudo 身份验证。

文章目录
隐藏
一、准备工作
二、安装 PAM 模块
三、生成二次验证代码
四、配置 SSH
五、配置 sudo 二次验证
六、从二次验证锁定中恢复

一、准备工作

  • Ubuntu 20.04 VPS 服务器
  • 二次验证 App,比如谷歌的
  • SSH 权限

VPS 推荐可以参考《#老唐推荐# 最好用的国内云服务器、国外便宜 VPS 推荐》。

二、安装 PAM 模块

通过 SSH 登录 Ubuntu 20.04 系统的 VPS,使用下面命令安装 Google Authenticator PAM 模块:

sudo apt install libpam-google-authenticator

三、生成二次验证代码

使用下面命令运行 Google Authenticator 设置程序:

google-authenticator -t -f -d -w 3 -e 10 -r 3 -R 30 

选项说明:

  • -t : 使用 TOTP 验证
  • -f : 将配置保存到 ~/.google_authenticator
  • -d : 不允许重复使用以前使用的令牌
  • -w 3 : 允许的令牌的窗口大小。 默认情况下,令牌每 30 秒过期一次。 窗口大小 3 允许在当前令牌之前和之后使用令牌进行身份验证以进行时钟偏移。
  • -e 10 : 生成 10 个紧急备用代码
  • -r 3 -R 30 : 限速,每 30 秒允许 3 次登录

更多帮助信息可以使用 --help 选项查看。

程序运行后,将会更新配置文件,并且显示下面信息:

  • 二维码,您可以使用大多数身份验证器应用程序扫描此代码。
  • 一个秘密的钥匙,如果您无法扫描二维码,请在您的应用中输入此密钥。
  • 初始验证码,该验证码将在30秒后失效。
  • 10 个一次性使用紧急代码的列表。

四、配置 SSH

下面这些步骤将禁用密码身份验证,SSH 密钥将被来登录,并且将启用 2FA。

1、修改 SSH PAM 配置文件:

sudo vim /etc/pam.d/sshd

2、添加下面内容到配置文件:

auth required pam_google_authenticator.so nullok

3、禁用密码验证(添加 # 将其注释):

# @include common-auth

4、保存并关闭文件(:wq)

5、修改 SSH 配置文件:

sudo vim /etc/ssh/sshd_config

6、将 ChallengeResponseAuthentication 设为 yes:

ChallengeResponseAuthentication yes

7、检查下面几个设置项是否正确设置:

PasswordAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

8、保存并关闭文件。

9、重启 SSH 服务:

sudo systemctl restart ssh

10、重新登录 VPS,需使用 SSH 密钥,并且需要二次验证。

五、配置 sudo 二次验证

1、编辑 /etc/pam.d/common-auth

sudo vim /etc/pam.d/common-auth

2、添加下面内容:

auth required pam_google_authenticator.so nullok

3、保存并退出。

六、从二次验证锁定中恢复

1、紧急备份

如果您无法访问身份验证器应用程序,请使用您的紧急备用代码之一。 该代码仅供一次性使用。

2、禁用特定用户的二步验证

修改 /etc/ssh/sshd_config 文件,找到下面的选项:

AuthenticationMethods publickey,keyboard-interactive

移除 keyboard-interactive

AuthenticationMethods publickey

之后保存文件,并且重启 SSH:

sudo systemctl restart ssh