Descifrar y usar particiones al conectar un USB

En esta entrada intentaré presentar un método bastante común para automatizar el uso de particiones (volúmenes) cifrados. Normalmente al cifrar una partición la configuramos de tal forma que al arrancar el sistema operativo, se pregunte por la contraseña para proceder a descifrar y así poder montarla (utilizarla).

En mi caso tengo una partición en la cual guardo mi información personal. Información que tiene valor para mí y que no me gustaría ver en manos de otras personas (en el hipotético caso que roben en mi casa y se lleven mi pc). Interrumpir la secuencia de arranca para preguntar por la contraseña no me parece una buena idea ya que la mayoría del tiempo no uso esa partición.

Lo ideal sería poder hacer algo fácil y rápido que habilite el uso de dicha partición cuando lo necesito. Sin tener que memorizar una contraseña ya que lo usaré poco y es probable que termine olvidándola. La solución es guardar la llave en una unidad flash usb y condicionarlo de tal forma que al ingresar el usb en la máquina se realice todo el proceso automáticamente.

Lo primero es preparar la partición, en mi caso es /dev/sdb1 y usaré twofish en modo cbc:

Después de esto procedemos a descifrar la partición para poder usarla:

Y como es la primera vez, debemos agregar el sistema de archivos (ext4 en mi caso) es decir, formatearla:

Ya con esto tenemos nuestra partición lista, en mi caso he escogido /srv/media como el lugar donde la usaré, por lo cual, después de crear dicho directorio, cada vez que quiero usarla tendría que:

Es precisamente esta parte la que queremos automatizar, usando una unidad usb flash. Para lo cual la preparamos de forma similar a esta:

Es decir, una partición pequeña al comienzo y luego otra para el resto del disco, Creamos los sistemas de archivos:

Procederemos a montar la primera partición del usb (que será la que guardará la llave) y generaremos 256 bytes aleatorios (pseudo aleatorios) que usaremos como nuestra llave, como podrán ver la almacenaré también en formato base64, el cual facilita mucho escribirla (incluso en papel) para almacenarla:

El fichero key.b64 lo podemos imprimir, copiar, duplicar, etc, esté será nuestra copia de respaldo de la llave, para regresar a la versión utilizable (de ser necesario), usaríamos:

En este punto tenemos una partición cifrada con una contraseña y una memoria flash usb con otra contraseña mucho más grande (256 bytes). Nos falta asociar la contraseña grande a la partición, crear un script para automatizar el proceso y asegurarnos que dicho script se ejecute automáticamente cada vez que conectamos la memoria usb a la pc.

Agregamos la nueva llave con el siguiente comando:

Es posible ver las llaves que tenemos con:

Confirmamos que es posible descifrar la partición usando ambas llaves:

Ahora sólo falta automatizarlo, para ello crearemos un script que repita los pasos anteriores y usaremos udev para que llamarlo automáticamente cuando se detecte nuestro usb.

Usando el comando lsusb buscamos el id del fabricante y producto, en mi caso:

Lo que interesa es 154b:0044, creamos el fichero /etc/udev/rules.d/100-mount-cryptmedia.rules con lo siguiente:

Es muy importante la parte de SYMLINK, esto no crearé un link simbólico sin importar el número (sdX) que se le asigne, es decir que siempre tendremos un /dev/mediakeyX disponible, en otras palabras:

En lugar de usar /dev/sdc1 (que puede cambiar) usaremos /dev/mediakey1. Ahora sólo falta crear el script (/usr/local/bin/mount_media.sh) el cual sería algo así:

Obviamente este script puede ser mejorado mucho más, pero a modo de explicación e intentando mantenerlo lo más simple posible, funciona. Por último sólo nos queda eliminar la primera llave:

Esto nos deja con una sola llave (la de la memoria usb) en nuestro volumen cifrado.

Publicado en Uncategorized | Etiquetado , , , , , | 18 comentarios

ZFS

Esta entrada es sobre el sistema de ficheros ZFS, el mismo fue desarrollado por Sun (ahora Oracle) y tiene como fuerte preservar al integridad de la data. A pesar de ser código abierto, por incompatibilidad de licencias no puede ser incluido en el Kernel de Linux, pero sí su implementación usando fuse.

