根据插入的设备不同的密码

根据插入的设备不同的密码

我想为我的帐户设置不同的密码:当(例如)插入某个 USB 记忆棒时,将使用一个简单的密码。这个想法是:如果我离开计算机,那么我会随身携带该棒,然后简单的密码将被禁用。

我的总体想法是:

  1. 使用 udev 检测棒,也许检测其上的某些数据(使用 udev 运行的脚本)并做出相应反应(例如,创建一个文件,当棒被拔出时该文件被删除)。这应该很容易。
  2. 让 PAM 检查该文件是否存在并相应地选择密码数据库。

主要问题可能是(即如果我正确理解问题的结构):可以pam_unix2配置为使用另一个影子文件吗?我刚刚查看了手册页pam_unix2,似乎这是不可能的,因为这个模块让 glibc NSS 做出这个决定。

答案1

pam_unix 和 pam_unix2 都使用 libc 来查找密码哈希,并且 Glibc 具有位置/etc/nsswitch.conf/etc/shadow硬编码。它甚至不会像重新编译pam_unix或那样简单pam_unix2:两者都通过正常的 NSS 机制来验证密码,他们只使用他们的知识/etc/passwd/etc/shadowNIS 来更改密码。

但是,您可以使用pam_pwdfile模块。我从未使用过它,但描述看起来正是你所追求的。

该 PAM 模块允许您使用结构相似的任意命名的文本文件来/etc/passwd验证用户身份。

或者,您可以使用pam_userdb,它检查 Berkeley DB 格式的数据库中的密码,并使用作为参数传递的文件名。

现在,要检测 USB 记忆棒是否存在,您需要另一个 PAM 模块。pam_listfile看起来很适合这份工作。安排一个 udev 规则来安装您的 USB 密钥,并且仅在特定位置安装该 USB 密钥,例如/media/authentication-key;创建一个users.txt包含允许使用较短密码的用户名列表的文件。如果您想在 PAM 堆栈中进行更复杂的测试,可以使用`pam_exec

这是一个堆栈,假设/etc/shadow包含强密码和/etc/passwd.weak弱密码。警告:未经测试,而且我对 PAM 并不熟悉,所以请仔细查看。

auth [success=ignore default=1] pam_listfile.so file=/media/authentication-key/users.txt iter=user sense=allow onerr=fail
auth [success=1 default=bad] pam_unix.so
auth [success=ok default=bad] pam_pwdfile.so pwdfile=/etc/passwd.weak
auth requisite pam_deny.so

答案2

我突然想到,我想到的困难部分可以用一个非常简单的操作来代替:

可能没有必要将 PAM 配置为使用一个密码文件或另一个:应该可以仅替换/etc/shadow为符号链接,并让由 udev 添加和删除事件触发的脚本来替换此符号链接,以便正常PAM 过程(隐式)使用该文件的一个或另一个版本。

这样,在没有硬件令牌的情况下,可以完全阻止某些帐户登录。

答案3

假设你写了一个影子容易带有设备 UUID 的密码文件,该文件授权替换密码、用户名、密码不简单简单密码加密的。

这仅适用于需要简单密码的用户。

可以考虑仅将加密字符串替换为etc/shadow.仅当插入授权设备(带有一些数据......)时。

当您添加/删除用户或修改密码时,2 个加密字符串将不匹配,并且不会发生替换。因此,您需要使用完整密码登录,然后才能以其他方式进行操作。

我不想想象当你接触影子文件时电量不足,或者脚本崩溃时会发生什么……

问题仍然在于它适用于所有类型的登录,甚至是远程登录。即使有人会通过 ssh 发送命令。但它可以运行:)

相关内容