我正在尝试pam_tally2
在/etc/pam.d
银河系中使用
我将sshd更改为以下内容
#%PAM-1.0
auth required pam_securetty.so
auth required pam_tally2.so deny=3 unlock_time=600
auth required pam_env.so
auth required pam_unix.so
auth required pam_nologin.so
account required pam_unix.so
password required pam_unix.so
session required pam_limits.so
session required pam_unix.so
session required pam_lastlog.so nowtmp
session optional pam_mail.so standard
我创建了一个测试帐户;登录之前,我测试了登录失败次数:
pam_tally2 -u tst3402
(empty)
现在我使用正确的密码登录(这是由expect
脚本完成的,密码类似于aaa12BBB,
)
spawn ssh -l tst3402 172.9.2.1
Password:
No mail.
Last login: Tue Mar 20 14:25:17 2018 from 172.2.2.2
tst3402@hostname:~>
status OK
在哪里
- 状态正常发送者:
expect
我重新检查失败计数
pam_tally2 -u tst3402
Login Failures Latest failure From
tst3402 1 03/20/18 14:25:17 172.2.2.2
这意味着在成功登录 3 次后,该帐户将被锁定。
问题
为什么登录成功后pam_tally2
看到1次失败?
通常的嫌疑人:
我知道我可以使用 ssh 密钥,但我受到了 ISAE3420 的诅咒
使用 ssh -vvv -l ...我看到两个交换..我应该看到 2 个失败?
debug3: send packet: type 50 debug3: receive packet: type 51
没有 SELinux
我在 security.SE 中没有找到任何 pam_tally2 问题
答案1
问题
我在我的一台机器上看到类似的行为:使用sudo
正确的密码会在pam_tally2
计数器中生成一个条目。
语境
该pam.d/sudo
条目是默认条目,非常简单:
session required pam_env.so readenv=1 user_readenv=0
session required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
@include common-auth
@include common-account
@include common-session-noninteractive
在 中,我在顶部行之前common-auth
添加了行:pam_tally2.so
pam_unix.so
auth required pam_tally2.so onerr=fail audit deny=5 unlock_time=900
# here are the per-package modules (the "Primary" block)
auth [success=1 default=ignore] pam_unix.so nullok_secure
# here's the fallback if no module succeeds
auth requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth required pam_permit.so
# and here are more per-package modules (the "Additional" block)
auth optional pam_cap.so
解释
手册pam_tally2
页指出(重点是我的):
身份验证阶段首先增加尝试登录计数器并检查是否应拒绝用户访问。如果用户已通过身份验证并且登录过程在调用 pam_setcred(3) 时继续它重置尝试计数器。
所以,到目前为止,我相信堆栈没有正确调用pam_setcred
.没有文件pam.d
被调用pam_setcred
(它甚至没有安装在我的系统上)。
解决方案
在示例中,手册页指出(强调我的):
该模块不必被调用在账户阶段因为登录正确调用了 pam_setcred(3)。
因此,如果没有调用pam_setcred
,则需要在该account
阶段调用该模块。
我编辑了pam.d/common-account
文件并在顶部添加了:
account required pam_tally2.so
当用户设法进行身份验证时,这将重置计数器。
去做
如果用户取消身份验证(例如,在提示输入密码时按 Ctrl+C),则计数器会增加而不减少,因此无法将其与失败的尝试区分开来。