Можно ли отключить обмен на уровне приложения?

10

В настоящее время я использую Thunderbird с gnupg для чтения зашифрованных писем. Если я правильно понимаю поведение подкачки, страницы памяти, содержащие дешифрованные электронные письма, могут быть выгружены и оставить следы на жестком диске, которые теоретически впоследствии могут быть восстановлены криминалистически.

Хотя, безусловно, можно просто использовать зашифрованный файл подкачки или отключить подкачку глобально на время использования конфиденциальных файлов, это влияет на производительность, может быть забыто и требует привилегий root.

Можно ли пометить определенные файлы или программы как не подлежащие обмену? Даже без рут-доступа? Можно ли написать приложение, которое можно распространять среди технически наивных пользователей и чье содержимое памяти никогда не выгружается на диск?

user54114
источник
2
По сути, вы бы создали группу, настроите перестановку так, чтобы она никогда не поменялась, и cgexecгромовой птицей в нее. Вам все еще нужен root-доступ, но это разрешение на уровне администратора. Если вы разрабатываете свое собственное приложение, вы бы использовали mlock .
Братчли
1
GPG может уже позвонить mlock, вам следует проверить.
Стив Уиллс,
Спасибо! Я еще не знал о cgroups, они звучат интересно.
user54114
1
@ SteveWills Это делает. Не уверен насчет Thunderbird, который показывает расшифрованный результат.
user54114
@ Брэтчли, можешь поставить это в ответ? Я не знал, что вы можете установить swappiness для cgroups, это звучит интригующе.
frostschutz

Ответы:

9

В комментариях я предложил вам создать cgroup, установить memory.swappinessв ноль (чтобы минимизировать обмен) и запустить ваше приложение внутри него. Если вы это сделаете, ваше приложение, вероятно , не поменяется местами, если у вас не было настолько невероятно мало физической памяти, что обмен страницами для программ в этой группе был единственным способом сделать доступным достаточно физической памяти.

Чтобы сделать это на RHEL 6.5:

  • Убедитесь, что libcgroupпакет установлен. Это дает вам доступ к инструментам пользовательского пространства, таким как cgcreateи cgexec.

  • Запустите и включите cgconfigслужбу, чтобы изменения конфигурации cgroup оставались постоянными между перезагрузками. На RHEL этот сервис также должен монтировать необходимые файловые системы под /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 тестирование стека

    [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, делает это, но я не знаю достаточно о внутренностях, чтобы комментировать это.

Bratchley
источник
Для того, чтобы справиться со всеми другой фс о том , что @Gilles упоминает вы хотите chrootв unshareг --mountпространства имен, а также, я думаю. Сделайте это, и я готов поспорить, что конечный эффект производительности будет лучше, чем зашифрованный обмен.
mikeserv
Да, нет сомнений в том, что администратор может сделать только так много, в конечном счете, приложение должно принимать во внимание такого рода вещи, так как существует так много, и элементы управления на уровне администратора могут быть довольно сложными.
Братчли
Может ли coredump еще проверяться, чтобы выявить, что происходит для произвольного процесса, даже если memory.swappiness=0вы думаете, что? Я бы не знал - но мне любопытно.
mikeserv
1
Да, но это верно почти для всего, в том числе для приложений с mlock, но не для этого MADV_DONTDUMP. Тем не менее, в большинстве случаев люди, которые обеспокоены обменом конфиденциальной информацией, обеспокоены тем, что ноутбуки могут быть украдены и область подкачки зачесана. В тот момент, когда они запускают дампы ядра, система уже полностью скомпрометирована.
Братчли
5

Приложения могут заблокировать свою память, чтобы ее нельзя было поменять местами.

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

Хотя я не знаю, как повлиять на это со стороны. Приложение должно быть написано, чтобы использовать это само по себе. С почтой это, вероятно, особенно сложно, так как обычно для просмотра вложений используются внешние программы.

Кроме того, даже с memlock существует вероятность того, что он окажется на вашем разделе подкачки - когда вы используете режим приостановки на диск, который записывает всю память на диск, независимо от каких-либо настроек без подкачки.

Во-первых, проще всего использовать полное шифрование диска.

frostschutz
источник
5

Да, приложение может предотвратить обмен части памяти с помощью mlockсистемного вызова. Тем не менее, это не очень полезно в вашем случае.

Конфиденциальные данные не только в памяти приложения. Это заканчивается во временных файлах в разных местах ( /tmp, /var/spoolи т. Д.). Сам Thunderbird отображает дешифрованное электронное письмо, поэтому вам придется заблокировать его и в оперативной памяти.

Если вы хотите , чтобы убедиться , что диск не будет содержать следы конфиденциальных файлов, вам необходимо зашифровать подкачки, а также все возможные места расположения временных файлов (в частности, /tmpесли это не TMPFS, и большинство /var, в дополнении в ваш домашний каталог, конечно).

Влияние зашифрованного свопа на производительность невелико. Шифрование намного быстрее, чем дисковый ввод-вывод.

Жиль "ТАК - перестань быть злым"
источник
Кажется, chrootконтейнер с именами и пространством имен swapoffбудет лучшей альтернативой зашифрованному обмену. Очень хороший ответ - ни в одном другом ответе не упоминались другие эффекты файловой системы. Сам у меня просто нет swap- у меня нет компьютера с менее чем 4 ГБ ОЗУ, и я не вижу никакой выгоды от его использования. Его использование целесообразно только для любой из тех машин, которые касаются приостановки, и это легко записывается в сценарии.
mikeserv
0

Я просто думаю, что было бы лучше начать с изменения приоритета процесса приложения, например, с запускающего скрипта, запускающего его с высоким приоритетом, с использованием niceи reniceи с изменения приоритета ввода / вывода, с помощью которого ioniceи затем посмотреть, что случается.

Вы можете «настроить» приложение на наивысший уровень приоритета, например, -20таким образом вы по-прежнему оставляете ОС, чтобы делать то, что она делает лучше всего, принимая решение о том, когда менять процессы приложения.

Но другие предложили, если вы хотите больше контроля и детализации, вам нужно начать смотреть cgroupsи устанавливатьmemory.swappiness

TDR
источник