我正在尝试找到一种在会话期间安全存储数据的方法 - 特别是跳转盒上的密码 - 因此用户只需在跳转盒会话中输入给定目标的密码一次。理想情况下,我什至想从根目录隐藏数据。
尽管我信任具有 root 访问权限的人,但我不一定信任所有以 root 身份运行的程序 - 例如可能会暴露数据的备份。
SELinux 不行——RHEL 上可用的策略需要大量工作,它不可移植,而且,当然,SELinux 很糟糕。
加密不起作用 - 那么我需要找出存储密钥的位置。
运行守护进程并将数据放在那里/使用套接字凭据传递进行身份验证,但是在实现这一点方面需要付出一些努力,并且我希望确信数据在会话结束时被清除(这可能并不总是干净地结束) )。
使用 O_TMPFILE 创建未命名的文件看起来解决了填充数据和在会话结束时清理的许多问题。但是另一个进程如何访问数据呢?我想答案是让拥有进程也打开一个侦听套接字并以这种方式处理请求 - 但有更简单的解决方案吗?
我应该彻底重新考虑这个问题吗?
答案1
您可以使用内核密钥环(特别是keyctl
命令)以安全的方式存储数据。
内核密钥环具有足够的粒度来存储可供特定用户甚至特定会话使用的密钥(因此,如果您在控制台上使用 SSH 连接,或者从两台不同的计算机使用 SSH,则会话将与彼此。)
示例用法是:
$ keyctl add user mypassword supersecret @s
543456789
内核仅在会话上存储名为“mypassword”、值为“supersecret”的密钥(@s
也请考虑@u
用户密钥环。)
您可以使用以下padd
命令从 stdin 读取:
$ echo -n supersecret | keyctl padd user mypassword @s
543456789
然后当你需要检索它时:
$ keyctl print 543456789
supersecret
如果您想从其描述(“mypassword”)中查找它,可以使用以下命令search
:
$ keyctl search @s user mypassword
543456789
(然后使用密钥的 ID 来打印它keyctl print
。)
钥匙圈还有很多功能...如果您想使用它,也许可以先阅读keyctl 的手册页这可能会让您很好地了解支持哪些操作以及要使用哪些密钥环。