Login

我可以在 tty 上啟動密碼回饋嗎?

  • September 9, 2018

幾週前,我決定清理我的鍵盤,結果弄亂了一些鍵,因為我把它們重新裝回了板上。結果,一些字元變得非常難以輸入……顯然我在密碼中使用了一些上述字元。

我當然打算更換我的鍵盤,但與此同時,每天在我的 tty 上進行 4 到 5 次登錄嘗試開始讓我很緊張(我不使用桌面管理器)。

pwfeedback通過在我的配置中進行設置,我設法稍微緩解了這個問題sudo。這使我可以在鍵盤跳過字元時“看到”。但是我找不到agettyandlogin組合的類似選項。

有沒有辦法為 tty 登錄提示啟動密碼回饋?

好吧,我們去原始碼!

util-linuxlogin程序在我的登錄提示出現時負責。讓我們從那裡開始,更具體地說是在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通過NULLforprompt參數和PAM_AUTHTOKfor item,所以我們結束。現在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_OFFread_string並且…這裡是 PAM 停用輸入回饋的地方。

**結論:**沒有密碼回饋是硬編碼的。太糟糕了。一點點探勘讓我找到了這個 GitHub 問題這個 Arch BBS 執行緒。顯然,當 PAM 不是身份驗證標準時,該功能就可以使用。我想不再實施它是有道理的——安全和所有——但你知道,一個選項會很好。

無論如何,我剛剛訂購了我的新鍵盤。

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