En mi caso necesito un sistema de archivos para mi información familiar, fotos, vídeos, música, etc. Mayormente los formatos que tengo ya tienen compresión por ellos mismos, por lo cual un sistema de archivos con compresión no me serviría de mucho, de hecho sería contraproducente ya que consumiría ciclos de CPU casi que por el gusto.

Para esta prueba vamos a usar un archivo común como disco, zfs permite usar discos, particiones o archivos. Primero creamos un archivo de 512MB:

Luego pasamos a crear nuestro pool o contenedor de volúmenes, en este caso no vamos a crear ningún volumen extra en él, lo usaremos tal cual:

Además de crear el sistema de archivos también lo monta en /testpool y lo deja listo para usar. La información del pool se almacena en /var/lib/zfs/.

Podemos ver el estado con:

De momento todo bien, vamos a copiar unos archivos de imágenes en formato JPEG a /testpool/ para intentar simular corrupción de la data, una vez copiado los archivos pasaremos a desmontar la unidad:

Ahora modificamos algunos bytes de nuestro disco duro (rawdisk.1), las imágenes que copié tienen de encabezado las letras “JFIF”, buscaremos esto en nuestra data y lo modificaremos un poco:

De “JFIF” vamos a cambiar “IF” por algo aleatorio, para ello usamos lo siguiente:

La primera columna de la salida de hexdump muestra la posición (en hexadecimal) de la data, en nuestro caso 0x0040ac00 corresponde al byte “ff”, de allí empezamos a contar, 1 es “d8”, 2 es “ff”, 3 es “e0” y así hasta llegar a “IF”, que es 49 y 46 respectivamente (se puede comprobar con una tabla ascii, man ascii), la cuenta nos da 8, por lo cual convertimos a decimal y sumamos 8, luego ese valor es la posición (en bytes) desde la cual iniciaremos el daño.

Repetimos el proceso con otros JFIF y volvemos a cargar el sistema de archivos:

Verificamos su integridad (esto se ejecuta periódicamente, pero se puede hacer manual para adelantar el proceso):

Y ahora:

¡Tenemos 2 errores!, hacemos caso y agregamos ‘-v’:

No solo se detectó el error, sino que también nos dice los archivos afectados. Los mismos no pueden ser recuperados y nos pide restaurar la copia de respaldo que no tenemos. Si hubiésemos creado dos discos y creado el pool como mirror, zfs los hubiera podido recuperar por nosotros.

La ventaja de tener este tipo de detección es que nos permite tomar acciones antes de que los errores destruyan más nuestra información.

Referencias:

  1. ZFS en la wikipedia
  2. Implementación de ZFS en Linux usando fuse
  3. Guía de administración de ZFS (Solaris, en inglés)
Publicado en Uncategorized | 1.451 comentarios

BioDisk de 500EB por sólo 750 dólares!*

*Oferta válida en el 2050, 1 Exabyte = un billón de gigabytes.

Para entender mejor estas cifras imagínese un disco duro con la capacidad de guardar 500 veces toda la data que hay en internet. No, no estoy exagerando; es lo que promete la tecnología de escribir y leer información en ADN desarrollada en el Colegio para Ingeniería Biomédica de la Universidad de Harvard.

Los esfuerzos por crear un dispositivo de almacenamiento biológico no son nuevos, en el 2010 el Dr. J. Craig Venter y su equipo lograron codificar en secuencias de ADN 7920 bits de información digital (escribieron sus nombres en una hebra de ADN), una marca mundial en ese momento. Este año un equipo del Instituto Wyss logró codificar en secuencias de ADN un libro de 53,400 palabras, 11 imágenes JPG y un programa escrito en JavaScript que equivalen a 5.27 millones de bits de información digital, un record impresionante. Explican los doctores George Church, Sri Kosuri y Yuan Gao que el ADN es el medio de almacenamiento más denso y estable que se conoce, al ser volumétrico y no plano como las tecnologías actuales se pueden guardar 100 billones de DVD en un sólo gramo de ADN que puede durar hasta 3 billones de años sin alteración alguna.

Por ahora las desventajas más notorias son la disponibilidad de la tecnología usada y lo lento que es para leer lo escrito en el ADN, pero esto lo hace excepcional para conservar información por muchísimo tiempo.

