24 julio 2012

Instalando Slackware en un LVM cifrado

Introducción

Cuando una computadora portátil es perdida o robada (o podría ser una computadora de escritorio, pero es más probable que suceda con una computadora que cargamos con nosotros), al principio podríamos resentir el precio de la máquina en sí (y los datos personales en la computadora si no se respalda frecuentemente, lo cual realmente deberías de hacerlo, en especial si sacas la computadora de casa mucho), hasta que nos damos cuenta que quien se encuentre en posesión de la computadora posee acceso a toda nuestra información: nuestras fotos, nuestros documentos, nuestra música y/o videos, todo nuestro historial de navegación, y, para agravar aún más las cosas, podría tener acceso a información delicada como nuestra tarjeta de crédito y forma de conectarse a los sitios que usualmente visitamos bajo nuestro nombre. Si esta computadora perdida solía pertenecer a un usuario de una compañía, es aún peor, ya que quien tiene posesión de la computadora podría tener acceso a información delicada de la compañía o acceso a datos sobre los clientes de la misma.
Un método común para proteger la información delicada es crear un área cifrada (o múltiples áreas cifradas) dentro del disco duro, por medio de un programa como TrueCrypt, en la que guardamos la información delicada. Mientras que este es un buen método, no protege cosas como el historial de navegación o la memoria virtual de la computadora, en la que información como contraseñas y números de tarjetas de crédito es guardada. Y por supuesto, si queremos poner la computadora a hibernar, el contenido entero de la memoria es volcado al disco duro, con todo y estas contraseñas y demás contenido que la computadora se suponía que guardaba temporalmente, y podría ser recuperado por alguien con la experiencia necesaria.
Un método diferente para alcanzar la seguridad es cifrar el sistema entero, no solo un área con información personal. Esto ofrece varias ventajas sobre un área cifrada como:
  • Si el sistema se pierde, sin la contraseña a al momento de encenderla, la computadora es básicamente inutilizable; solo un formato completo y una reinstalación la volverían usable de nuevo, pero nuestra información en ella se pierde para siempre (a no ser que utilicemos una contraseña realmente mala).
  • El cifrado es transparente, una contraseña al comienzo sirve para desbloquear el sistema y los datos personales. Fuera de eso el sistema realiza las operaciones de cifrado y descifrado de manera transparente conforme escribe y lee del disco.
  • La memoria virtual también es cifrada.
  • Esto nos permite poner la computadora a hibernar; cuando la memoria es volcada al disco duro, es cifrada.
Esta es la primera de varias publicaciones, cuya meta es crear un sistema seguro donde podamos guardar y manejar nuestra información delicada y desde la que podamos realizar transacciones en linea con seguridad. Intento cubrir temas desde la instalación de un sistema cifrado, al mantenimiento del mismo, hasta la creación de respaldos automáticos. Cubriré Slackware para el realmente paranoico que desea tener un estrecho control sobre el sistema y solo confía en descargar el código de los programas y compilarlos el mismo, y Ubuntu para quienes desean un sistema más amigable, podría cubrir otras distribuciones y/o sistemas operativos, o métodos de cifrado, pero esto es solo un comienzo.
En esta primera guía, estaré cubriendo la instalación de un Slackware completamente cifrado, ya que esta es una distribución longeva, con un historial sólido de seguridad y estabilidad, y por supuesto, porque me gusta y lo utilizó frecuentemente.

Requerimientos

Necesitamos los discos o el DVD de Slackware, aunque puedes utilizar otro medio de instalación. Para esta guía usé el DVD, aunque para netbooks utilizo una pequeña memoria y tengo los archivos de instalación en una unidad de red (NFS).
Por supuesto necesitamos un área vacía en el disco duro. Si vamos a realizar una instalación completa, alrededor de 8GB debería de ser suficiente y darnos un poco de flexibilidad para instalar programas adicionales que pudiéramos necesitar y espacio para guardar nuestros documentos privados, pero mientras más mejor.

