¿Se puede deshabilitar el intercambio en el nivel de la aplicación?

10

Actualmente estoy usando thunderbird con gnupg para leer correos electrónicos cifrados. Si entiendo el comportamiento de intercambio correctamente, las páginas de memoria que contienen los correos electrónicos descifrados podrían intercambiarse y dejar rastros en el disco duro que en teoría podrían recuperarse más adelante de manera forense.

Si bien es posible usar un archivo de intercambio encriptado o deshabilitar el intercambio globalmente durante el uso de archivos confidenciales, afecta el rendimiento, puede olvidarse y requiere privilegios de root.

¿Es posible marcar ciertos archivos o programas para que no se intercambien? Incluso sin acceso de root? ¿Se podría escribir una aplicación que se pueda distribuir a usuarios técnicamente ingenuos y cuyos contenidos de memoria nunca se cambien al disco?

usuario54114
fuente
2
Relacionado esencialmente, crearía un cgroup, afinaría el intercambio para que nunca se intercambiara y cgexecthunderbird en él. Todavía necesita acceso de root, pero esa es la resolución de nivel de administrador. Si está desarrollando su propia aplicación, usaría mlock .
Bratchley
1
GPG ya puede llamar mlock, debe verificar.
Steve Wills
¡Gracias! Todavía no sabía sobre cgroups, suenan interesantes.
user54114
1
@SteveWills lo hace. Sin embargo, no estoy seguro acerca de thunderbird, que muestra el resultado descifrado.
user54114
@Bratchley, ¿puedes ponerlo en una respuesta? No sabía que podría establecer el intercambio para cgroups, suena intrigante.
frostschutz

Respuestas:

9

En los comentarios, le sugerí que creara un cgroup, lo pusiera memory.swappinessa cero (para minimizar el intercambio) y ejecute su aplicación dentro de eso. Si hiciera eso, su aplicación probablemente no se intercambiaría a menos que estuviera ejecutando una memoria física tan increíblemente baja que el intercambio de páginas por programas en ese cgroup era la única forma de tener suficiente memoria física disponible.

