miércoles, 7 de octubre de 2009

Encriptar el /home


  Antes de empezar una breve explicación de para qué puede servir encriptar la carpeta de usuario.
  • Si usas una laptop, netbook o como quiera que le llames a la computadora portátil.
  • Cuando usas una computadora con acceso libre a cualquier tipo de persona.
  • Si se tienen datos de alto valor, como cuentas bancos, comprobantes, datos álgidos, etc.
  • El trabajo que tiene le exige, en mayor o menor medida, algún grado de confidencialidad.
  • Porque es usted un maldito paranoico y no quiere que los entes internacionales que lo siguen día y noche accedan a sus invaluables documentos.
  • Porque es uno de los espías de los entes internacionales que siguen día y noche al maldito paranoico.
La guía está hecha para Debian pero es válida para cualquier distribución de GNU/Linux.  Hay dos modos de hacerlo, un modo gráfico simple y otro algo más complejo pero que encripta la home completa.


Modo gráfico simple

Primero se instalan los programas Cryptkeeper y Encfs. Una vez instalados, se va al menú de Aplicaciones => Herramientas del Sistema y se arranca Cryptkeeper  (aparecen unas llaves en la barra).  Ésto en Gnome, en KDE se va derecho a Heramientas del Sistema.  Se pulsa en el ícono de la barra y elige "New Encripted Folder"  (Nueva Carpeta Encriptada).  Se siguen los pasos que indica el programa y ya hay una carpeta nueva con qué empezar.  Cabe señalar que de esta forma se puede encriptar carpetas "por partes", o sea que sirve para carpetas específicas más que para todo el home.  Si por ejemplo, uno quiere proteger la carpeta en la que tiene la contabilidad de la casa  (con sus correspondientes comprobantes, cuentas bancarias, etc.)  simplemente mueve esos archivos dentro de la carpeta encriptada que acaba de crear.  Luego se crea un enlace en la carpeta de usuario que apunte a la carpeta encriptada. Puede hacerse gráficamente desde el manejador de archivos (Nautilus, Konqueror), mediante el archiconocido Drag & Drop, y luego Crear enlace o Crear un lanzador.  O puede hacerse por línea de comandos escribiendo:
                  mv carpeta_álgida*  carpeta encriptada/
                  ln -s carpeta encriptada/carpeta_álgida
                  ln -s /home/carpeta_álgida/
 Hay que recordar siempre que hay que montar la carpeta cuando se inicia el programa.  Ésto se hace dando click al ícono en la barra y eligiendo la carpeta.  El programa te va a pedir la contraseña, se la das y ya está, tienes acceso a tus datos encriptados.


Modo completo

 Si es necesario encriptar todo el usuario, el método es algo más complejo pero perfectamente factible.  Lo primero es, como en el caso anterior, instalar Cryptkeeper y Encfs, hacerlo arrancar, etc.
Cuando está hecha la carpeta encriptada, se hace lo siguiente desde root (de momento, se usan nombres temporales):
               mkdir   /home/.usuario
               mkdir  /home/usuario-temp
               encfs  /home/.usuario  /home/usuario-temp