Creando particiones

Primero que nada vamos a insertar el DVD de Slackware y reiniciar la computadora, si estás haciendo esto en una netbook sin un lector de discos compactos, puedes iniciar desde una memoria flash y utilizar una unidad de red como el origen de los archivos de instalación. Al principio seremos bienvenidos y se nos preguntará si queremos iniciar con el kernel que trae por default (hugesmp.s) o elegir uno diferente, presionamos entrar y seguimos con el kernel que viene por default, a menos que estemos haciendo esto en una computadora realmente vieja.
 
ISOLINUX 3.84 2009-12-18 ETD Copyright (C) 1994-2009 H. Peter Anvin et al

Welcome to Slackware version 13.1 (Linux kernel 2.6.33.4)!

If you need to pass extra parameters to the kernel, enter them at the prompt
below after the name of the kernel to boot (huge.s etc). NOTE: If your machine
is not at least a Pentium-Pro, you *must* boot and install with the huge.s
kernel, not the hugesmp.s kernel!  For older machines, use "huge.s" at the
boot prompt.

In a pinch, you can boot your system from here with a command like:

boot: hugesmp.s root=/dev/sda1 rdinit= ro

In the example above, /dev/sda1 is the / Linux partition.

This prompt is just for entering extra parameters.  If you don't need to enter
any parameters, hit ENTER to boot the default kernel "hugesmp.s" or press [F2]
for a listing of more kernel choices.

boot: _

Slackware comenzará a cargar y eventualmente nos pedirá que elijamos un teclado, yo presiono aquí entrar por que estoy bien con el teclado de USA que aparece por default, pero si necesitas un teclado diferente puedes presionar 1 y elegir una distribución del teclado diferente hasta que encuentres una que se te acomode.
 

Y finalmente llegamos a una pantalla de conexión, donde simplemente escribimos root y presionamos entrar.
 
Welcome to the Slackware Linux installation disk! (version 13.1)

######  IMPORTANT!  READ THE INFORMATION BELOW CAREFULLY.  ######

- You will need one or more partitions of type 'Linux' prepared. It is also
  recommended that you create a swap partition (type 'Linux swap' prior
  to installation. For more information, run 'setup' and read the help file.

- If you're having problems that you think might be related to low memory (this
  is possible on machines with 64 or less megabytes of system memory), you can
  try activating a swap partition before you run setup.  After making a swap
  partition (type 82) with cfdisk or fdisk, activate it like this:
mkswap /dev/ ; swapon /dev/

- Once you have prepared the disk partitions for Linux, type 'setup' to begin
  the installation process.

- If you do not have a color monitor, type:  TERM=vt100
  before you start 'setup'.

You may now login as 'root'.

slackware login: _

Una vez conectados prepararemos el sistema. Usualmente, solo creamos una partición para Linux y una para swap. Recomiendo crear también una para /home, ya que esto vuelve más sencillo reinstalar el sistema sin afectar la información y la configuración personal. Sin embargo, ya que esta no es una instalación común, vamos a distribuir el disco duro de manera diferente. Comenzaremos creando dos particiones, una pequeña sin cifrado donde guardaremos el núcleo de Linux y con la que arrancaremos el sistema, y una segunda donde guardaremos nuestro manejador lógico de volúmenes (LVM por sus siglas en inglés) cifrado. Al finalizar el disco duro será así:
Representación gráfica de como se vería la distribución del disco duro tras seguir está guía.
Comenzamos escribiendo fdisk -l para ver los discos duros y sus particiones en nuestra computadora, en mi caso puedo ver que mi disco está etiquetado sda, y que no tiene una tabla de particiones válida por que es un disco duro vacío, además puedo ver que no hay otros discos duros disponibles en la computadora, por lo tanto, cuando ejecute cfdisk en el próximo paso, no necesito especificarle que disco duro utilizar, usará sda.
 
