L'échange peut-il être désactivé au niveau de l'application?


10

J'utilise actuellement thunderbird avec gnupg pour lire les e-mails cryptés. Si je comprends bien le comportement d'échange, les pages de mémoire contenant les e-mails décryptés peuvent être échangées et laisser des traces sur le disque dur qui peuvent en théorie être récupérées ultérieurement de manière médico-légale.

Bien qu'il soit certainement possible d'utiliser simplement un fichier d'échange chiffré ou de désactiver l'échange à l'échelle mondiale pendant la durée d'utilisation des fichiers sensibles, cela a un impact sur les performances, peut être oublié et nécessite des privilèges root.

Est-il possible de marquer certains fichiers ou programmes comme à ne pas échanger? Même sans accès root? Pourrait-on écrire une application qui peut être distribuée à des utilisateurs techniquement naïfs et dont le contenu de la mémoire n'est jamais échangé sur le disque?


2
Lié essentiellement, vous créez un groupe de contrôle, ajustez la permutation de sorte qu'il ne soit jamais remplacé et y insérez cgexecThunderbird. Vous avez toujours besoin d'un accès root, mais c'est la résolution au niveau administrateur. Si vous développez votre propre application, vous utiliserez mlock .
Bratchley

1
GPG peut déjà appeler mlock, vous devriez vérifier.
Steve Wills

Merci! Je ne connaissais pas encore les groupes de contrôle, ils semblent intéressants.
user54114

1
@SteveWills C'est le cas. Pas sûr cependant de Thunderbird, qui affiche le résultat décrypté.
user54114

@Bratchley, pouvez-vous le mettre dans une réponse? Je ne savais pas que vous pouviez définir la permutation pour les groupes de contrôle, cela semble intrigant.
frostschutz

Réponses:


9

