跳转到内容

Pam oath

来自 Arch Linux 中文维基

OATH Toolkit 为认证系统提供一次性密码(OTP)组件。它包含一个 PAM 认证模块,支持的技术包括基于消息的 HOTP 算法 (RFC 4226)和基于时间的 TOTP 算法 (RFC 6328)。OTP 生成器应用程序可用于 Android、iOS、Blackberry 和其他设备。与 Google Authenticator 类似,该认证机制整合在 Linux PAM 系统中。本指南展示该机制的安装和配置。

安装

安装 oath-toolkit

设置OATH

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

$ openssl rand -hex 10
12345678909876543210
注意:本文中上述输出种子是作为例子使用,不要直接使用。

每个用户需要有一个 OATH,并在配置文件 /etc/users.oath 中链接到它。使用根用户创建该文件并插入用户种子:

提示:在一个终端登录到具有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

要想只为某个特定的服务启用 OATH,比如 OpenSSH,可以编辑 /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-art 的图像)截图,并在需要时让它显示 OTP 密码,这样十分方便。

注意:你的用户密匙是这个系统中最重要的信息。一旦设置手机来提供 OTP,它就会有这个密钥,user.png 文件中的 QR 码也有这个密钥。需要特别注意这个文件,它应该只存储在加密的媒介上(你的手机需要使用加密,以达到任何合理的安全水平)。如果没有,可以限制在像三星 Knox 这样的沙盒中,以防止第三方应用程序潜在地访问它们。

参见