可以在應用程序級別禁用交換嗎?
我目前正在使用帶有 gnupg 的 Thunderbird 來閱讀加密的電子郵件。如果我正確理解了交換行為,則包含解密電子郵件的記憶體頁面可能會被交換出來,並在硬碟上留下痕跡,理論上以後可以通過取證恢復。
雖然在使用敏感文件期間當然可以只使用加密交換文件或禁用全域交換,但它會影響性能,可能會被遺忘並且需要 root 權限。
是否可以將某些文件或程序標記為不被交換?即使沒有root訪問權限?是否可以編寫一個可以分發給技術上天真的使用者並且其記憶體內容永遠不會交換到磁碟的應用程序?
在評論中,我建議您創建一個 cgroup,設置
memory.swappiness
為零(以最小化交換)並在其中執行您的應用程序。如果你這樣做了,你的應用程序可能不會交換,除非你執行的物理記憶體非常低,以至於為該 cgroup 中的程序交換頁面是提供足夠物理記憶體的唯一方法。要在 RHEL 6.5 上執行此操作:
- 確保
libcgroup
安裝包。這使您可以訪問使用者空間工具,例如cgcreate
和cgexec
。- 啟動並啟用該
cgconfig
服務,以便對 cgroup 配置的更改在重新啟動之間保持不變。/cgroup
在 RHEL 上,該服務還應該在樹下掛載所需的文件系統。- 創建 cgroup
cgcreate -g memory:thunderbird
- 在該組中將 swappiness 設置為零
cgset -r memory.swappiness=0 thunderbird
- 用於
cgsnapshot -s > /etc/cgconfig.conf
為cgconfig
服務保存更新的持久配置(到目前為止,所有更改都是執行時更改。您可能希望將預設配置文件保存在某處並在使其成為持久配置之前對其進行一次檢查。- 您現在可以使用
cgexec
在thunderbird
cgroup 中啟動所需的應用程序:$$ 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 這樣的應用程序確實可以做到這一點,但我對內部結構的了解還不夠多,無法對此發表評論。