Security

pam_tally2 添加一個額外的失敗登錄

  • September 2, 2020

我正在嘗試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

在哪裡

  • 狀態 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 問題

問題

我在我的一台機器上看到了類似的行為:使用sudo正確的密碼會在pam_tally2’s 的計數器中生成一個條目。

語境

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),那麼這會增加計數器而不減少它,因此它與失敗的嘗試無法區分。

引用自:https://unix.stackexchange.com/questions/432339