Dans les commentaires, je vous ai suggéré de créer un groupe de contrôle, défini memory.swappinesssur zéro (pour minimiser l'échange) et d'exécuter votre application à l'intérieur de cela. Si vous faisiez cela, votre application ne serait probablement pas permutée à moins que vous n'exécutiez une mémoire physique si incroyablement faible que l'échange de pages pour des programmes de ce groupe de contrôle était le seul moyen de libérer suffisamment de mémoire physique.

Pour ce faire sur RHEL 6.5:

  • Assurez-vous que le libcgrouppackage est installé. Cela vous donne accès aux outils de l'espace utilisateur comme cgcreateet cgexec.

  • Démarrez et activez le cgconfigservice afin que les modifications apportées à la configuration de cgroup soient persistantes entre les redémarrages. Sur RHEL, ce service devrait également monter les systèmes de fichiers requis sous l' /cgrouparborescence.

  • Créez le groupe de contrôle avec cgcreate -g memory:thunderbird

  • Définissez la permutation à zéro dans ce groupe avec cgset -r memory.swappiness=0 thunderbird

  • Utilisez cgsnapshot -s > /etc/cgconfig.confpour enregistrer une configuration persistante mise à jour pour le cgconfigservice (toutes les modifications jusqu'à présent ont été des modifications d'exécution. Vous voudrez probablement enregistrer le fichier de configuration par défaut quelque part et lui donner une fois avant de faire la configuration persistante.

  • Vous pouvez maintenant utiliser cgexecpour démarrer les applications souhaitées dans le groupe de thunderbirdcontrôle:

    [root @ xxx601 ~] # cgexec -g mémoire: thunderbird ls

    anaconda-ks.cfg a.out foreman.log index.html install.log install.log.syslog node.pp sleep sleep.c ssl-build test de pile

    [root @ xxx601 ~] #

Je ne l'ai pas thunderbirdinstallé, sinon je l'aurais fait. Je ne sais pas pourquoi le formatage de ce qui précède est foiré.

  • Une alternative à cgexecserait de démarrer thunderbird et d'ajouter le PID au tasksfichier de l'application. Par exemple:

    [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

Encore une fois, il convient de mentionner que cela n'empêche pas techniquement l'échange mais à moins de modifier l'application elle-même, c'est probablement votre meilleur pari. Je viens de memory.memsw.limit_in_bytesdécouvrir ce qui semble être un contrôle plus direct sur le fait de ne pas permuter, mais je n'ai pas suffisamment joué avec pour me sentir vraiment à l'aise en disant qu'il résout complètement votre problème. Cela dit, cela pourrait être quelque chose à examiner après cela.


La vraie réponse serait d'avoir les mlockinformations sensibles à l'application pour contourner ce genre de problème. Je suis prêt à parier qu'une application comme Thunderbird le fait, mais je ne connais pas suffisamment les éléments internes pour commenter cela.


Pour gérer tous les autres fs que @Gilles mentionne, vous voudriez aussi un chrootdans un espace de noms unshared --mount, je pense. Faites cela et je suis prêt à parier que l'effet sur les performances finales serait mieux qu'un échange crypté.
mikeserv

Oui, sans aucun doute, un administrateur ne peut pas faire tant de choses, en fin de compte, l'application doit prendre ce genre de choses en considération car il y en a tellement et les contrôles au niveau administrateur peuvent être assez élaborés.
Bratchley

Un coredump pourrait-il encore être inspecté pour révéler ce qui se passe pour un processus arbitraire même si le memory.swappiness=0pensez-vous? Je ne sais pas - mais je suis curieux.
mikeserv

1
Oui, mais c'est vrai pour presque tout, y compris pour les applications avec mlock mais pas MADV_DONTDUMP. La plupart du temps, cependant, les personnes qui craignent d'échanger des informations sensibles craignent que des ordinateurs portables soient volés et que la zone d'échange soit peignée. Au moment où ils lancent des vidages de mémoire, le système a déjà été complètement compromis.
Bratchley

5

Les applications peuvent verrouiller leur mémoire afin qu'elle ne puisse pas être échangée.

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

Je ne connais pas de moyen d'influencer cela de l'extérieur, cependant. L'application devrait être écrite pour pouvoir l'utiliser seule. Avec les mails, c'est probablement particulièrement difficile car cela implique généralement des programmes externes pour visualiser les pièces jointes et autres.

De plus, même avec memlock, il y a une chance qu'il se retrouve sur votre partition de swap - lorsque vous utilisez suspend to disk qui écrit toute la mémoire sur le disque, quelles que soient les préférences de non-swap.

Il est plus facile de procéder au chiffrement complet du disque en premier lieu.


5

Oui, une application peut empêcher une partie de sa mémoire d'être permutée avec l' mlockappel système. Cependant, ce n'est pas vraiment utile dans votre cas.

Les données confidentielles ne se trouvent pas uniquement dans la mémoire de l'application. Il se retrouve dans les fichiers temporaires dans divers lieux ( /tmp, /var/spool, etc.). Thunderbird lui-même affiche l'e-mail décrypté, vous devez donc le verrouiller également dans la RAM.

Si vous voulez vous assurer que votre disque ne contiendra pas de traces de fichiers confidentiels, vous devez crypter votre swap ainsi que tous les emplacements potentiels des fichiers temporaires (en particulier, /tmps'il ne s'agit pas de tmpfs, et la plupart /var, en plus à votre répertoire personnel bien sûr).

L'impact du swap chiffré sur les performances est faible à nul. Le chiffrement est beaucoup plus rapide que les E / S disque.


Semble un chrootet un conteneur d'espace de noms avec swapoffserait une meilleure alternative au swap crypté. Très bonne réponse - aucune autre réponse n'a mentionné d'autres effets sur le système de fichiers. Moi-même, je n'ai tout simplement pas swap- je ne possède aucun ordinateur avec moins de 4 Go de RAM, et je ne vois aucun avantage à l'utiliser. Son utilisation n'est pratique que pour n'importe laquelle de ces machines où la suspension est concernée - et cela est facilement scriptable.
mikeserv

0

Je pense simplement qu'il serait préférable de commencer par changer la priorité du processus de demande, par exemple avec un script de démarrage en le démarrant avec une priorité élevée en utilisant niceet reniceet avec le changement de priorité d'E / S avec ioniceet puis voir ce que arrive.

Vous pouvez " -20faire passer " l'application au niveau de priorité le plus élevé, par exemple de cette façon, vous laissez toujours le système d'exploitation pour faire ce qu'il fait le mieux en prenant la décision de permuter les processus d'application.

Mais a suggéré par d'autres si vous voulez plus de contrôle et de granularité, vous devez commencer à regarder cgroupset à définirmemory.swappiness

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.