Pam oath
OATH Toolkit 为认证系统提供一次性密码(OTP)组件。它包含一个 PAM 认证模块,支持的技术包括基于消息的 HOTP 算法 (RFC 4226)和基于时间的 TOTP 算法 (RFC 6328)。OTP 生成器应用程序可用于 Android、iOS、Blackberry 和其他设备。与 Google Authenticator 类似,该认证机制整合在 Linux PAM 系统中。本指南展示该机制的安装和配置。
安装[编辑 | 编辑源代码]
设置OATH[编辑 | 编辑源代码]
OATH 种子是一个十六进制数字,每个用户应该唯一。为了给一个用户生成一个新的种子,可以使用下面的命令:
$ openssl rand -hex 10
12345678909876543210
每个用户需要有一个 OATH,并在配置文件 /etc/users.oath
中链接到它。使用根用户创建该文件并插入用户种子:
/etc/users.oath
# Option User Prefix Seed HOTP/T30/6 user - 12345678909876543210
如果需要 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
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 Authenticator 或 FreeOTP+,然后对该 user.png
(或类似 ASCII-art 的图像)截图,并在需要时让它显示 OTP 密码,这样十分方便。
user.png
文件中的 QR 码也有这个密钥。需要特别注意这个文件,它应该只存储在加密的媒介上(你的手机需要使用加密,以达到任何合理的安全水平)。如果没有,可以限制在像三星 Knox 这样的沙盒中,以防止第三方应用程序潜在地访问它们。