El ADN contiene instrucciones genéticas muy simples pero poderosas hechas de 4 químicos llamados bases: adenina (A), guanina (G), citosina (C) y timina (T), ampliamente conocidos ya desde la secuencia del genoma humano y de otras especies animales y vegetales. El equipo del Doctor Church utilizó la secuencia del ADN (TGAC) para representar valores binarios, asignando el 1 para T y G y 0 para C y A. Codificando de esto: 0100000101000010 a esto: CAATGGCTAGGTACTATGTATGAGAT, sintetizandolo luego en hebras de ADN, secuenciandolo y finalmente volviendo a decodificarlo para su lectura.

Es obvio que esta tecnología está dando sus primeros pasos y estamos lejos de poder llevar en un “BioUSB” toda información digital creada por el hombre en un año, pero el abaratamiento en los costos del proceso de secuencia y sintésis del ADN nos acercan más a esta posibilidad.

Para ampliar esta información: Harvard | ExtremeTech (inglés).

Publicado en Noticias | Etiquetado , , , | 6.545 comentarios

La técnica pomodoro

La técnica pomodoro es un método para aumentar la productividad, concentración y enfoque, consiste en trabajar por 25 minutos, luego descansar 5 y repetir, al 4to ciclo en lugar de tomar una pausa de 5 minutos se toma una más amplia, de 15 o 20.

A continuación algunas aplicaciones para hacer el proceso más fácil:

Vale la pena probarlo.

Publicado en Uncategorized | 1.537 comentarios

Compartiendo directorios

Llega el momento en que tienes un montón de vídeos, música y demás documentos que te gustaría compartir entre usuarios. Y es que con la llegada de televisores inteligentes, media boxes y demás artilugios resulta muy conveniente instalarse una media server (Media Tomb por ejemplo, o alguno de aquí) en la pc de casa y compartirlo todo con los demás dispositivos.

El problema llega cuando se tienen varios usuarios en dicha pc, como pasa en mi caso, cada integrante de la familia tiene una cuenta en la pc (o mejor dicho, mini servidor) de casa, estas personas tienen su contenido en sus directorios personales y eventualmente los compartirán con el directorio en el cual escucha el media server.

Aquí llegan los problemas con los permisos. Digamos que nuestro servidor UPnP (media server) exportará el contenido de /data por lo cual necesitamos que todo lo que llegue a ese directorio tenga permisos de lectura (y escritura, por si hace falta modificar algún id tag o algo) para el grupo que usaremos.

Primero creamos el grupo a usar:


# groupadd media

Creamos nuestros directorios:


# mkdir -p /data/Music
# mkdir -p /data/Videos
# mkdir -p /data/Pictures
# mkdir -p /data/Documents

Una vez que tenemos nuestra estructura de directorios principal, podemos pasar a definir permisos globales:


# chgrp -R media /data
# chmod -R /data
# chmod -R g+s /data

Con esto le damos permiso de lectura y escritura al dueño de los directorios (root, pero bien podría ser el usuario que usa nuestro UPnP), a los miembros del grupo media y a nadie más.

Ahora agregamos nuestros usuarios al grupo, pero nos encontramos que al copiar o mover archivos o directorios a /data/ se agregan con el grupo media pero con los permisos por defecto (umask) lo cual es un problema ya que los demás usuarios nos serán capaz de modificar los mismos.

En principio puede que esto no sea un problema, pero eventualmente lo será, imagine el caso en que el usuario1 convierte un cd de su artista favorito a ogg y lo agrega a /data/Music/ pero sin incluir los respectivos id tags, si el usuario2 se da cuenta de esto, tendrá que pedirle al usuario1 que lo modifique en lugar de poder hacerlo él mismo.

Para lidiar con esto hay dos posibles soluciones, usar bindfs o listas de acceso (ACL).

BindFS

BindFS es un sistema de archivos basado en FUSE que permite montar un directorio sobre otro modificando varios permisos. En el caso que dispongamos de él, podemos usarlo:


# bindfs --create-for-group=media -gmedia --create-with-perms=u+rw,g+rw,o-rwx -pu+rw,g+rw,o-rwx /data /data

Esto nos asegura que todos lo que se cree nuevo tendrá como grupo media (create-for-group) que el grupo con el cual se montará será media (g), que los permisos se mantendrán de escritura y lectura para el dueño y grupo (create-with-perms y p)

Ahora sólo debemos agregarlo a nuestro /etc/fstab con la siguiente línea:


bindfs#/data    /data    fuse    perms=u+rw:g+rw:o-rwx,create-with-perms=u+rw:g+rw:o-rwx,group=media,create-for-group=media    0    0