root@slackware:/# fdisk -l

Disk /dev/sda: 9663 MB, 9663676416 bytes
255 heads, 63 sectors/track, 1174 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sda doesn't contain a valid partition table
root@slackware:/# _

Ahora escribiremos cfdisk y presionaremos entrar. Esto nos mostrará la interfase de cfdisk, y ya que el disco duro está vacío, el espació vacío estará seleccionado por default, si hacemos esto en una computadora que ya tiene otro sistema operativo en ella, solo necesitamos seleccionar el espacio vacío deseado con las teclas de arriba y abajo. Podemos movernos entre las diferentes opciones con las teclas de derecha e izquierda.
 
 cfdisk (util-linux-ng 2.17.2)

  Disk Drive: /dev/sda
Size: 9662676416 bytes, 9663 MB
  Heads: 255   Sectors per Track: 63   Cylinders: 1174

Name        Flags      Part Type  FS Type          [Label]        Size (MB)
 ------------------------------------------------------------------------------
                            Pri/Log   Free Space                        9656.48 












 [   Help   ]  [   New    ]  [  Print   ]  [   Quit   ]  [  Units   ]
 [  Write   ]

  Create new partition from free space_

Seleccionamos [ New ] y presionamos entrar, entonces seleccionamos [ Primary ] y presionamos entrar, entonces escribimos el tamaño de la partición, en este caso voy a seleccionar 100 MB para esta area.
 
 cfdisk (util-linux-ng 2.17.2)

  Disk Drive: /dev/sda
Size: 9662676416 bytes, 9663 MB
  Heads: 255   Sectors per Track: 63   Cylinders: 1174

Name        Flags      Part Type  FS Type          [Label]        Size (MB)
 ------------------------------------------------------------------------------
                            Pri/Log   Free Space                        9656.48 












 Size (in MB): 100_


Una vez que escribimos el número presionamos entrar, seleccionamos [ Beginning ], y la partición aparecerá, su tipo estará marcado como Linux. Una vez aquí podemos ir a la opción que dice [ Bootable ], ya que esta va a ser el área el disco desde la que arrancaremos, y presionamos entrar. Y terminamos de crear la primera partición.
 
 cfdisk (util-linux-ng 2.17.2)

  Disk Drive: /dev/sda
Size: 9662676416 bytes, 9663 MB
  Heads: 255   Sectors per Track: 63   Cylinders: 1174

Name        Flags      Part Type  FS Type          [Label]        Size (MB)
 ------------------------------------------------------------------------------
    sda1        Boot        Primary   Linux                               98.71 
Pri/Log   Free Space                        9557.78











 [ Bootable ]  [  Delete  ]  [   Help   ]  [ Maximize ]  [  Print   ]
 [   Quit   ]  [   Type   ]  [  Units   ]  [  Write   ]

 Toggle bootable flag of the current partition_

Después de esto vamos a crear la segunda partición, necesitamos seleccionar el área vacía abajo, y repetir los mismo pasos, solo que esta vez vamos a utilizar el resto del espacio vacío, una vez que esto esta hecho se verá así:
 
 cfdisk (util-linux-ng 2.17.2)

  Disk Drive: /dev/sda
Size: 9662676416 bytes, 9663 MB
  Heads: 255   Sectors per Track: 63   Cylinders: 1174

Name        Flags      Part Type  FS Type          [Label]        Size (MB)
 ------------------------------------------------------------------------------
sda1        Boot        Primary   Linux                               98.71 
    sda2                    Primary   Linux                             9557.78 











 [ Bootable ]  [  Delete  ]  [   Help   ]  [ Maximize ]  [  Print   ]
 [   Quit   ]  [   Type   ]  [  Units   ]  [  Write   ]

Write partition table to disk (this might destroy data)_