Con estos comandos saldrá un asistente que irá indicando qué hacer en cada paso.  Es importante que la contraseña sea robusta, de más de 8 caracteres, que no sea una palabra de diccionario, y que sea fácil de recordar.  Si uno va andar regando papelitos con contraseñas por todos lados como Hansel y Gretel, la seguridad no tiene ningún sentido.
Teóricamente, hay que salir de la cuenta e ir a una consola para hacer la siguiente indicación:  /etc/init.d gdm stop.  El porqué y el cómo de ésto, me resulta totalmente oscuro, además de inútil por lo que si quieren pueden contactarse con las fuentes que cito abajo para más información o directamente saltárselo.
Siguiendo en root, entonces, movemos todos los archivos de la siguiente manera:
                 mv  /home/usuario/.??*  /home/usuario-temp
                 mv  /home/usuario/*  /home/usuario-temp
CuidadoHay que tener mucho cuidado con no poner sólo el asterisco al mover los archivos  (en el primer comando)  porque va a dar error.  Básicamente, quiere decir que estás tratando de mover todos los archivos y sus carpetas de vuelta a la misma carpeta en donde está.  El asterisco después del punto, en el primer comando, indica que se incluyan las carpetas superiores (también /home).  Dependiendo del tamaño de la carpeta de usuario  (no te olvides que se incluirán las carpetas ocultas, lo cual a veces puede llegar a ocupar tanto espacio como los archivos visibles),  demorará entre unos minutos y algunas horas.  No se asusten, lo de horas es sólo si es un usuario extremadamente grande  (200Gb, por ejemplo).  Normalmente no llega a tanto.
Después, lo que queda es borrar la carpeta y cambiarle el nombre a la carpeta temporal.  Ésto se hace con los siguientes comandos:
             fuserumount -u/home/usuario-temp
             rm  -r  /home/usuario
             mv  /home/usuario-temp  /home/usuario
O bien, más fácil, de manera gráfica con Nautilus o Konqueror.  Yo prefiero la forma gráfica, evita confusiones con los comandos.  Un  rm -rf *  puede significar la pérdida completa de los archivos por ejemplo, pero un menú es muy difícil embocarle mal a la opción.
        Ahora que el /home está encriptado ya se puede iniciar sesión con el usuario.  Es importante que nos pida la contraseña al iniciar y la guarde durante la sesión, ya que la contraseña de la carpeta encriptada se supone que se ha hecho más rebuscada y larga que la de inicio de sesión.
Para ésto creamos un servicio de la siguiente manera:
   # gedit  /etc/init.d/encfs
En rigor, no es necesario que sea con Gedit, puede ser con cualquier editor de texto.  El que más le guste 

En ese archivo que se creó se pone el siguiente texto  (recomiendo copiar y pegar para evitar errores):

#! /bin/sh

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/
usr/bin
DESC="Description of the service"
NAME=encfs
DAEMON=/usr/bin/$NAME
DAEMON_ARGS="--public /home/.javi /home/javi"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
       # Return
       #   0 if daemon has been started
       #   1 if daemon was already running
       #   2 if daemon could not be started
       start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON
--test > /dev/null \
               || return 1
       start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
               $DAEMON_ARGS \
               || return 2
       # Add code here, if necessary, that waits for the process to be ready
       # to handle requests from services started subsequently which depend
       # on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
       fusermount -u /home/javi
       # Return
       #   0 if daemon has been stopped
       #   1 if daemon was already stopped
       #   2 if daemon could not be stopped
       #   other if a failure occurred
       #start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile
$PIDFILE --name $NAME
       RETVAL="$?"
       [ "$RETVAL" = 2 ] && return 2
       # Many daemons don't delete their pidfiles when they exit.
       rm -f $PIDFILE
       return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
       #
       # If the daemon can reload its configuration without
       # restarting (for example, when it is sent a SIGHUP),
       # then implement that here.
       #
       start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
       return 0
}

case "$1" in
 start)
       [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
       do_start
       case "$?" in
               0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
               2)
                       do_start # repite hasta que vaya bien
                       [ "$VERBOSE" != no ] && log_end_msg 1 ;;
       esac
       ;;
 stop)
       [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
       do_stop
       case "$?" in
               0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
               2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
       esac
       ;;
 #reload|force-reload)
       #
       # If do_reload() is not implemented then leave this commented out
       # and leave 'force-reload' as an alias for 'restart'.
       #
       #log_daemon_msg "Reloading $DESC" "$NAME"
       #do_reload
       #log_end_msg $?
       #;;
 restart|force-reload)
       #
       # If the "reload" option is implemented then remove the
       # 'force-reload' alias
       #
       log_daemon_msg "Restarting $DESC" "$NAME"
       do_stop
       case "$?" in
         0|1)
               do_start
               case "$?" in
                       0) log_end_msg 0 ;;
                       1) log_end_msg 1 ;; # Old process is still running
                       *) log_end_msg 1 ;; # Failed to start
               esac
               ;;
         *)
               # Failed to stop
               log_end_msg 1
               ;;
       esac
       ;;
 *)
       #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
       echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
       exit 3
       ;;
esac

:

Luego podemos probar el servicio de la siguiente manera:
           /etc/init.d/encfs  start
y para desmontar:
          /etc/init.d/encfs  stop
Se entiende que son comandos en una terminal.  Valga la aclaración porque así como están escritos parece como si fueran archivos que uno debe buscar.
Una vez comprobado que funciona, reinicias y listo.  Cuando arranque ya tendrás tu carpeta de usuario encriptada.

-----------------------***----------------------------


Un amigo andaluz añadió estos comentarios que pueden resultar útiles:
   Poner en el archivo  /etc/fuse.conf  una línea que diga:  "user_allow_other".  Evita algunos problemas como que quede con permisos de root cuando está desmontado o confusiones por el estilo.
   Advertir que hay un posible bug con la Papelera de Gnome.  A veces sucede (o sucedía, no sé si el bug fue arreglado)  que la Papelera de Gnome dejaba de funcionar luego de encriptar un usuario.  El asunto se solucionaba de dos maneras:  No usando Gnome  (cada escritorio tiene su propia papelera)  o bien instalando Screenlets que cuenta con una Papelera propia.


-----------------------***-------------------------------------


Y finalmente otro usuario argumentó el uso de Encfs.  En su opinión, el uso de Truecrypt es mucho mejor.




Ésta guía fue creada por Javier para la lista Debian Español.  Mi amigo andaluz se llama Manuel Jiménez Friaza y aunque es un muchachito sabe de Debian un rato.  Y finalmente, el usuario que propuso una forma diferente se llama Jorge Delgado.

La edición es mía, y mis datos están en el perfil. 
     Si desean agregar algo a la guía, quieren hacer una pregunta o piensan que hay algo erróneo o que le falta, lo comentan o me envían un mail que lo actualizo con todo gusto.





No hay comentarios: