可以在应用程序级别禁用交换吗?

可以在应用程序级别禁用交换吗?

我目前正在使用 Thunderbird 和 gnupg 来读取加密的电子邮件。如果我正确理解交换行为,包含解密电子邮件的内存页面可能会被交换出来,并在硬盘上留下痕迹,理论上可以在以后通过取证恢复。

虽然当然可以仅使用加密的交换文件或在使用敏感文件期间全局禁用交换,但它会影响性能,可能会被遗忘并且需要 root 权限。

是否可以将某些文件或程序标记为不可交换?即使没有root权限?是否可以编写一个可以分发给技术上不懂的用户并且其内存内容永远不会交换到磁盘的应用程序?

答案1

在评论中,我建议您创建一个 cgroup,设置memory.swappiness为零(以最小化交换)并在其中运行您的应用程序。如果您这样做了,您的申请大概不会交换,除非您运行的物理内存非常低,以至于为该 cgroup 中的程序交换页面是获得足够物理内存可用的唯一方法。

要在 RHEL 6.5 上执行此操作:

  • 确保该libcgroup软件包已安装。这使您可以访问用户空间工具,例如 cgcreatecgexec

  • 启动并启用该cgconfig服务,以便 cgroup 配置的更改在重新启动之间保持不变。在 RHEL 上,此服务还应该在/cgroup树下安装所需的文件系统。

  • 使用以下命令创建 cgroupcgcreate -g memory:thunderbird

  • 将此组中的 swappiness 设置为零cgset -r memory.swappiness=0 thunderbird

  • 用于cgsnapshot -s > /etc/cgconfig.conf保存服务的更新的持久配置cgconfig(到目前为止的所有更改都是运行时更改。您可能希望将默认配置文件保存在某处,并在将其设为持久配置之前对其进行一次检查。

  • 您现在可以使用在 cgroupcgexec中启动所需的应用程序thunderbird

    [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 堆栈测试

    [root@xxx601 ~]#

我实际上并没有thunderbird安装,否则我就会这样做。不知道为什么上面的格式会混乱。

  • 一种替代方法cgexec是启动 Thunderbird 并将 PID 添加到tasks应用程序的文件中。例如:

    [root@xxx601 ~]# cat /cgroup/内存/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/内存/thunderbird/tasks

    [root@xxx601 ~]# cat /cgroup/内存/thunderbird/tasks

    25926

再次值得一提的是,这在技术上并不能阻止交换,但如果不修改应用程序本身,这可能是您最好的选择。我刚刚发现memory.memsw.limit_in_bytes这似乎可能是对强制存在的更直接的控制交换,但我还没有充分尝试过它,无法真正放心地说它完全解决了你的问题。也就是说,这可能是之后需要研究的事情。


真正的答案是让应用程序mlock敏感信息来解决此类问题。不过,我愿意打赌像 Thunderbird 这样的应用程序确实可以做到这一点,但我对内部结构了解不够,无法对此发表评论。

答案2

应用程序可以锁定其内存,使其无法被交换。

mlock, munlock, mlockall, munlockall - lock and unlock memory

不过,我不知道有什么方法可以从外部影响这一点。必须编写应用程序才能自行使用它。对于邮件来说,这可能特别困难,因为它通常还涉及用于查看附件等的外部程序。

此外,即使使用 memlock,它也有可能最终出现在您的交换分区上 - 当您使用挂起到磁盘时,无论任何非交换首选项如何,都会将所有内存写入磁盘。

首先进行全盘加密会更容易。

答案3

是的,应用程序可以防止其部分内存被换出,方法是mlock系统调用。但是,这对于您的情况并没有多大用处。

机密数据不仅仅存在于应用程序内存中。它最终出现在不同位置的临时文件中(/tmp/var/spool等)。 Thunderbird 本身正在显示解密的电子邮件,因此您也必须将其锁定到 RAM。

如果您想确保您的磁盘不会包含机密文件的痕迹,您需要加密您的交换区以及临时文件的所有潜在位置(特别是,/tmp如果它不是 tmpfs,并且大多数/var,此外当然是到你的主目录)。

加密交换对性能的影响很小甚至为零。加密比磁盘 I/O 快得多。

答案4

我只是在想是否最好从更改应用程序进程的优先级开始,例如使用启动脚本以高优先级启动它nicerenice使用 I/O 优先级更改,ionice然后看看会发生什么发生。

您可以将应用程序“优化”到最高优先级,例如,-20这样您仍然可以通过决定何时交换应用程序进程来让操作系统做它最擅长的事情。

但其他人建议,如果您想要更多控制和粒度,您需要开始查看cgroups和设置memory.swappiness

相关内容