Encriptar el /home en un sistema Debian

Veamos como podemos encriptar el /home en un sistema Debian (en realidad
se aplicaría casi igual a cualquier sistema Linux):

Mucha gente piensa que encriptar es una cosa que no necesitan. Si
piensan eso, es porque no se les ha dado una de estas situaciones:

1.- No le han robado nunca el ordenador (especialmente si es portátil)
2.- No tiene ningún dato sensible en su directorio, por ejemplo,
imágenes comprometidas, passwords, documentos de word, paranoias que dan
por escribir, o cosas que en manos de según quien caigan, puedan
resultar vergonzosas para uno o para otros, recibos del banco, tarjetas
de crédito...
3.- No trabaja en algún sitio donde es importante la confidencialidad de
su trabajo. Por ejemplo, de programador para una compañia que valora la
seguridad.

Si no se te dan ninguna de esas circunstancias... enhorabuena, eres de
los pocos. :) La mayoría de la gente tiene como poco algo importante que
no es conveniente dejar al descubierto. Incluso en la caché del
navegador o en el lector de correo se puede encontrar algo sensitivo.
Por ejemplo si normalemente entras al correo con la opción de recordar
la contraseña, si entras en la cuenta del banco de la misma manera, en
los foros, páginas web, etc, el posible ladron de tu ordenador ¡¡¡la
puede liar bien gorda!!!

No obstante, si el ordenador no es portátil y no está expuesto al
público, es tontería y quizá un poco paranoico. Cada uno debe valorar si
le merece la pena o no.

¿Como puede protegerse?
Hay dos formas, una más fácil que cubre solo aquello que es
verdaderamente importante, dejando al descubierto el resto, y otra que
es un poco más dificil, que es encriptar el home entero.

Modo gráfico sencillo
---------------------

La primera forma se hace instalando los programa Cryptkeeper y encfs.
Ambos se encuentran en los repositorios de Debian.

Arrancando Cryptkeeper, que aparece en el menú
Aplicaciones->Herramientas del sistema, aparece un icono con unas llaves
en la barra.
Tan solo hay que pulsar en ese icono y en New encripted folder, y seguir
todos los pasos, y así creas una carpeta encriptada.
El siguiente paso es igualmente fácil. Por ejemplo, imagina que quieres
proteger la configuración del navegador, y el correo del Thunderbird,
tan solo tienes que mover esos ficheros _dentro_ de la carpeta
encriptada, y crear un enlace en _tu_ directorio. Puedes hacerlo en el
Nautilus, o en la consola de la siguiente manera:

$ mv .mozilla* carpeta_encriptada/
$ ln -s carpeta_encriptada/.mozilla .
$ ln -s carpeta_encriptada/.mozilla-thunderbird .

Tienes que tener especial cuidado de montar la carpeta encriptada cada
vez que vas a usar esos programas. Es muy fácil, solo tienes que pulsar
el icono, y seleccionar la carpeta, y te preguntará por el password.
Por supuesto, puedes hacer lo mismo con cualquier carpeta problemática.
Por ejemplo, con Documentos, Imágenes, etc.

Modo completo
-------------

Si quieres encriptar tu home completo, es un poco más complicado, pero
más seguro.
Lo primero es crear la carpeta encriptada. De momento usamos nombres
temporales. Siendo root, imagina que el usuario se llama javi:

# mkdir /home/.javi
# mkdir /home/javi-temp
# encfs /home/.javi /home/javi-temp

Con eso saldrá un asistente, que describe bastante bien los pasos, pero
si aún quieres más información, en otra consola puedes abrir el clásico
"man encfs", o bien instalar el paquete dwww, y apuntar a
http://localhost/cgi-bin/dwww?search=encfs con el navegador (muy
recomendable)

Asegúrate de usar un password laaaaargo que puedas recordar, pero que no
sea especialmente fácil. Yo uso uno de 40 caracteres que es casi
aleatorio. Me cuesta unos segundos meterlo, pero no importa tanto porque
sirve para todo el dia y es realmente seguro.
Si metes un password de 5 caracteres es casi como si no metieras nada.
Por fuerza bruta hasta un ordenador corriente lo rompería.

A continuación hay que salir de la cuenta, y quedarse en una consola:

# /etc/init.d/gdm stop

Y movemos todos los ficheros:

# mv /home/javi/.??* /home/javi-temp
# mv /home/javi/* /home/javi-temp

El motivo del primer comando tiene truco. En Linux, ten cuidado de hacer
algo como "mv .* donde_sea" porque entre los .* se incluye el directorio
superior. Es decir, que intentas mover el /home dentro de un
subdirectorio de /home, algo imposible, y devolverá error. Si alguna vez
usas "rm -rf .*" espera meterte en un gran lio (borraras todo lo que
contiene el directorio madre).

Puede llegar a tardar horas si tienes 200 gb.

Después solo hay que eliminar el directorio y cambiar de nombre el otro:

# fuserumount -u /home/javi-temp
# rm -r /home/javi
# mv /home/javi-temp /home/javi

y ya está, tu directorio encriptado.
No obstante... aun hay un paso importante: es conveniente que pida la
password al iniciar. Este password no es el mismo que el de tu usuario,
normalmente será mucho más largo y por lo tanto es conveniente que lo
pida una vez nada más cada vez que arrancas el ordenador. Por lo tanto
creamos un servicio:

# gedit /etc/init.d/encfs

y pegamos esto (modificado a tu usuario) (nota:cuidado que algunas
lineas pueden estar cortadas debido al lector de correos y puede darte
errores, corrígelas):

-------8<--------8<---------8<-------- #! /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

:

---------8<------------8<------------8<---------------

podemos probar el servicio de la siguiente manera:

# /etc/init.d/encfs start

y probar que desmonta de la siguiente manera:

# /etc/init.d/encfs stop

Una vez comprobado que funciona ok, ya puedes reiniciar, o simplemente
rearrancar el Gnome:

# /etc/init.d/gdm start

Y listo.

Por
Javier
javuchi@gmail.com

En
linux.debian.user.spanish