Listas de acceso

Las listas de control de acceso o atributos (permisos) extendidos se incluyeron a partir del kernel 2.6, las mismas permiten un mayor control de los permisos de cada archivo.

Para poder ser usadas nuestra partición debe estar montada con la opción acl (la cual debería ser por defecto), es posible usar el comando mount para comprobar las particiones que tenemos habilitadas:

<code
$ mount | grep acl

El comando a usar para modificar dichos permisos es setfacl y en nuestro caso podríamos usarlo de la siguiente forma:


# setfacl -R -d -m u::rw,g::rw,g:media:rwx,o::- /data

¡Y ya está!

Publicado en Uncategorized | 1.059 comentarios

Llaves SSH y conexión sin contraseñas

Desde usuarios regulares hasta administradores de sistema casi siempre ocurre que debemos ingresar de forma remota a otro equipo, el protocolo/aplicación de-facto para dicha tarea es SSH, el cual nos permite ingresar con un usuario y contraseña a equipos remotos.

Muchas veces ingresamos con frecuencia a los mismos equipos o nos gustaría tener más seguridad que simplemente un usuario y contraseña. Para eso podemos usar llaves criptográficas, este artículo asume que usted está en el equipo ClienteA y cuenta con una cuenta en el ServidorB al cual desea ingresar.

Lo primero es crearnos un juego de llaves, se le denomina juego de llaves porque consta de una llave pública y una privada, como su nombre lo indica la pública se puede compartir y la privada no.

Para eso ingresamos (en caso que no estemos ya allí), a nuestro equipo, ClienteA y ejecutaremos:

Seguimos las instrucciones y si no queremos ingresar una contraseña pues no lo hacemos, la dejamos en blanco y confirmamos dos veces, esto nos debería crear algo más o menos así:

El fichero id_rsa contiene nuestra clave privada, el id_rsa.pub nuestra pública y el known_hosts no es importante.

Ahora tenemos que pasar nuestra llave pública al equipo remoto, como tenemos trastornos de personalidad, nuestro usuario allá se llama frank, por lo cual:

Con esto creamos el directorio (/home/frank/.ssh) en el ServidorB si ya existe pues no pasa nada.

Como último paso copiamos nuestra llave pública a la lista de llaves aceptadas en ServidorB para ello:

Luego de esto confirmamos que podemos ingresar sin contraseña (de no haber especificado ninguna) así:

¡Listo!

Publicado en Uncategorized | 1.365 comentarios

Llevando la contabilidad

Existen varias soluciones en Linux para llevar un control de, ya sea la contabilidad personal o la de algún negocio. Entre los más populares está GnuCash el cual he usado en el pasado pero nunca terminó de gustarme del todo.

Los que llevan algo de tiempo leyéndome sabrán que soy un usuario de Emacs y fanático de los archivos de texto.

La aplicación que cumple con esto se llama ledger es una aplicación de texto que lee, procesa y reporta transacciones en un archivo de texto. Lo bueno de ledger es que no modifica ni altera la data de ninguna forma, la data (y por data me refiero a transacciones) se mantienen en el archivo de texto plano que se proporcione.

El formato de dicho archivo es bastante simple:

2012/01/29 Slackware Store
    Gastos:Ropa              $ 15.00
    Deudas:Visa

2012/01/29 Pago a VISA
    Deudas:Visa              $ 15.00
    Bienes:Banco:Chequera

Aquí tenemos dos transacciones, la primera es una compra usando la tarjeta de crédito y la segunda es un pago/abono a la cuenta de dicha tarjeta. Como se puede apreciar, los nombres de las categorías y subcategorías los inventa uno, basta con que sean separados por ‘:’ por lo cual tenemos flexibilidad total.

Como es de esperar junto con la aplicación viene un modo para emacs ‘ledger-mode’ el cual facilita el ingreso de transacciones y al estar todo en un archivo de texto plano lo que importa es dicho archivo (que fuera del formato usado, poco tiene que ver con la aplicación en si), por lo cual el mismo puede ser modificado desde cualquier punto siempre que se cuente con una conexión ssh y un editor de texto.

La aplicación (ledger) será usada sólo al momento de analizar la data, ver los balances, revisar presupuesto, etc, etc.

