24.12.07

Datos seguros con sistema de ficheros encriptado

Para el administrador de sistemas es esencial el uso de un "password ring", tal como ZSafe, MyPassWordSafe o KeyPass, entre otros. Pero desde que la LOPD es ley, mantener a salvo datos sensibles de clientes, buzones de contactos o documentos bancarios es una tarea prioritaria.
Una solución muy elegante para estos casos, en lugar de encriptar el sistema de ficheros al completo, es crear un sistema del tipo loopback, mantenerlo cifrado y montarlo/desmontarlo según sea necesario.
Veamos los pasos a seguir para conseguirlo:

1) Cargar los módulos de cifrado

modprobe cryptoloop
modprobe aes

(si no se dispone de ellos, se bajan precompilados para kernels de stock usando apt-get)

2) Crear la imagen. En este ejemplo le indicamos que tendrá un tamaño inicial de 100Mb (bs=1MB count=100)

dd if=/dev/urandom of=cryto_fs.img bs=1M count=100

3) Asociar la imagen creada al sistema loopback e indicarle que va a estar cifrada con AES 128bit

losetup -e aes /dev/loop0 crypto_fs.img
Password:

4) Formatear en el sistema de ficheros preferido

mkfs -t ext3 /dev/loop0

5) Montar en el directorio de trabajo seleccionado

mount /dev/loop0
mount -o loop,encryption=aes crypto_fs.img /home/jose/datos_sensibles/

En este punto, nos pedirá la contraseña de cifrado y podremos comenzar a trabajar con nuestro sistema de ficheros seguro.

La única pega es que para este tipo de ficheros, no nos funcionará el montado en arranque mediante fstab (tendremos que facilitar la contraseña igual), lo cual, aunque incordie, es una medida de seguridad de lo más obvio.

9.12.07

Python: Leer los titulares de un rss de noticias

Pongamos por caso que necesitamos extraer los titulares de un xml (rss) de un periódico. Lo más fácil será crear un parseador xml con sax o minidom que extraiga los datos contenidos entre los tags "title". En mi caso, esta función simple que hace uso de minidom, me ha aliviado el proceso más de una vez:

def buscaXMLTag(xmlFile,xmlTag):
   resultList = []
   try:
      dom = minidom.parse(xmlFile)
      elements = dom.getElementsByTagName(xmlTag)
      if len(elements) != 0:
      for i in range(0,len(elements)):
         resultList.extend([elements[i].childNodes[0].nodeValue])
      else:
         # O ficheiro non ten tags sobre os que buscamos
         pass
   except:
      # O ficheiro non existe ou non se pode abrir
      pass

   return resultList