Ubuntu使用TOTP作为SSH登录凭证

发布于 2024-02-28  146 次阅读


前言

咱在亚马逊上搞到了个Yubikey 5NFC,这几天在挖掘他的用途;本来想着用yubikey给SSH提供private Key来着,但与咱的软件环境有冲突、未遂,于是就给SSH上了TOTP验证,连Password都省了

注意事项

添加TOTP验证不一定成功,请对设备进行备份处理,以防设置无效无法通过SSH登录设备

1. 准备工作

1.1 环境配置

TOTP功能实现依赖于 Google Authenticator PAM 模块,需手动安装

sudo apt update
sudo apt install libpam-google-authenticator

1.2 生成TOTP Secret Key

使用 google-authenticator 生成Secret Key

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

参数解释:

参数说明
-t使用TOTP(基于时间的OTP)
-c使用HOTP(基于计数器的OTP)
-f强制将配置写入 ~/.google_authenticator
-d不允许重复使用Token
-wToken窗口大小,即允许过早或过晚的Token数量总和
-e指定生成的紧急备用代码数量
-r限速,在单位时间内最大尝试次数
-R限速,指定单位时间,单位:s
e.g:-r 3 -R 30意为每30s最大允许3次登录

运行此命令后,你会得到一个QRCode(没看到?别慌,下面有Secret Key)

使用你的TOTP验证器扫描此QRCode或手动输入Secret Key,并提交得到的Token,模块的配置就完成了

2. SSH配置

2.1 修改SSH PAM 配置

打开 PAM 配置文件

sudo vim /etc/pam.d/sshd

在此文件尾部加上

# TOTP
auth required pam_google_authenticator.so nullok
# Tip:nullok意为告诉用户这个验证方法是可选的,可去掉

禁用Password验证(可选,加注释就好)

# @include common-auth

保存文件并关闭

2.2 修改SSH配置

打开 SSH 配置文件

sudo vim /etc/ssh/sshd_config

禁用公私钥验证(可选)

PubkeyAuthentication no

接下来,在 /etc/ssh/sshd_config.d/ 新建一个 totp.conf

sudo vim /etc/ssh/sshd_config.d/totp.conf

并添加以下配置:

# 禁用密码验证(可选)
PasswordAuthentication no
# 启用质询-响应验证
ChallengeResponseAuthentication yes

AuthenticationMethods keyboard-interactive
# Tip:验证方法组根据自己的需求添加
# 仅TOTP登录: keyboard-interactive
# 公私钥验证 + TOTP : publickey,keyboard-interactive
# 密码 + TOTP:password,keyboard-interactive
# 公私钥 + 密码 + TOTP:publickey,password,keyboard-interactive

保存配置并退出,重启sshd服务

sudo systemctl restart sshd.service

警告:不要退出当前ssh session,以免配置错误导致无法登录!

不妨尝试开一个新的session,验证一下?;)

End. 迁移

如果想多个用户使用同一个TOTP Token,只需将当前用户根目录下的 .google_authenticator 文件复制到目标用户根目录即可~


世界上本没有博客,直到有了程序员