Czy zamiana może być wyłączona na poziomie aplikacji?

10

Obecnie używam thunderbirda z gnupg do czytania zaszyfrowanych wiadomości e-mail. Jeśli dobrze rozumiem zachowanie zamiany, strony pamięci zawierające odszyfrowane wiadomości e-mail mogą zostać zamienione i pozostawić ślady na dysku twardym, które teoretycznie mogą zostać później odzyskane przez sąd.

Chociaż z pewnością możliwe jest po prostu użycie zaszyfrowanego pliku wymiany lub wyłączenie wymiany globalnej na czas korzystania z poufnych plików, ma to wpływ na wydajność, może zostać zapomniane i wymaga uprawnień roota.

Czy można oznaczyć niektóre pliki lub programy jako niepodlegające zamianie? Nawet bez dostępu do roota? Czy można napisać aplikację, która może być dystrybuowana do technicznie naiwnych użytkowników i której zawartość pamięci nigdy nie jest zamieniana na dysk?

użytkownik54114
źródło
2
Zasadniczo związane z tym byłoby utworzenie grupy roboczej, dostrojenie swapiness, aby nigdy się nie zamieniło, i cgexecpiorun w to. Nadal potrzebujesz dostępu do konta root, ale taka jest rozdzielczość na poziomie administratora. Jeśli tworzysz własną aplikację, skorzystaj z mlock .
Bratchley,
1
GPG może już dzwonić mlock, powinieneś to sprawdzić.
Steve Wills,
Dzięki! Nie wiedziałem jeszcze o grupach, brzmią interesująco.
user54114,
1
@ SteveWills To robi. Nie jestem pewien co do Thunderbirda, który wyświetla odszyfrowany wynik.
user54114
@Bratchley, czy możesz podać odpowiedź? Nie wiedziałem, że można ustawić zamianę dla grup, brzmi intrygująco.
frostschutz

Odpowiedzi:

9

W komentarzach zasugerowałem utworzenie cgroup, ustawienie memory.swappinessna zero (aby zminimalizować zamianę) i uruchomienie aplikacji wewnątrz tego. Gdybyś to zrobił, aplikacja prawdopodobnie nie zamieniłaby się, gdybyś nie miał tak niewiarygodnie małej ilości pamięci fizycznej, że zamiana stron na programy w tej grupie była jedynym sposobem na udostępnienie wystarczającej ilości pamięci fizycznej.

