Sudo

使用錯誤密碼的 Active Directory 管理員組成員 SUDO 成功

  • February 12, 2021

環境:

 OS: FreeBSD 12.1-Release-p10
 Sudo: 1.9.5p2
 Samba: 4.13.1_1

我們最近遷移到了 Active Directory 後端,以提供 DNS、DHCP 和內部 SSO 支持。我的 SSH 登錄執行良好,使用 PAM 通過 Samba/Winbindd 設置進行身份驗證。我想通過 AD 組成員資格控制誰可以使用 sudo(現在只是 root)。

為此,我在 AD 中創建了一個名為“Unix Admins”的新組,我希望 sudo 檢查其成員資格,就像它對本地使用者和 wheel 組所做的那樣。為此,我只是複制了現有的輪子條目,並有兩個組檢查線,如下所示:

%wheel ALL=(ALL) ALL
%Unix\ Admins ALL=(ALL) ALL  

當一個不在輪子或新組中的 AD 使用者登錄並嘗試使用 sudo 時,他們會收到關於不在 sudoers 文件中的正常錯誤,正如預期的那樣。當他們AD 組中但不在輪子中時,系統會提示他們輸入密碼,如果他們正確輸入密碼,命令將按預期執行。

但是,當他們輸入錯誤的密碼時,會顯示一條錯誤消息,考慮到這種情況,這個消息有點神秘,然後該命令無論如何都會執行,就好像他們輸入了正確的密碼一樣。

錯誤發生如下:

% sudo ls
Password:
When trying to update a password, this return status indicates that the value provided as the current password is not correct.
<<ls output here>>

編輯:為清楚起見進行了編輯。

Edit2: /etc/pam.d & /usr/local/etc/pam.d 相關內容

/usr/local/etc/pam.d/sudo

#
# $FreeBSD: branches/2021Q1/security/sudo/files/pam.conf 340872 2014-01-24 00:14:07Z mat $
#
# PAM configuration for the "sudo" service
#

# auth
auth            include         system

# account
account         include         system

# session
# XXX: pam_lastlog (used in system) causes users to appear as though
# they are no longer logged in in system logs.
session         required        pam_permit.so

# password
password        include         system

/etc/pam.d/system

#
# $FreeBSD: releng/12.1/lib/libpam/pam.d/system 197769 2009-10-05 09:28:54Z des $
#
# System-wide defaults
#

# auth
auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            requisite       pam_opieaccess.so       no_warn allow_local
#auth           sufficient      pam_krb5.so             no_warn try_first_pass
#auth           sufficient      pam_ssh.so              no_warn try_first_pass
auth            sufficient      pam_unix.so             no_warn try_first_pass nullok
auth            sufficient      pam_winbind.so          try_first_pass

# account
#account        required        pam_krb5.so
account         required        pam_login_access.so
account         required        pam_unix.so

# session
#session        optional        pam_ssh.so              want_agent
session         required        pam_lastlog.so          no_fail

# password
#password       sufficient      pam_krb5.so             no_warn try_first_pass
password        required        pam_unix.so             no_warn try_first_pass

FreeBSD 中的 PAM 模組不像我們想像的那樣在 Linux 中工作,並且實際上按照文件說明的那樣工作。

問題出在 auth 部分中關於 OPIE 系統的前面模組中。這些模組預設處於活動狀態,並且對於未在其帳戶中初始化 OPIE 的使用者總是成功的——老實說,基本上每個人都是如此。即使所有“正常”身份驗證模組都返回失敗,如果這些模組設置為“足夠”或“可選”,這也會導致通過身份驗證小節。

解決方案是刪除引用兩個 OPIE 模組的行。

這是您的問題,“系統文件已修改為包含pam_winbind,並將pam_unix模組從更改requiredsufficient”。

花時間閱讀Linux PAM 管理員指南第 4.1 章是非常值得的(是的,我知道你在使用 FreeBSD),這樣你就可以理解我在這裡解釋的細節。

當您pam_unix設置為 時,它會根據密碼的有效性required立即返回成功失敗。當您將其更改為它時,sufficient它只會返回成功,否則會繼續。現在沒有失敗模式

您的auth堆棧現在可以返回成功或預設值,恰好是success。要解決此問題,請添加 adeny作為最後一個堆棧條目auth

# auth
auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            requisite       pam_opieaccess.so       no_warn allow_local
auth            sufficient      pam_unix.so             no_warn try_first_pass nullok
auth            sufficient      pam_winbind.so          try_first_pass
auth            required        pam_warn.so
auth            required        pam_deny.so

pam_warn如果您不希望 PAM 記錄身份驗證失敗,請評論該條目。


PAM 堆棧的有用關鍵字

  • required-失敗最終會導致堆棧返回失敗,但只有在剩餘模組執行完畢之後
  • requisite-失敗將立即返回
  • sufficient-成功將立即返回,除非失敗required已經掛起

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