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


10

我目前正在将gnupg与雷鸟一起使用,以读取加密的电子邮件。如果我正确理解了交换行为,则包含交换后的电子邮件的内存页可能会交换出去,并在硬盘上留下痕迹,理论上可以稍后对其进行取证。

虽然当然可以在使用敏感文件的过程中仅使用加密的交换文件或全局禁用交换,但这会影响性能,可能会被忘记并需要root特权。

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


2
基本上相关的是,您将创建一个cgroup,调整swappiness,使其永远不会掉出,然后将cgexec雷鸟插入其中。您仍然需要root用户访问权限,但这是管理员级别的解决方案。如果要开发自己的应用程序,则可以使用mlock
布拉奇利,2015年

1
GPG可能已经致电mlock,您应该检查。
史蒂夫·威尔斯

谢谢!我还不了解cgroup,它们听起来很有趣。
user54114

1
@SteveWills 确实如此。不过,不确定雷鸟正在显示解密结果。
user54114

@Bratchley,您能回答一下吗?我不知道您可以为cgroup设置swappiness,这听起来很有趣。
frostschutz 2015年

Answers:


9

在注释中,我建议您创建一个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内存:雷鸟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是启动雷鸟并将PID添加到tasks应用程序的文件中。例如:

    [root @ xxx601〜]#猫/ cgroup /内存/雷鸟/任务

    [root @ xxx601〜]#pidof httpd

    25926 10227 10226 10225 10163 10162 10161 10160 10159 10157 10156 10155 10152 10109

    [root @ xxx601〜]#echo 25926> / cgroup /内存/雷鸟/任务

    [root @ xxx601〜]#猫/ cgroup /内存/雷鸟/任务

    25926

再有,值得一提的是,这从技术上讲并不能阻止交换,但是如果不修改应用程序本身,那可能是最好的选择。我现在刚刚发现memory.memsw.limit_in_bytes,这似乎是强制进行交换操作的更直接的控制方法,但我还没有进行足够的尝试,因此不能完全说出它可以完全解决您的问题。话虽如此,这可能是值得研究的。


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


我认为,要处理@Gilles提到的所有其他fs,您也希望chrootunshared --mount名称空间中使用a 。这样做,我敢打赌最终的性能效果会比加密交换更好。
mikeserv

是的,毫无疑问,管理员只能做很多事情,最终应用程序需要考虑到这类事情,因为管理员级别的控件太多了,而且可以做得很精致。
布拉奇利

即使memory.swappiness=0您认为一个核心转储,是否仍可以检查以揭示任意进程发生了什么?我不知道-但我很好奇。
mikeserv

1
是的,但这几乎适用于所有情况,包括带有mlock的应用程序,但没有MADV_DONTDUMP。但是,大多数时候,担心交换敏感信息的人们都担心笔记本电脑被盗,交换区域被梳理。在他们启动核心转储时,系统已经完全被破坏。
Bratchley

5

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

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

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

同样,即使使用memlock,它也有可能最终出现在交换分区上-当您使用suspend to disk将所有内存写入磁盘时,无论任何非交换首选项如何。

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


5

是的,应用程序可以通过mlock系统调用防止其某些内存被换出。但是,这对于您的情况并不是真正有用。

机密数据不仅在应用程序内存中。它在不同的地方(临时文件结束了/tmp/var/spool等)。雷鸟本身正在显示解密的电子邮件,因此您也必须将其锁定到RAM。

如果你想确保你的磁盘将不包含机密文件的痕迹,你需要为所有以及加密你交换的临时文件(潜在的位置特别,/tmp如果不是tmpfs的,而且大部分/var,除了到您的主目录)。

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


似乎chroot和和一起使用的命名空间容器swapoff将是加密交换的更好替代方案。很好的答案-没有其他答案提到其他文件系统效果。我自己,我只是没有swap-我没有拥有少于4GB RAM的任何计算机,我看不到使用它的任何好处。它的使用仅对涉及到挂起的任何计算机都是实用的-并且很容易编写脚本。
mikeserv

0

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

您可以将应用程序“调优”到最高优先级,例如-20,通过决定何时交换应用程序进程,您仍然可以让OS发挥其最大作用。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.