说明:
- 在 XSession 内工作。
- 一些(背景)deamon 需要提示我输入密码。
如何让守护进程使用 Xsession 中的弹出窗口提示我输入密码?
守护进程通常没有与 X 会话的链接,这使得很难生成提示密码弹出窗口。
一些答案的想法:
- A小程序执行(派生/子)守护进程,这使得 X-prompt-popup-window 最好。越小越好:)
- 安全第一尽管我怀疑是否可行,但任何能够确保在输入密码时,该 X 会话中运行的其他应用程序都无法进行键盘记录的解决方案都值得赞赏。
答案1
此类问题通常通过两个独立的二进制文件来处理:服务守护程序和通过网络进行通信的用户界面。UNIX 域套接字(或者网络套接字,以防它们不在同一台计算机上运行)。一个主要的例子是 OpenSSH - 检查如何进行ssh-agent
,ssh-add
并ssh
进行交互以了解如何完成此操作。将“UNIX 域套接字”替换为“D总线“如果您想变得时尚或需要一些必须实现的额外功能。
如果操作请求来自守护进程本身(如果我理解正确的话)是您的特殊情况,那么这就有点棘手。 UI 部分有时应该在 X 会话期间生成,向守护进程注册自身,当守护进程决定需要一些输入时,它会要求 UI 部分执行其操作。最后两句实际上是 D-Bus 可能派上用场的地方。
另一方面,您应该仔细考虑,守护进程主动请求密码是否是做事的正确方式TM - 守护进程通常是应答请求而不是生成请求的服务。当用户决定是时候这样做时,让 UI 主动推送密码可能会更好。我并不是说这是唯一的好方法,只是说应该首先彻底考虑。
就安全性而言,一切都取决于您想要的偏执程度。使用 X 你可以抓住键盘(参见XGrabKeyboard(3)
手册页),这应该为您提供合理的安全级别。或者更好地说:如果您不使用它,您就无法控制密码。同样,ssh 是一个很好的例子:看看x11-ssh-askpass
帮助程序。它是主页似乎不再起作用,但是您可以在很多地方找到源代码,例如在openSUSE 构建服务。
实际上,您甚至可以直接使用它,因为它所做的只是抓取键盘并在其标准输出上输出输入的密码,因此您所需要做的就是生成 Askpass 帮助程序并检查其stdout
.如果我没记错的话readpass.c
在 OpenSSH 中应该会给你一些关于如何做的想法。
虽然所有这一切可能看起来有点过于复杂并且远不安全,但有几件事需要考虑:
一些通常被认为相当安全的项目(例如 OpenSSH 和 GPG)都使用这种方法。
安全是难的。推出自己的安全解决方案通常会以某种方式以麻烦(或灾难)结束(它也可能成为通常的企业:“我有这个很酷的东西。” - “哇,让我们把它变成一个新的公司工具” - 5 年后:“它完全不可扩展/损坏/不安全/... - 怎么会有人把它变成一个公司范围的解决方案?!”用“我们的旗舰产品”代替“全公司范围的解决方案”,以消除数小时的笑声)。另请参阅规范的安全 SE 问答:https://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own和https://security.stackexchange.com/questions/2202/lessons-learned-and-misconceptions-regarding-encryption-and-cryptology。
键盘抓取并没有说明任何其他应用程序没有窃听堆栈更深处(即在 X 应用程序层下)的键盘事件。但话又说回来,这样的应用程序很可能需要某种根访问权限,因此,如果您的系统上有类似的东西,您不妨将密码放入
passwords.txt
在您的主目录中命名的纯文本文件中)。