如果我是 root 用户,我只需使用 即可解锁任何用户的图形会话,而无需知道他们的密码loginctl unlock-session <session>
。
但是,我可以在不知道密码的情况下以用户身份启动图形会话吗?我可以备份/etc/shadow
、更改密码、登录,然后恢复,但这太麻烦了,一定有更好的方法……对于终端/控制台,我有旧的sudo -i -u <user>
,不需要那个,也许我也可以在图形环境中做类似的事情?
在我的用例中,这是完全合法的。如果重要的话,它是 sddm 和 KDE/Plasma 桌面。
使用 PAM 和单一主密码的解决方案
如果您的 sddm 使用 PAM,那么您可以修改
/etc/pam.d/sddm
并使其接受任何用户的主密码。我们将创建一个辅助脚本,将其标准输入的第一行与单独文件中第一行逐字存储的主密码进行比较。
在 shell 中执行上述代码,它将创建必要的文件。接下来
sudoedit /etc/security/master_password
,用您的主密码替换M4st3rPSSwrd
。(如果您的主密码包含,则在执行代码之前进行替换可能会造成破坏'
。)文件中的主密码应以换行符正确终止。sudoedit /etc/pam.d/sddm
并将以下行放在任何现有auth …
行之前:该行将使 sddm 运行
master_password_check
并通过其 stdin 传递输入的密码。脚本会将其与主密码进行比较,如果匹配则立即允许访问。使用目标用户的常规密码登录的能力不受影响。从现在开始,您可以通过提供主密码以任何用户身份登录 sddm。
笔记
auth sufficient …
行被添加到/etc/pam.d/common-auth
那里,那么许多程序(包括 sddm)将开始接受主密码(因为 PAM 配置文件通常@include common-auth
在适当的地方使用)。/etc/security/master_password
,仅受文件模式保护。如果这还不够,请自行实现对散列主密码的支持。/etc/pam.d/sddm
;使用 PAM 的解决方案,策略配置
sudoers
使用正确的所有权和权限进行创建
/usr/local/bin/use-own-password
。以下 shell 代码将执行此操作:是的,该文件对所有人都可执行。脚本本身完全无害。当它在 PAM 内部运行时,它能够以一个用户的身份登录另一个用户,这得益于它与 PAM 的交互。
接下来
sudoedit /etc/pam.d/sddm
,将以下几行放置在任何现有auth …
行之前:然后运行
sudo visudo
并配置 sudoers:此解决方案不适用于
requiretty
。如有疑问,请使用Defaults !requiretty
。解决方案嵌套
sudo
s。外部sudo
将由 root 运行,以您要使用其凭据的用户身份运行内部 sudo。至关重要的是,外部sudo
不要求输入密码。幸运的是,情况确实如此:root 可以sudo
自由使用,我认为甚至没有办法打破这一点。当且仅当 userA 是允许以 userB 身份运行的 sudoer
/usr/local/bin/use-own-password no-op
时,我们的脚本才会授权以 userB 身份登录 sddm,并使用userA:passwordA
密码字段中提供的用户 A 的凭据。现在,您需要设置 sudoers,以便只有正确的用户才能以正确的用户身份运行脚本。sudoers
文件中的基本行如下:使用
NOPASSWD
此功能将允许任何人以用户 B 的身份登录 sddm,只需声称他们是用户 A(并使用任何密码)。关键是您尚未登录,特别是未以用户 A 的身份登录,并且除了用户 A 的密码外,没有其他方法可以验证您是用户 A。Sddm 只会将userA:whatever
密码字段传递到我们的脚本,在NOPASSWD
这种情况下,它总是会成功。请记住,最后一个匹配项是使用的。例如,您可能希望将上面的示例行用于
use-own-password
并将通用行userA ALL=(userB) NOPASSWD: ALL
用于其他所有内容;那么您应将示例行放在通用行之后,否则NOPASSWD
通用行将适用于 sddm。我认为您应该将所有允许的行use-own-password
放在最后sudoers
(甚至在之后@includedir
)。还请记住,您不需要提及特定行
use-own-password
即可使解决方案起作用。通用行将userC ALL=(userD) ALL
允许用户 C 以用户 D 身份登录 sddm。如果您想专门阻止这种情况,则需要将最后一行转换ALL
为!/usr/local/bin/use-own-password
。请注意,有一些选项(
rootpw
、targetpw
、runaspw
)会sudo
要求输入除调用用户密码之外的其他密码。如果使用,它们会产生干扰。如果配置正确,您将能够以 userB 身份登录 sddm,方法是选择 userB 作为用户并提供
userA:passwordA
密码。冒号是逐字逐句的,它是一个分隔符。工作原理
我们
use-own-password
有两种操作模式,它们由第一个参数选择。首先,PAM 以模式运行脚本
verify
,通过 stdin 提供输入的密码(希望是userA:passwordA
)。脚本从密码字符串中提取身份验证用户的姓名及其实际密码。然后,脚本使用
sudo
以验证用户身份运行另一个实例sudo
,只是以目标用户身份运行自身的另一个实例。另一个实例处于 模式no-op
,它相当于true
,其唯一目的是检查验证用户是否被允许(由sudoers
)以目标用户身份运行脚本:如果是,脚本将成功,sudo
如果否,脚本将首先失败。内部
sudo
从其标准输入读取密码。它是从中提取的密码userA:passwordA
。笔记
userA:passwordA
是分隔符。用户名不能包含:
,因此不会产生哪个冒号是分隔符的歧义。userX:passwordX
第一个。目标用户的密码可能包含:
;这不会破坏一切,因为如果我们的脚本失败,那么/etc/pam.d/sddm
将继续,就像什么都没发生一样,它最终将登录目标用户(如果整个密码确实正确)。userA:passwordA
,其中passwordA
是用户 A 的密码,并且该用户是有权访问我们解决方案的 sudoer。如果是这样,那么原始用户在提供密码时会无意中使用我们的方法和用户 A 的凭据登录。在许多情况下,不会有任何区别,因为他或她无论如何都会登录。只有当/etc/pam.d/sddm
通常会禁止原始用户或执行一些额外操作(例如要求双因素身份验证)时,用户才会注意到。/etc/pam.d/sddm
而不是一个。 这意味着,就您的问题而言,您作为管理员可以对其他用户进行精细控制(通过sudoers
),同时使用方便的主密码来实现您自己的目的。/etc/pam.d/sddm
;/etc/sudoers
。