Aby to zrobić w RHEL 6.5:

  • Upewnij się, że libcgrouppakiet jest zainstalowany. Daje to dostęp do narzędzi przestrzeni użytkownika, takich jak cgcreatei cgexec.

  • Uruchom i włącz cgconfigusługę, aby zmiany konfiguracji cgroup były powtarzane między restartami. Na RHEL ta usługa powinna również zamontować wymagane systemy plików pod /cgroupdrzewem.

  • Utwórz grupę roboczą za pomocą cgcreate -g memory:thunderbird

  • Ustaw swapiness na zero w tej grupie za pomocą cgset -r memory.swappiness=0 thunderbird

  • Służy cgsnapshot -s > /etc/cgconfig.confdo zapisywania zaktualizowanej trwałej konfiguracji cgconfigusługi (wszystkie dotychczasowe zmiany były zmianami w środowisku wykonawczym. Prawdopodobnie zechcesz gdzieś zapisać domyślny plik konfiguracyjny i dać mu jeszcze raz, zanim zmienisz go w trwałą konfigurację.

  • Teraz możesz użyć cgexecdo uruchomienia żądanych aplikacji w thunderbirdgrupie:

    [root @ xxx601 ~] # cgexec -g memory: thunderbird ls

    anaconda-ks.cfg a.out foreman.log index.html install.log install.log.syslog node.pp uśpienie uśpienia. c test stosu kompilacji ssl

    [root @ xxx601 ~] #

W thunderbirdrzeczywistości nie zainstalowałem inaczej, zrobiłbym to. Nie jestem pewien, dlaczego formatowanie powyższego jest pomieszane.

  • Alternatywą cgexecbyłoby uruchomienie Thunderbirda i dodanie PID do taskspliku aplikacji. Na przykład:

    [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

Ponownie należy wspomnieć, że technicznie nie zapobiega to zamianie, ale nie modyfikuje samej aplikacji, to prawdopodobnie najlepszy wybór. Właśnie znalazłem, memory.memsw.limit_in_bytesco wydaje się, że może to być bardziej bezpośrednia kontrola wymuszania braku zamiany, ale nie bawiłem się wystarczająco, aby naprawdę czuć się komfortowo, mówiąc, że całkowicie rozwiązuje twój problem. To powiedziawszy, może to być coś do rozważenia po tym.


Prawdziwą odpowiedzią byłoby posiadanie mlockinformacji wrażliwych na aplikację w celu obejścia tego rodzaju problemów. Jestem skłonny założyć się, że aplikacja taka jak Thunderbird to robi, ale nie wiem wystarczająco dużo o wewnętrznych elementach, aby to skomentować.

Bratchley
źródło
Aby obsłużyć wszystkie inne fs, o których wspomina @Gilles, chciałbyś również chrootmieć przestrzeń nazw unshared --mount, tak myślę. Zrób to i jestem gotów się założyć, że końcowy efekt wydajności byłby lepszy niż zaszyfrowana zamiana.
mikeserv
Tak, bez wątpienia administrator może tylko tyle zrobić, ostatecznie aplikacja musi wziąć pod uwagę tego rodzaju rzeczy, ponieważ jest ich tak wiele, a kontrole na poziomie administratora mogą być dość skomplikowane.
Bratchley,
Czy rdzeń rdzeniowy mógłby zostać poddany inspekcji w celu ujawnienia, co dzieje się w przypadku arbitralnego procesu, nawet jeśli memory.swappiness=0tak myślisz? Nie wiedziałbym - ale jestem ciekawy.
mikeserv
1
Tak, ale dotyczy to prawie wszystkiego, w tym aplikacji z mlock, ale nie MADV_DONTDUMP. Jednak przez większość czasu ludzie, którzy martwią się wymianą poufnych informacji, martwią się o kradzież laptopów i przeczesanie obszaru wymiany. W momencie inicjowania zrzutów pamięci system został już całkowicie skompromitowany.
Bratchley
5

Aplikacje mogą zablokować swoją pamięć, aby nie można było jej zamienić.

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

Nie wiem jednak, jak wpłynąć na to z zewnątrz. Aplikacja musiałaby zostać napisana, aby korzystać z tego samodzielnie. W przypadku wiadomości e-mail jest to prawdopodobnie szczególnie trudne, ponieważ zwykle obejmuje również zewnętrzne programy do przeglądania załączników i tym podobne.

Ponadto, nawet z memlockiem, istnieje szansa, że ​​skończy on na partycji wymiany - gdy używasz zawieszenia na dysk, który zapisuje całą pamięć na dysk, bez względu na preferencje inne niż zamiana.

Łatwiej jest po prostu przejść na pełne szyfrowanie dysku.

frostschutz
źródło
5

Tak, aplikacja może zapobiec wymianie części pamięci podczas mlockwywołania systemowego. Nie jest to jednak przydatne w twoim przypadku.

Poufne dane to nie tylko pamięć aplikacji. Kończy się w plikach tymczasowych w różnych miejscach ( /tmp, /var/spool, itd.). Sam Thunderbird wyświetla odszyfrowaną wiadomość e-mail, więc musisz również zablokować ją w pamięci RAM.

Jeśli chcesz mieć pewność, że Twój dysk nie będzie zawierał śladów poufnych plików, musisz zaszyfrować swap, a także wszystkie potencjalne lokalizacje plików tymczasowych (w szczególności /tmpjeśli nie jest to plik tmpfs, a większość z nich /vardodatkowo oczywiście do katalogu domowego).

Wpływ szyfrowanej wymiany na wydajność jest niewielki do zera. Szyfrowanie jest znacznie szybsze niż dyskowe operacje we / wy.

Gilles „SO- przestań być zły”
źródło
Wydaje się, chrootże kontener nazw i z swapoffbyłby lepszą alternatywą dla szyfrowanej wymiany. Bardzo dobra odpowiedź - żadna inna odpowiedź nie wspominała o innych efektach systemu plików. Sam po prostu nie mam swap- nie posiadam żadnego komputera z mniej niż 4 GB pamięci RAM i nie widzę żadnych korzyści z jego używania. Jego użycie jest praktyczne tylko na tych komputerach, na których występuje zawieszenie - i jest to łatwe do wykonania w skrypcie.
mikeserv
0

Zastanawiam się tylko, czy lepiej zacząć od zmiany priorytetu procesu aplikacji, np. Za pomocą skryptu startowego, uruchamiając go z wysokim priorytetem za pomocą nicei, renicea wraz z priorytetem we / wy zmień to za pomocą, ionicea następnie zobacz, co dzieje się.

Możesz „ładnie” aplikować na najwyższym poziomie, np. W -20ten sposób pozostawiasz system operacyjny, aby robił to, co robi najlepiej, decydując, kiedy zamienić procesy aplikacji.

Ale zasugerowali inni, jeśli chcesz mieć większą kontrolę i dokładność, musisz zacząć patrzeć cgroupsi ustawiaćmemory.swappiness

tdr
źródło