我正在驗證用戶,我想確定用戶是否已知(有效的現有用戶名)或未知。如何確定用戶是否已知或未使用pam_authenticate?
int ret = pam_authenticate(pamh, PAM_DISALLOW_NULL_AUTHTOK);
現在,即使用戶名是未知的,pam_authenticate
回報PAM_AUTH_ERR
代替(預期)PAM_USER_UNKNOWN
。
如何查找用戶名是否已知?
我正在驗證用戶,我想確定用戶是否已知(有效的現有用戶名)或未知。如何確定用戶是否已知或未使用pam_authenticate?
int ret = pam_authenticate(pamh, PAM_DISALLOW_NULL_AUTHTOK);
現在,即使用戶名是未知的,pam_authenticate
回報PAM_AUTH_ERR
代替(預期)PAM_USER_UNKNOWN
。
如何查找用戶名是否已知?
由於程序將運行在內部,您可以通過讀取/etc/passwd
來檢測用戶名是否存在。該文件的第一個條目是用戶名。 PAM本身並不知道用戶名是否存在EJP指出的原因。
由於用戶數據庫可能沒有存儲在那裏,因此您可能需要使用「getent passwd username」命令或其等效命令。 – Basilevs
這裏的結果取決於系統使用的後端結果。 這些後端及其順序在/etc/nsswitch.conf中設置
他們在形式:
passwd: files MODNAME
group: files MODNAME
hosts: files dns
哪裏 「的modname」 對應於位於文件: /lib64/security/pam_MODNAME.so
(或/ lib目錄/ 32位系統的安全性)。
Modname可以是類似compat
或ldap
或任何網絡相關的數據庫。
您將在pam_authenticate中獲得的結果取決於您的/etc/pam.d/
配置和配置。
如果您在「passwd」部分中有「file」以外的任何內容,請嘗試刪除輔助後端(但要注意保留一種方法來恢復它)。
如果只有「files」數據庫(女巫對應於/ etc/passwd和/ etc/shadow),您仍然沒有收到「PAM_USER_UNKNOWN」,它肯定與PAM有關。否則,它是後端相關的。
目的是值得懷疑的。通常認爲區分「未知用戶」和「密碼不正確」的做法很糟糕,因爲它會向攻擊者泄露信息。 – EJP
@EJP:只有內部記錄需要區別。 –
攻擊者可以是內部的也可以是外部的。 – EJP