我可以在 tty 上啟動密碼回饋嗎?
幾週前,我決定清理我的鍵盤,結果弄亂了一些鍵,因為我把它們重新裝回了板上。結果,一些字元變得非常難以輸入……顯然我在密碼中使用了一些上述字元。
我當然打算更換我的鍵盤,但與此同時,每天在我的 tty 上進行 4 到 5 次登錄嘗試開始讓我很緊張(我不使用桌面管理器)。
pwfeedback
通過在我的配置中進行設置,我設法稍微緩解了這個問題sudo
。這使我可以在鍵盤跳過字元時“看到”。但是我找不到agetty
andlogin
組合的類似選項。有沒有辦法為 tty 登錄提示啟動密碼回饋?
好吧,我們去原始碼!
util-linux
的login
程序在我的登錄提示出現時負責。讓我們從那裡開始,更具體地說是在login-utils/login.c
文件中。現在,
login
似乎負責login
提示,因為它在中生成它loginpam_get_prompt
並在 PAM 中註冊它init_loginpam
。然後該loginpam_auth
功能接管,控制轉到 PAM 的pam_authenticate
功能。這意味著login
僅定義使用者名的提示,僅此而已。那麼對於 PAM:我們感興趣的顯然發生在
pam_authenticate
:pam_authenticate 函式用於對使用者進行身份驗證。使用者需要根據身份驗證服務提供身份驗證令牌,通常這是密碼,但也可以是指紋。
現在,基於影子的身份驗證 (
/etc/passwd
,/etc/shadow
) 由pam_unix
模組處理。我的發行版(Arch)通過pam
包提供 PAM,這意味著我們的旅程將繼續到linux-pam.org及其原始碼。modules/pam_unix/pam_unix_auth.c
似乎是一個不錯的起點。PAM 模組通過一個pam_sm_authenticate
函式提供其身份驗證機制,我們在此處找到該函式。密碼(或“身份驗證令牌”,見上文)通過呼叫PAMpam_get_authtok
函式獲取。它在security/pam_ext.h
標頭檔中聲明,所以這就是我們接下來要去的地方。extern int PAM_NONNULL((1,3)) pam_get_authtok (pam_handle_t *pamh, int item, const char **authtok, const char *prompt);
在這些論點中沒有什麼太有希望的,但是好吧……讓我們看看定義。
pam_unix
通過NULL
forprompt
參數和PAM_AUTHTOK
foritem
,所以我們結束了。現在PAM_PROMPT_ECHO_OFF
給我的硬編碼pam_prompt
對我來說看起來不太好……retval = pam_prompt (pamh, PAM_PROMPT_ECHO_OFF, &resp[0], "%s", PROMPT);
順便說一句,密碼
PROMPT
也是硬編碼的(這裡),所以我夢想著有一個更奇特的密碼提示……無論如何,讓我們回到pam_prompt
函式。實際提示發生在這裡,PAM 呼叫從上面獲取的幾行的對話函式。快速瀏覽和函式向我們介紹了此處pam_get_item``pam_set_item
定義pam_conv
的結構。現在,查找有關預設 PAM 對話功能的資訊比它應該做的要復雜得多(我認為)。我到處看,該結構仍未初始化,
pam_unix
似乎沒有定義自己的結構。但是,我設法找到了通用misc_conv
函式,該函式傳遞PAM_PROMPT_ECHO_OFF
給read_string
並且…這裡是 PAM 停用輸入回饋的地方。**結論:**沒有密碼回饋是硬編碼的。太糟糕了。一點點探勘讓我找到了這個 GitHub 問題和這個 Arch BBS 執行緒。顯然,當 PAM 不是身份驗證標準時,該功能就可以使用。我想不再實施它是有道理的——安全和所有——但你知道,一個選項會很好。
無論如何,我剛剛訂購了我的新鍵盤。