Ahora vamos a [ Write ], escribimos “yes” y presionamos entrar. La tabla de particiones es creada, toma nota de los nombres de las unidades, ya que estaremos usando sda1 y sda2 durante el proceso. Si necesitas revisarlas en cualquier momento solo escribe fdisk -l en la linea de comandos, te dará la lista de particiones. Finalmente, seleccionamos [ Exit ] para regresar a la linea de comandos.
 
Disk has been changed.

WARNING: If you have created or modified any
DOS 6.x partitions, please see the cfdisk manual
page for additional information.

root@slackware:/# _

Preparando la LVM cifrada

Vamos a cifrar sda2, pero antes, si lo deseas, ya que esto es completamente opcional, o si crees que tu computadora va a ser buscada por alguna agencia del gobierno, puedes llenar la partición entera que está destinada a ser cifrada con datos aleatorios antes de utilizarla. Esto es por que los datos cifrados se ven como datos aleatorios, así que si realizas el procedimiento en esta publicación en un disco duro nuevo (y por lo tanto vacío), será fácil determinar que área son datos cifrados, ya que el resto del disco duro estará vacío. Podemos llenar previamente esta partición con datos generados aleatoriamente, pero te advierto que esto puede llevarse un largo tiempo, hablo de horas. Para esto utilizamos el comando dd, y solo recuerda usar la partición correcta aquí, por que si haces esto en cualquier otra partición la arruinará:

dd if=/dev/urandom of=/dev/sda2

Una vez hecho esto, si elegiste hacerlo, vamos a formatear la partición a ser cifrada. Para hacer esto utilizamos:

cryptsetup -s 256 -y luksFormat /dev/sda2

Serás advertido que este comando destruirá completamente cualquier dato que tengas en esa partición, después de confirmar que esto es realmente lo que quieres hacer, se te preguntará dos veces por tu contraseña, esto acepta más que números y letras, pero se cuidadoso con lo que utilizas, por que si no tienes la distribución del teclado correcta y utilizas símbolos, podrías terminar con con una contraseña que es diferente de lo que creíste que escribiste, y adicionalmente a esto, si olvidas tu contraseña, perderás tus datos, todos ellos, y no habrá nada que nadie pueda hacer al respecto, esta el la razón por la que recomiendo que constantemente respaldes tu información. Si esta en tu computadora móvil y tienes una computadora de escritorio en casa, recomiendo que rutinariamente sincronices el contenido de tu computadora portátil con el de tu computadora de escritorio.
El cifrado por default es 'AES', con una llave de 128 bits, puedes modificar la fuerza de el cifrado con -s y un múltiplo de 8. En este caso estoy utilizando una llave con una fuerza de 256 bits. El parámetro -y es para que te pida confirmación de la contraseña al definirla. Por supuesto, mientras más larga sea la llave, más difícil será romper el cifrado, pero cada operación de lectura y escritura costará más ciclos del procesador.
Una vez hecho esto, vamos a abrir nuestra partición cifrada y utilizarla como un dispositivo mapeado, llamaremos a este slackcrypt (o lo puedes llamar como quieras) para que esto aparezca montado en /dev/mapper/slackcrypt:

cryptsetup luksOpen /dev/sda2 slackcrypt

Esto va a pedirte la contraseña que introdujiste anteriormente. Con nuestra partición cifrada abierta y montada como un dispositivo mapeado, vamos a crear un Volumen Físico (PV – Physical Volume) en /dev/mapper/slackcrypt

pvcreate /dev/mapper/slackcrypt

Entonces creamos un Grupo de Volúmenes (VG – Volume Group) llamado cryptvg (esto puede ser nombrado como quieras también):

vgcreate cryptvg /dev/mapper/slackcrypt

Ahora procedemos a crear tres Volúmenes Lógicos (LV – Logical Volume), uno para el sistema (root), uno para los datos personales (home) y uno para la memoria virtual (swap), la suma de los volúmenes lógicos debe quedar debajo de el tamaño total del grupo de volúmenes. En case que necesites revisar cuanto espacio tienes disponible puedes hacerlo con:

