关于 linux:编写 PAM 模块,该模块将从文件中读取密码并登录用户

 2022-02-13 

Writing PAM Module that Will Read Password From File and Log the User In

我正在尝试编写一个 pam 模块,该模块将从文件中读取密码,然后让用户无需输入密码即可登录。

[编辑:文件将存储在外部设备中。 (试图满足两因素身份验证)。这听起来可能很不安全,但文件将使用适当的加密算法进行加密。密钥交换和加密/解密不是问题]

当连接外部设备时,用户只会在登录屏幕(KDM)上输入他的用户名,然后我的 PAM 模块将从设备获取所需的密码,然后登录用户。

我是 PAM 主题的新手,我做了一些研究,但找不到它是否可能(如果是的话)。

如果你能指出解决这个问题的方法,我将不胜感激。


我写的PamUUID模块和Pawe提到的pamusb模块差不多?哈伊丹。将正确的 USB 驱动器插入计算机即可授予用户访问权限。

该模块非常简单,因此您可以针对您的应用程序对其进行编辑。主要是pam_uuid.c文件,可以通过编写对应的pam_uuid.h来配置,非常方便。通过在笔中搜索与 UUID 对应的设备来检测笔。在配置文件中,您只需列出 UUID 用户关联。


答案就在这里:

  • 编写您的自定义 pam 模块。 (可以在互联网上找到大量示例)
  • 随心所欲地读取数据。 (使用您可能喜欢的任何功能从文件或其他东西中读取)
  • 比较散列密码,如下所示:
  • 1
    2
    3
    4
    if ((!pwd->pw_passwd[0] && (flags & PAM_DISALLOW_NULL_AUTHTOK)) ||
          (crypt_password = crypt(password, pwd->pw_passwd)) == NULL ||
          strcmp(crypt_password, pwd->pw_passwd) != 0)
          pam_err = PAM_AUTH_ERR;

    如果匹配,则返回成功。

    就是这样。


    您的问题的 1:1 翻译将使用 PAM 项将密码从您的模块传递到其他模块(例如,就像 try_first_pass / use_first_pass,请参阅 Linux-PAM 源代码)。这应该比较容易,有很多代码示例。

    您可以尝试做的只是识别正确的 USB 密钥。曾经有一个名为 pam_usb 的模块可以做到这一点,请参阅 http://sourceforge.net/projects/pamusb/ 和 https://github.com/aluzzardi/pam_usb


    所以基本上你根本不需要密码。

    你说真正的密码是在一个文件中加密的。用什么钥匙?还有谁可以访问密码文件(加密与否无关紧要)?还有谁可以物理访问登录屏幕?

    每个可以物理访问您的登录屏幕的人只需要知道用户名即可登录。

    这可以通过现有的pam_permit 模块更容易地实现。将那个插入到您的配置中并完成它。有关详细信息,请参阅 man pam_permitman pam.d