Para hacer esto en RHEL 6.5:

  • Asegúrese de que el libcgrouppaquete esté instalado. Esto le da acceso a herramientas de espacio de usuario como cgcreatey cgexec.

  • Inicie y habilite el cgconfigservicio para que los cambios en la configuración de cgroup sean persistentes entre reinicios. En RHEL, este servicio también debe montar los sistemas de archivos necesarios debajo del /cgroupárbol.

  • Crea el cgroup con cgcreate -g memory:thunderbird

  • Establezca swappiness en cero en este grupo con cgset -r memory.swappiness=0 thunderbird

  • Utilícelo cgsnapshot -s > /etc/cgconfig.confpara guardar una configuración persistente actualizada para el cgconfigservicio (todos los cambios hasta ahora han sido cambios en tiempo de ejecución. Probablemente quiera guardar el archivo de configuración predeterminado en alguna parte y darle una revisión antes de convertirlo en la configuración persistente.

  • Ahora puede usar cgexecpara iniciar las aplicaciones deseadas dentro del grupo thunderbirdc:

    [root @ xxx601 ~] # cgexec -g memoria: 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

    [raíz @ xxx601 ~] #

En realidad no lo he thunderbirdinstalado, de lo contrario lo habría hecho. No estoy seguro de por qué el formato de lo anterior está en mal estado.

  • Una alternativa cgexecsería iniciar thunderbird y agregar el PID al tasksarchivo de la aplicación. Por ejemplo:

    [root @ xxx601 ~] # cat / cgroup / memory / thunderbird / tareas

    [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 / tareas

    [root @ xxx601 ~] # cat / cgroup / memory / thunderbird / tareas

    25926

Una vez más, hay que mencionar que esto técnicamente no evita el intercambio, pero a menos que se modifique la aplicación en sí, probablemente sea su mejor opción. Acabo de encontrar memory.memsw.limit_in_bytesque parece que podría ser un control más directo para forzar que no haya intercambio, pero no he jugado lo suficiente como para sentirme cómodo diciendo que soluciona el problema por completo. Dicho esto, podría ser algo a tener en cuenta después de esto.


La respuesta real sería tener la mlockinformación confidencial de la aplicación para evitar este tipo de preocupación. Sin embargo, estoy dispuesto a apostar que una aplicación como Thunderbird lo hace, pero no sé lo suficiente sobre los aspectos internos para comentar sobre eso.

Bratchley
fuente
Para manejar todos los otros fs que @Gilles menciona, también querrías chrootun espacio de nombres en un unshared --mount, creo. Haga eso y estoy dispuesto a apostar que el efecto de rendimiento final sería mejor que un intercambio cifrado.
mikeserv
Sí, no hay duda de que un administrador solo puede hacer mucho, en última instancia, la aplicación debe tener en cuenta este tipo de cosas, ya que hay muchas y los controles a nivel de administrador pueden ser bastante elaborados.
Bratchley
¿Se podría inspeccionar un coredump para revelar lo que sucede en un proceso arbitrario, incluso si memory.swappiness=0crees? No lo sabría, pero tengo curiosidad.
mikeserv
1
Sí, pero eso es cierto para casi cualquier cosa, incluidas las aplicaciones con mlock pero no MADV_DONTDUMP. Sin embargo, la mayoría de las veces, las personas que están preocupadas por el intercambio de información sensible están preocupadas por el robo de las computadoras portátiles y el peinado del área de intercambio. En el momento en que inician los volcados del núcleo, el sistema ya se ha visto completamente comprometido.
Bratchley
5

Las aplicaciones pueden bloquear su memoria para que no se puedan intercambiar.

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

Sin embargo, no conozco una forma de influir en esto desde afuera. La aplicación tendría que estar escrita para usar esto por sí misma. Con los correos probablemente sea particularmente difícil ya que generalmente también involucra programas externos para ver archivos adjuntos y demás.

Además, incluso con memlock existe la posibilidad de que termine en su partición de intercambio, cuando utiliza suspender en el disco que escribe toda la memoria en el disco, independientemente de las preferencias que no sean de intercambio.

Es más fácil simplemente ir a la encriptación completa del disco en primer lugar.

Frostschutz
fuente
5

Sí, una aplicación puede evitar que se intercambie parte de su memoria con la mlockllamada al sistema. Sin embargo, esto no es realmente útil en su caso.

Los datos confidenciales no se encuentran solo en la memoria de la aplicación. Se termina en los archivos temporales en diversos lugares ( /tmp, /var/spool, etc.). Thunderbird está mostrando el correo electrónico descifrado, por lo que también deberías bloquearlo en la RAM.

Si desea asegurarse de que su disco no contenga rastros de archivos confidenciales, debe cifrar su intercambio, así como todas las ubicaciones potenciales de archivos temporales (en particular, /tmpsi no es tmpfs, y la mayoría /var, además a su directorio de inicio, por supuesto).

El impacto del intercambio cifrado en el rendimiento es pequeño o nulo. El cifrado es mucho más rápido que la E / S de disco.

Gilles 'SO- deja de ser malvado'
fuente
Parece que un chrootcontenedor de espacio de nombres con swapoffsería una mejor alternativa al intercambio cifrado. Muy buena respuesta: ninguna otra respuesta menciona otros efectos del sistema de archivos. Yo mismo, simplemente no tengo un swap- No tengo ninguna computadora con menos de 4GB de RAM, y no puedo ver ningún beneficio al usarla. Su uso solo es práctico para cualquiera de esas máquinas en lo que respecta a la suspensión, y eso es fácil de escribir.
mikeserv
0

Solo estoy pensando si sería mejor comenzar cambiando la prioridad del proceso de solicitud, por ejemplo, con un script de inicio comenzando con una alta prioridad usando nicey renicey con la prioridad de E / S cambiar eso con ionicey luego ver qué sucede

Puede 'ajustar' la aplicación al nivel de prioridad más alto, por ejemplo, de -20esa manera aún deja que el sistema operativo haga lo que hace mejor al tomar la decisión sobre cuándo intercambiar los procesos de la aplicación.

Pero otros han sugerido que si desea más control y granularidad, debe comenzar a mirar cgroupsy configurarmemory.swappiness

tdr
fuente