我目前正在使用带有 gnupg 的 Thunderbird 来阅读加密的电子邮件。如果我正确理解交换行为,那么包含解密电子邮件的内存页面可能会被换出并在硬盘上留下痕迹,理论上这些痕迹可能会在以后被取证恢复。
虽然在使用敏感文件期间可以只使用加密交换文件或全局禁用交换,但它会影响性能,可能会被遗忘并需要 root 权限。
是否可以将某些文件或程序标记为不可交换?即使没有root访问权限?是否可以编写一个应用程序,该应用程序可以分发给技术上不成熟的用户,并且其内存内容永远不会交换到磁盘?
在评论中,我建议您创建一个 cgroup,设置memory.swappiness为零(以最小化交换)并在其中运行您的应用程序。如果您这样做,您的应用程序可能不会交换,除非您在物理内存上运行得非常低,以至于为该 cgroup 中的程序交换页面是使足够的物理内存可用的唯一方法。
要在 RHEL 6.5 上执行此操作:
确保libcgroup安装了软件包。这使您可以访问用户空间工具,例如 cgcreate和cgexec。
启动并启用该cgconfig服务,以便在重新启动之间对 cgroup 配置的更改保持不变。在 RHEL 上,此服务还应在/cgroup树下挂载所需的文件系统。
创建 cgroup cgcreate -g memory:thunderbird
将此组中的swappiness设置为零 cgset -r memory.swappiness=0 thunderbird
用于cgsnapshot -s > /etc/cgconfig.conf为服务保存更新的持久配置cgconfig(到目前为止,所有更改都是运行时更改。您可能希望将默认配置文件保存在某处并在使其成为持久配置之前对其进行一次检查。
您现在可以使用cgexec在thunderbirdcgroup 中启动所需的应用程序:
[root@xxx601 ~]# cgexec -g 内存:thunderbird ls
anaconda-ks.cfg a.out foreman.log index.html install.log install.log.syslog node.pp sleep sleep.c ssl-build stack test
[root@xxx601 ~]#
我没有thunderbird实际安装,否则我会这样做。不知道为什么上面的格式搞砸了。
一种替代方法cgexec是启动 Thunderbird 并将 PID 添加到tasks应用程序的文件中。例如:
[root@xxx601 ~]# cat /cgroup/memory/thunderbird/tasks
[root@xxx601 ~]# pidof httpd
25926 10227 10226 10225 10163 10162 10161 10160 10159 10157 10156 10155 10152 10109
[root@xxx601 ~]# echo 25926 > /cgroup/memory/thunderbird/tasks
[root@xxx601 ~]# cat /cgroup/memory/thunderbird/tasks
25926
同样,值得一提的是,这在技术上不会阻止交换,但不会修改应用程序本身,这可能是您最好的选择。我刚刚发现memory.memsw.limit_in_bytes这似乎是对强制不进行交换的更直接的控制,但我还没有足够的使用它来真正放心地说它完全解决了您的问题。也就是说,在这之后可能需要研究一下。
真正的答案是使用应用程序mlock敏感信息来解决此类问题。不过,我愿意打赌像 Thunderbird 这样的应用程序确实可以做到这一点,但我对内部结构的了解不够,无法对此发表评论。
应用程序可以锁定它们的内存,使其不能被交换。
mlock, munlock, mlockall, munlockall - lock and unlock memory
Run Code Online (Sandbox Code Playgroud)
不过,我不知道有什么方法可以从外部影响这一点。必须编写应用程序才能单独使用它。对于邮件,这可能特别困难,因为它通常还涉及用于查看附件等的外部程序。
此外,即使使用 memlock,它也有可能最终出现在您的交换分区上 - 当您使用挂起到磁盘时,它将所有内存写入磁盘,而不管任何非交换首选项。
首先进行全盘加密会更容易。