Lo que yo hago es que tengo mi archivo en un repositorio con git lo cual me permite sincronizar los cambios desde distintas ubicaciones y para tenerlo todo en un lugar seguro en caso de catástrofe uso un repositorio git privado en bit bucket pero hay muchos más que ofrecen repositorios privados de forma gratuita.

Si está buscando una forma de llevar el control de sus finanzas, hacer presupuestos y demás, debe probar ledger.

Referencias:

Publicado en Uncategorized | Deja un comentario

Encriptando sistemas de archivos

La seguridad es un tema que todo usuario debe tener presente, siempre que maneje información medianamente importante.

Existen varias soluciones para cifrar información en Linux, quizás la más común es cifrar toda una partición. El problema con esto es que en muchos casos o nos quedamos sin espacio o bien lo desperdiciamos y aunque existen soluciones para aumentar y/o disminuir el tamaño de las particiones de forma más dinámica como LVM la tarea puede llevar algo de riesgo.

eCryptFS

Una posible solución es usar eCryptfs, el cual es un sistema de archivos cifrado y el mismo está contenido en un directorio. Es decir, es un directorio que es “montado” como un dispositivo de almacenamiento, todo lo que se escriba o lea de él se cifrará de manera transparente. Una vez desmontado el mismo la información estará cifrada.

Para preparar un directorio de prueba:

$ mkdir secret
# mount -t ecryptfs secret/ secret/

Se deben recordar los parámetros usados para la próxima vez que se monte.

EncFS

EncFS es otra opción, la misma no requiere ser root ni hacer un suid del mount.

Para usarlo, una vez instalado, ejecutamos lo siguiente:

$ mkdir secret-raw
$ mkdir secret
$ cd secret
$ echo "probando con una línea de texto" > archivo.txt
$ cat archivo.txt
probando con una línea de texto
$ fusermount -u secret
$ cd secret-raw
$ ls
0QOUfazjVWTUASS1,IGYuJ3m
$ cat 0QOUfazjVWTUASS1,IGYuJ3m
�Q^�V-���+wI�$�kZz�㈎zQ '/�.y8��

Se creará un fichero en ~/secret-raw/.encfs6.xml con toda la información seleccionada al momento de crear el volumen, es importante mantener una copia del mismo (protegida).

Notas

Como nota extra es importante recordar que debemos (en la medida de lo posible) cifrar la partición swap. La razón es por la posibilidad que el sistema operativo escriba el contenido de memoria en dicha partición. El atacante podría revisar la información en la partición swap en busca de llaves o información del contenido cifrado.

Para cifrar la partición swap lo mejor es usar dm-crypt, como la data sólo es importante durante la sesión, no es necesario especificar una llave ya que puede ser escogida al azar al inicio.

Lo mejor es seguir la documentación de la distribución que se esté usando para cifrar la partición swap.

Publicado en Uncategorized | 1.113 comentarios

Twitteando desde Emacs

Emacs es un editor de texto de culto, en mi opinión, lo mejor que hay para programar, es todo un IDE, la cantidad de funciones que tiene y puedes agregar va de lo sublime a lo ridículo. Sigue leyendo

Publicado en Uncategorized | 986 comentarios

Nos mudamos a OFTC

Hemos tomado la dura y triste decisión de mudarnos a la red OFTC. Por más de 22 años hemos estado usando la red Undernet pero en los últimos meses se a echo más y más difícil poder accesar la red o mantenerse conectado debido a contantes netsplits y glitches en la red.

Y porque OFTC y no Freenode te preguntaras? Al principio evaluamos la red Freenode y a pesar que el canal ya estaba registrado, el dueño del canal ofreció darnos acceso pero no transferir el canal a pesar de que no ha sido usado por mucho tiempo. Tambien durante nuestro periodo de evaluación observamos unos “netsplits.”

Ya se porque no Freenode pero porque OFTC, esta red tan desconocida quisieras saber? OFTC significa: “Open and Free Technology Community” y se puede traducir como: “Comunidad de tecnología libre y abierta” y su filosofía se aplica a nuestro gol. Si quieres saber más sobre OFTC visita: http://www.oftc.net/

Otros proyectos importantes también comparten esta misma red como el canal oficial de Debian el cual es una de las distribuciones más importantes de Linux. Ven y visítanos ya sea utilizando el link a chat en el menú o usando tu cliente de IRC favorito y conectándote al Server irc.oftc.net

Publicado en Anuncios | Deja un comentario