vgdisplay -v cryptvg | more

Para salir de eso presionas q. Podemos definir el tamaño del volumen lógico usando -L, un número y un sufijo opcional. Por default el número se toma como megabytes, pero puedes utilizar los suffijos K (kilo), M (mega), G (giga), T (tera), P (peta) o H (hexa), aunque los últimos tres sufijos son demasiado grandes al momento de escribir este artículo. Adicionalmente podemos utilizar -l (L minúscula) para utilizar un extendido lógico, %VG sería un porcentaje de el tamaño del grupo de volúmenes, %FREE sería un porcentaje de el espacio libre restante en el grupo de volúmenes, para este ejemplo utilizaré 7GB para el sistema, 500MB para la memoria de intercambio, y el resto del espacio para datos personales.

lvcreate -L 7G -n root cryptvg
lvcreate -L 500M -n swap cryptvg
lvcreate -l 100%FREE -n home cryptvg


Ahora haremos que el sistema detecte los volúmenes lógicos y cree nodos de dispositivo para ellos:

vgscan --mknodes

Como resultado obtendremos un 'Found volume group “cryptvg” using metadata type lvm2', entonces procederemos a activar todos los volúmenes, esto hará que los volúmenes lógicos se vuelvas conocidos para el kernel, y así podremos formatear el volumen del área del intercambio y utilizar los volúmenes lógicos durante el proceso de instalación:

vgchange -ay

Esto nos devolverá '3 logical volume(s) in volume group “cryptvg” now active'. Y ahora ejecutaremos mkswap para que el programa de instalación identifique el volúmen lógico swap como una partición de área de intercambio válida. Hacemos esto con:

mkswap /dev/cryptvg/swap

Y terminamos de preparar el sistema para la instalación de Slackware.

Instalación

