我可以在 tty 上激活密码反馈吗?

Joh*_*ith 4 password login keyboard agetty

几周前,我决定清理键盘,结果在将几个键重新装回板上时弄乱了它们。结果,某些字符变得非常难以输入......显然我在密码中使用了其中的一些字符。

当然,我计划更换我的键盘,但与此同时,每天必须在我的 ttys 上进行 4-5 次登录尝试开始让我感到不安(我不使用桌面管理器)。

我已经通过在配置pwfeedback中进行设置来稍微缓解这个问题sudo。这使我能够在键盘跳过字符时“看到”。但是我找不到agettylogin组合的类似选项。

有没有办法激活 tty 登录提示的密码反馈?

Joh*_*ith 5

好吧,我们开始看源代码!

util-linuxlogin当我的登录提示出现时,的程序正在负责。让我们从这里开始,更具体地说是在login-utils/login.c文件中。

现在,login似乎负责提示login,因为它在 中生成提示loginpam_get_prompt并将其注册到 PAM 中init_loginpam。然后该loginpam_auth函数接管,控制权交给 PAMpam_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);
Run Code Online (Sandbox Code Playgroud)

这些论点中没有什么太有希望的,但是……让我们看看定义pam_unix通过了NULL参数promptPAM_AUTHTOKfor item,所以我们最终到了这里。现在,硬编码PAM_PROMPT_ECHO_OFFpam_prompt我来说看起来不太好......

retval = pam_prompt (pamh, PAM_PROMPT_ECHO_OFF, &resp[0], "%s", PROMPT);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,密码PROMPT也是硬编码的(此处),所以我梦想有一个更奇特的密码提示……无论如何,让我们看看这个pam_prompt函数。实际的提示发生在这里,PAM 调用上面几行获取的对话函数。快速浏览一下pam_get_item函数pam_set_item即可了解此处pam_conv定义的结构。

现在,查找有关默认 PAM 会话功能的信息比应有的要困难得多(我认为)。我所看到的所有结构都仍未初始化,并且pam_unix似乎没有定义自己的结构。不过,我设法找到了通用misc_conv函数,该函数传递PAM_PROMPT_ECHO_OFFread_stringand...这里是 PAM 停用输入反馈的地方。

结论:没有密码反馈是硬编码的。太糟糕了。经过一番挖掘,我找到了这个 GitHub 问题这个 Arch BBS 线程。显然,当 PAM 还不是身份验证标准时,该功能就已经可用。我想不再实施它是有道理的——安全性和所有——但你知道,有一个选择会很好。

不管怎样,我刚刚订购了我的新键盘。