pam_oath

出自 ArchWiki

OATH 工具包为身份验证系统提供一次性密码 (OTP) 组件。它包含一个 PAM 身份验证模块,支持基于事件的 HOTP 算法 (RFC 4226) 和基于时间的 TOTP 算法 (RFC 6238) 等技术。OTP 生成器应用程序适用于 Android、iOS、Blackberry 和其他设备。与 Google Authenticator 类似,该身份验证机制集成到 Linux PAM 系统中。本指南介绍此机制的安装和配置。

安装

安装 oath-toolkit 软件包。

设置 OATH

OATH 种子是一个十六进制数字,每个用户应该是唯一的。要为用户生成新的种子,您可以使用以下命令行

$ openssl rand -hex 10
12345678909876543210
注意: 上述输出种子在本文章中用作示例,绝不能直接使用。

每个用户需要有一个 OATH,并在配置文件 /etc/users.oath 中链接到它。在作为 Root 用户 的情况下,创建文件并插入用户种子

提示: 在一个终端中使用 root 用户权限登录会话,并在另一个终端中修改 PAM 配置。这样,如果您的 PAM 设置出现问题,您仍然可以使用一个帐户登录并修复它,这在远程连接时尤其有用。
/etc/users.oath
# Option User Prefix Seed
HOTP/T30/6 user - 12345678909876543210
警告: 不要将 T 设置为大于 60,否则您将收到错误:(OATH_UNKNOWN_USER:无法找到有关用户的信息)。

如果您需要 HOTP,请使用此配置

/etc/users.oath
# Option User Prefix Seed
HOTP user - 12345678909876543210

确保该文件只能由 Root 用户访问

# chmod 600 /etc/users.oath
# chown root /etc/users.oath

设置 PAM

要仅为特定服务(如 OpenSSH)启用 OATH,您可以编辑文件 /etc/pam.d/sshd 并在文件开头添加以下行

auth	  sufficient pam_oath.so usersfile=/etc/users.oath window=30 digits=6

如果您只输入正确的 OATH 代码,这将允许身份验证。如果您想将 OATH 作为一项要求,并让 PAM 堆栈的其余部分继续处理,请使用以下行代替

auth	  required pam_oath.so usersfile=/etc/users.oath window=30 digits=6

为了使 SSH 登录工作,请确保在 /etc/ssh/sshd_config 文件中启用以下选项

ChallengeResponseAuthentication yes
UsePAM yes

重启 sshd.service 以启用更改。

如果您想强制执行 OATH 请求-响应,即使存在可用的公钥身份验证和密码身份验证,也请在 /etc/ssh/sshd_config 中添加以下内容

AuthenticationMethods publickey,keyboard-interactive:pam
KbdInteractiveAuthentication yes
PasswordAuthentication yes
提示: 对于本地登录,只需编辑 /etc/pam.d/login

使用 OATH 密码登录

对于使用 TOTP 登录

$ oathtool -v --totp -d 6 12345678909876543210
警告: 当 TOTP 模式设置为 SHA512 时存在错误,但开发人员尚未修复它。请参阅 Gitlab 上的未解决问题

如果您使用 HOTP 登录

$ oathtool -v -d 6 12345678909876543210

12345678909876543210 替换为您用户对应的种子。它将输出类似以下内容

Hex secret: 1ab4321412aebc
Base32 secret: DK2DEFASV26A====
Digits: 6
Window size: 0
Start counter: 0x0 (0)

820170

最后面的数字字符串现在可以用作登录代码,但更有趣的是 Base32 密钥,因为它可以转换为 QR 码以便轻松传输密钥。安装软件包 qrencode 以运行以下命令进行转换

$ qrencode -o user.png 'otpauth://totp/user@machine?secret=DK2DEFASV26A===='

相应地更改用户机器DK2DEFASV26A====。完成后,您可以使用您喜欢的图像查看器应用程序可视化您的 QR 码。或者,您可以直接在终端上生成 QR 码,使用

$ qrencode -t UTF8 'otpauth://totp/user@machine?secret=DK2DEFASV26A===='

使用 Aegis AuthenticatorFreeOTP+,然后截取该 user.png(或类似 ASCII 艺术的图像)的屏幕截图,并在需要时使其显示 OTP 密码,这是非常简单的。

注意: 用户的密钥是此系统中最重要信息。一旦您设置手机以提供 OTP,它就拥有该密钥,user.png 文件中的 QR 码也拥有该密钥。您需要格外小心此文件,它们应仅存储在加密介质上(您的手机需要使用加密以获得任何合理的安全级别)。如果不是,甚至要限制在像 Samsung Knox 这样的沙箱中,以防止第三方应用程序可能访问它们。

参见