Ahora puedes escribir setup, presionar entrar, y seguir las instrucciones para realizar una instalación de Slackware normal. Cuando estés configurando Swap, automáticamente detectará /dev/cryptvg/swap como el área de intercambio, solo acepta la configuración. Cuando se te pregunte sobre las particiones, selecciona /dev/cryptvg/root para la partición raíz, /dev/cryptvg/home para la partición de /home, y /dev/sda1 para /boot, esto será la única parte no cifrada en esta instalación de Slackware. En esta parte de la instalación verás mas dispositivos como /dev/mapper/* No toques nada de esto o podrías perder los volúmenes lógicos, o el grupo de volúmenes, o el área cifrada.
Una vez que todos los paquetes han sido instalados, eventualmente llegaremos al diálogo de liloconfig. Elige experto, entonces selecciona Begin, y cuando se te pregunte donde instalar lilo selecciona MBR (Master Boot Record) y /dev/sda. Entonces elige “Add Linux partition” y verás las diferentes áreas del disco duro, escribe /dev/cryptvg/root, dale un nombre, y finalmente elige Install. Esto intentará instalar lilo, pero podrías ver un mensaje de error diciendo que la instalación de lilo falló. Si lo obtienes, ignóralo, por que tendremos que agregar una imagen initrd a '/etc/lilo.conf' y volver a ejecutar lilo una vez que la instalación esté terminada y estemos de vuelta en la linea de comandos.

Arreglando lilo

Cuando la instalación este terminada, el disco será expulsado (si es un disco lo que has estado utilizando para instalar Slackware) y se nos pedirá que presionemos ctrl+alt+suprimir para reiniciar. Pero antes, vamos a arreglar lilo así que no reinicies todavía. El programa de instalación ya ha hecho todas las preparaciones, como remontar /sys y /proc en /mnt y generando nodos de dispositivo para el manejador de volúmenes lógicos (LVM) en /mnt.Volvamonos root en el sistema recién instalado con chroot:

chroot /mnt

Aquí vamos a crear una imágen de initrd con soporte para volúmenes lógicos y cifrado. La imágen será llamada initrd.gz y ya que formateamos root como ext4 (o al menos eso hice, puedes cambiar esto a el sistema de archivos que tu utilizaste durante el proceso de instalación) y ya que estamos utilizando el kernel por default de Slackware 13.1:

mkinitrd -c -k 2.6.33.4-smp -m ext4 -f ext4 -r /dev/cryptvg/root -C /dev/sda2 -L

Este comando creará una carpeta llamada initrd-tree dentro de /boot, donde puedes agregar módulos o cambiar la distribución del teclado para donde pide la contraseña al inicio si lo necesitas. Si cambias esto necesitaras volver a ejecutar mkinitrd. La imagen resultante de initrd será guardada en '/boot/initrd.gz' por default. Ahora, necesitamos abrir el archivo /etc/lilo.conf y decirle a lilo sobre nuestro nuevo initrd, así como cargar el kernel genérico en vez de el enorme. El enorme está planeado para poder arrancar el sistema desde el disco en una gran variedad de sistemas, pero realmente no lo necesitamos y es más grande de lo que lilo puede manejar. Para editar el archivo podemos utilizar nano, vi, o vim, en este ejemplo uso nano, pero personalmente prefiero utilizar ViM.

nano /etc/lilo.conf

En la parte de abajo, veras el area de Linux, edítala para que se vea así:

image = /boot/vmlinuz-generic-smp-2.6.33.4-smp
  initrd = /boot/initrd.gz
  root = /dev/cryptvg/root
  label = Slackware
  read-only


Ahora guarda los cambios con ctrl+o y sal con ctrl+x. Y ejecuta lilo:

lilo

Te dará algunas advertencias, una referente a '/proc/partitions'. Ignora esto y reinicia cuando lilo termine con ctrl+alt+suprimir. Después de que reinicies, el sistema te pedirá tu contraseña. Tras introducir tu contraseña, el sistema iniciará en Slackware. Trabajaras como siempre, y cuando apagues tu computadora o la pongas a hibernar, todo, incluyendo tu área de intercambio serán cifrados en tu disco.

Notas finales

Respalda seguido, no puedo enfatizar esto lo suficiente. Si por alguna desafortunada razón tu disco duro falla, si pierdes u olvidas tu contraseña, o quien sabe que más pueda pasar, nadie va a poder recuperar la información contenida en tu sistema cifrado. Al final de cuentas esto es el objetivo de hacer esto, para que ninguna otra persona pueda acceder a tu información delicada, pero eso incluye a cualquiera que pudiera reparar o darle mantenimiento a tu computadora.
Y eso será todo por ahora. Me gustaría expandir más esto para cubrir el proceso entero de instalación con imágenes, pero desafortunadamente no hay tiempo, pero ya habrá actualizaciones, cuando lleguen nuevas versiones de Slackware.

Los comandos en bruto

cfdisk
dd if=/dev/urandom of=/dev/sda2
cryptsetup -s 256 -y luksFormat /dev/sda2
cryptsetup luksOpen /dev/sda2 slackcrypt
pvcreate /dev/mapper/slackcrypt
vgcreate cryptvg /dev/mapper/slackcrypt
lvcreate -L 7G -n root cryptvg
lvcreate -L 500M -n swap cryptvg
lvcreate -l 100%FREE -n home cryptvg
vgscan --mknodes
vgchange -ay
mkswap /dev/cryptvg/swap
setup
chroot /mnt
mkinitrd -c -k 2.6.33.4-smp -m ext4 -f ext4 -r /dev/cryptvg/root -C /dev/sda2 -L
nano /etc/lilo.conf


Edita la entrada de Linux para que quede así:

image = /boot/vmlinuz-generic-smp-2.6.33.4-smp
  initrd = /boot/initrd.gz
  root = /dev/cryptvg/root
  label = Slackware
  read-only

lilo
 

Tomado de: http://www.jveweb.net/archivo/2010/10/instalando-slackware-en-un-lvm-cifrado.html