sábado, 27 de febrero de 2010

BSC Barcelona Supercomputnig Center

Fuí a visitar el centro de supercomutación de Barcelona o BSC. Un superordenador llamado Mare Nostrum, que está dentro de una iglesia antigua. Sin palabras. Just amazing.
Algunas de sus características son las siguientes: Tienen 10.240 procesadores trabajando a 2,3GHz. Unos 5.000 ordenadores, con doble procesador de doble nucleo. Unos 4GB de memoria RAM por PC, lo que suma la escandalosa cifra de 20TB de memoria RAM. Velocidad total de procesamiento: 9.2 GFlops. Todo el conjunto de equipos ocupa 120m² ( unos 15x8 metros ).

Todo este hardware está conectado con cables de fibra optica, y que en un espacio tan reducido se han necesitado 60 kilómetros de fibra para conectar todos los equipos.

Evidentemente corren Linux (Suse Linux Enterprise Server), modificado por ellos mismos y adaptado a sus necesidades.

En 2006 este ordenador estaba en la posición 5 del ranking mundial de los ordenadores mas pontentes del mundo. Al ser un mercado muy competitivo donde todos quieren ser la punta de la lanza y juntándose con la crisis galopante que sufrimos todos, no recibieron el dinero suficiente para actualizar sus sistemas, de modo perdieron posiciones hasta quedar en la 77. Aún así, la posición 77 del ranquing mundial es una muy buena posición.

Fué algo absolutamente increible. Les dejo algunas fotos para que vean las instalaciones del centro (click para ver mas grande):








martes, 23 de febrero de 2010

OpenSSH, hash / digest [II]

Explicación
Hoy vamos a explicar lo que es un hash o un "digest" de un mensaje. Cuando nosotros tenemos unos datos determinados, ya sean ficheros de texto o binarios, podemos hacer un resumen de estos datos. Que significa hacer un resumen? Pues muy fácil. Tenemos una fotografía, y queremos sacar su "hash" ( también llamado resumen o digest, ok? ). Pues lo que hará el programa encargado de hacer el hash es lo siguiente:
  • Va a comprimir la foto lo más que pueda
  • Va a partir la foto en trozos de un tamaño determinado
  • Aplicará una función a cada uno de los trocitos.
  • Esta función siempre devuelve un nº de bits determinados.
  • El resultado se combina siempre con el resultado anterior.
Lo que nos promete el algorítmo es que si cambia un solo bit del fichero original, la función de hash va a ser completamente diferente que el resultado de la función del fichero original. De este modo podemos saber si un fichero se ha modificado. Esto se puede hacer con todo tipo de archivos.
Y una propiedad que puede ser obvia pero que debe comentarse, es que de un "hash" no se puede volver a la información original. Es una operación de un solo sentido. Podemos hacer el hash de "hola". Pero del hash resultante no lo podemos volver a su estado original (en nuestro caso a la palabra "hola" ). Es imposible.

Para que se usa algo así?
Bueno, en seguridad tiene mucha utilidades, pero un ejemplo muy fácil de entender es el siguiente: Imagina que quieres mandarle una pelicula a tu amigo. Para saber si le ha llegado bien, lo que se hará será lo siguiente: calcular el hash en mi PC y que el amigo calcule su función de hash en su PC. Si son iguales, sabemos que el fichero se ha mandado bien.
También sirve para guardar passwords de modo seguro, etc...

Tipos de algorítmos de hash?
Bueno, pues ya los listé en el post anterior. Los algorítmos soportados por OpenSSL son los siguientes:
md2, md5, mdc2, rmd160, sha, sha1, sha224, sha256, sha384, sha512

Es posible que dos resumenes de dos ficheros diferentes nos den el mismo resultado?
Teoricamente si. Pero la la probabilidad de que esto ocurra es MUY baja. Tal que así:
  • Si utilizamos un algorítmo como md5 que hace un resumen de 128 bits existe la probabilidad de 1/(2^128) que es lo mismo que 1 / 340282366920938463463374607431768211456
  • Si utilizamos sha256 la probabilidad de 1 / (2^256)
Recordemos que 256 bits no es el doble de posibilidades que 128 bits! El doble de 128 bits es 129 bits!!


Vale, la teoría está explicada. Pero mejor acabarlo de pulir con un par de ejemplos:

Creamos un fichero de texto con el siguiente comando:
$ echo "TEXTO TEXTO TEXTO" > ar1.txt
Y ahora procedemos a calcular su función de hash:
$ openssl dgst -md5 ar1.txt
MD5(ar1.txt)= c89977bcf69702e21a82575b187459d4

Bien, que significa el resultado? Pues bien, que aplicando el hash MD5 del fichero "ar1.txt" tenemos un resultado tal y como se ve aquí arriba.

Vale, vamos a hacer un cambio tonto en el fichero:
$ echo "TEXTO TEXTo TEXTO" > ar2.txt
Y ahora procedemos a calcular su función de hash:
$ openssl dgst -md5 ar1.txt ar2.txt
MD5(ar1.txt)= c89977bcf69702e21a82575b187459d4
MD5(ar2.txt)= 31b68c308e9299482ef2b2754df853be

Ahora, como podeis ver he hecho el hash de los dos ficheros "ar1.txt" y "ar2.txt". Como se puede apreciar claramente, los hashes son completamente distintos uno del otro, lo que significa que los ficheros no son esctrictamente iguales. Es de vital importancia entender que un cambio, por insignificante que sea, nos devuelve un hash completamente diferente del original.

Si queremos utilizar programas más simples de usar que openssl podemos utilizar:
  • md5sum
  • sha1sum
  • sha256sum
La sintaxis es mas sencilla. Aqui un ejemplo aplicable a todos los algorítmos:
$ md5sum ar1.txt
c89977bcf69702e21a82575b187459d4 ar1.txt
Y el resultado, como podeis apreciar, es muy similar ( y el hash idéntico, evidentemente ).

Espero que lo hayan entendido.

Saludos!

sábado, 20 de febrero de 2010

Cifrando ficheros mediante OpenSSL

Otra de seguridad informatica.

Si queremos cifrar datos con un sistema seguro en GNU/Linux, disponemos de la herramienta que viene con todas las instalaciones; OPENSSL. Vamos allà:

Definición
OpenSSL es un implementación criptografica muy pontente que implementa, entre otras cosas, Secure Sockets Layer (SSL) y Transport Layer Security (TLS v1). Estos dos protocols son lo que nos permiten navegar de manera segura y mantener nuetros datos de manera privada. Para ello, OpenSSL dispone los mejores algoritmos de encriptación simétrica y asimétrica.

Usos
Se puede usar para:
  • Creación de claves DSA y RSA
  • Creación de certificados x.509
  • Calcular "hash" de ficheros
  • Cifrado y descifrado de datos
  • Pruebas SSL/TLS tanto Cliente como Servidor
  • Sabe manejar signaturas S/MIME y correos cifrados con esta misma tecnología
Algoritmos de hash
  • md2, md5, mdc2, rmd160, sha, sha1, sha224, sha256, sha384, sha512
Algoritmos de cifrado
  • Base 64, Blowfish, CAST5, DES, Triple-DES, IDEA, RC2, RC4, RC5, AES
Ejemplos de cifrado simetrico
Bien, como pequeña practica os mostraré como cifrar un documento de manera segura.
El comando es:
$ openssl
Vamos a usar la opción "enc", que sirve para cifrar los datos que queramos. Para ver los algoritmos soportados podemos hacer un:
$ openssl enc --help
Elegimos uno de los algoritmos de cifrado (recomendado AES, Blowfish, o TripleDes), como por ejemplo -aes256. El comando nos quedará algo así:
$ openssl enc -aes256
Ahora tenemos que poner la acción que vamos a realizar. Podemos cifrar ("-c") o descifrar ("-d"). En nuestro caso queremos cifrar el fichero "ar1.txt", entonces esto nos quedará algo así:
$ openssl enc -aes256 -e
Per claro, no hemos especificado que archivo va a ser cifrado. Para ello utilizaremos "-in" y "-out". Queremos cifrar "ar1.txt" y nos va a quedar como "ar1.cy". Escribiremos lo siguiente:
$ openssl enc -aes256 -e -in ar1.txt -out ar1.cy
Ponemos el password que queramos recordando que debe tener una complejidad acorde con la seguridad que queramos dar a los datos. Bien. Ya tenemos nuestro fichero cifrado. Ahora para descifrarlo podemos usar el comando:
$ openssl enc -d -aes256 -d -in ar1.cy -out ar1_deciphered.txt
Y ya tenemos de nuevo nuestro fichero en cleartext!

Nota: como buena praxis, si queremos cifrar cualquier tipo de datos, es muy recomendado borrar de manera segura los datos en "cleartext" y no borrandolos de manera "normal".

Si quieres cifrar toda una carpeta es mucho mas practico comprimirla toda para luego cifrarla.

Saludos!

[Siguiente post: OpenSSH, hash / digest [II] ]

domingo, 14 de febrero de 2010

Borrado seguro de ficheros TrueCrypt con Python [II]

Jugando, he ido mejorando el cachito de codigo que había creado hace poco. De las 15 lineas y aparente inutilidad, ahora tenemos 10 vezes más líenas y es igual de inútil. Pero hace más cosas!! =)

Para ver mas o menos para que sirve el programa, revisar el el primer link, aún así hago un poquito de resumen: Tenemos ficheros TrueCrypt con datos cifrados. Si queremos borrar todos los datos del volúmen, no hace falta sobreescribir todo el volumen varias veces, solo necesitamos borrar los primeros 65.536 bytes de manera segura para dejar inútil el volumen. Os muestro un poquito como funciona el programilla, que por cierto lo he llamado tcrm (TrueCryptReMover). Original? no. Facil de recordar? si ;)

Para descargar programa, click aqui.

Primero tenemos que crear un fichero donde guardaremos las rutas de nuestros containers truecrypt. Cuando ejecutemos el programa tcrm, estos ficheros serán borrados. El fichero, llamado "lista.list" puede ser como el siguiente:
# Check
./tc_container
./tc_container2
./tc_con
./tc_con1
Vale, tenemos lo siguiente. La primera línea "# Check", sirve como control del programa para ver si está cifrado o los datos están en claro. Siempre se debe incluir en el fichero. La palabra en cuestión es facilmente configurable desde el programa tcrm.

Después hay un listado de volúmenes TrueCrypt. Les he puesto estos nombres, pero podrían ser cualquier otros. Aqui puede venir una ruta absoluta o relativa, como se desee. Estos ficheros serán machacados, si se ejecuta el programa. (si algún usuario "windows" me lee, aquí no hay un Control+Z... cuando digo que se borran, no bromeo :P)

Ahora ya tenemos creado nuestro ficherito que apunta a cada uno de los volúmenes que queremos borrar de manera segura. Vamos a ver el ejecutable:
$ ./tcrm --help
-h --help Imprime esta ayuda
-c --cipher Cifra el fichero pasado como parámetro
-d --decipher Descifra el fichero pasado como parámetro
-t --try Comprueba que los volúmenes especificados pueden borrarse
-k --kill Ejecuta el algoritmo de borrado

Pues básicamente tenemos 4 opciones:
  • --cipher: para cifrar el fichero "lista.list", de modo que no se vea la ruta donde nosotros guardamos cada uno de nuestros ficheros TrueCrypt
  • --decipher: para descifrar un fichero ya cifrado. Por si queremos añadir volúmenes adicionales o quitar volúmenes ya existentes en la lista.
  • --kill: abre la "lista.list" y por cada ruta de volúmen, le aplica un borrado Gutmann sobre los primeros 65.536 bytes. Los volúmenes serán imposibles de recuperar.
  • --try: hace un simulacro de borrado. Descifra el fichero "lista.list" y intenta leer cada uno de los volúmenes. Útil para comprobar tema de permisos, etc...
Un ejemplo: Imaginemos que tenemos el fichero "lista.list de antes.
$ ./tcrm --decipher lista.list
> Password: [ponemos nuestra password]

Así ya tenemos nuestra lista cifrada y nadie puede saber dónde guardamos nuestros volúmenes TrueCrypt. Ahora vamos a borrar:
$ ./tcrm --kill lista.list
> Password: [ponemos el password anterior]
> Procesando el fichero "./tc_container"...
> Procesando el fichero "./tc_container2"...
> Procesando el fichero "./tc_con"...
> Procesando el fichero "./tc_con1"...

Amén. Nadie volverá a acceder a los datos de los containers.

Seguridad? Si, dejadme que os cuente un poco.
Cuando introducimos nuestra clave, hacemos un hash SHA512. Diez mil vezes. Para que? Bueeeno, tiene una explicación. Esto no hace más seguro nuestro sistema, sinó que simplemente dificulta 10.000 veces, el posible ataque por fuerza bruta, que serviría para descifrar nuestro fichero y conocer la clave con la que lo hemos cifrado. Para poner un ejemplo fácil: si en un ataque de fuerza bruta se pudiese sacar el password en 10 segundos, con este "inventito" retrasaríamos el ataque hasta 27 horas, para conseguir lo mismo. Una ataque de una hora, ahora duraría un año y un par de meses. Hay que decir que para romer un solo hash de 512 bits se pueden necesitar varios miles de años.

Y después está el cifrado del fichero, que se hace con criptografía simétrica, utilizando el algorítmo AES con una clave de 256 bits (clave resultante de la función de hash mencionada). Para poner otro ejemplo AES256 es el nivel de seguridad que utilizan deteminados gobiernos para sus documentos clasificados y top-secret. Si es bueno para ellos, también lo será para nosotros ^^

Un fallo tremendamente grande, es que el programa está hecho en python, y en texto claro. Por esto es facilmente modificable. Pero bueno, así ya se que tengo que ir mejorando para la próxima entrega del algorítmo.

Nota: sería estupendo recibir críticas a saco: buenas o malas. Si me he dejado algo en la seguridad del programa, si la implementación no es buena, si las notas en inglés estan demasiado mal o cualquier cosa que os parezca que se tiene que cambiar/mejorar.

Saludos!

viernes, 12 de febrero de 2010

Respaldando datos con rsync

Hoy veremos el comando RSYNC. Que siempre viene bien tener a mano un programa que hace backups. Yo lo uso para hacer un backup de mi pendrive, así guardo todo lo que hago en clase cada día. También me sirve para tener mi carpeta de “documentación” actualizada siempre en el pendrive. Vamos al lio:

Descripción del comando:
Rsync se define a si mismo como rapida, versatil, remota ( y local ) herramienta de copiado de ficheros.

Instalación:
Mediante synaptic, claro:
$ sudo aptitude install rsync

Sintaxis:
rsync [opciones] origen destino

Parametros y configuraciones:
Bien, me voy a dejar opciones seguro. Si hacen un “man rsync” encontrarán unas 2800 paginas de ayuda. Yo les quiero comentar las opciones más interesantes y de manera resumidilla:

-a: Archiva. Es una buena configuración. Es sinonimo que especificar “-DGgloprt”
-b: Hace una copia de los ficheros, aún estando en el destino. Normalmente no es útil utilizar esta opción, a no ser que se quiera tener copia de cada una de las versiones del fichero.
-g: Preserva el grupo de los ficheros que van a ser replicados. Importante para los backups.
-H: Preserva los “hard-links”. Esta opción relentiza el copiado, pero es muy recomendable.
-l: Copia los “symlinks” como “symlinks”. Sin esta opción marcada, un link simbólico sería respaldado como un fichero.
-n: Dry run ( Ejecución Seca ): Lista los ficheros que van a ser transferidos, pero no hace el respaldo.
-o: Preserva el usuario posesor de los ficheros que van a ser replicados. Importante.
-p: Preserva los permisos de los ficheros. Importante.
-r: Activa la recursividad. Para incluir todos los subdirectorios de una carpeta.
--rsh='ssh': Utiliza SSH par la transmisión de datos. Es recomendable ya que sinó usa el protocolo inseguro rsh. Se usa cuando el servidor remoto tiene instalado SSH, evidentemente.
-t: Preserva las fechas de modificación de cada fichero.
-v: Hace una de los ficheros que son transferidos.
-vv: Igual que -v, pero además muestra los ficheros que no van a ser copiados.
-vvv: Igual que -vv, pero también imprime información de debug de rsync
-z: Activa la compresión. Importante si hacemos respaldos a través de Internet.


Y ahora veamos un ejemplo:
#!/bin/bash
if [ -d "/media/FLASHDRIVE/" ]
then
rsync -altgv /media/FLASHDRIVE/TEMPORAL/ /home/inedit/Documentos/Backup/
else
echo "Debe colocar el dispositivo USB"
fi

Comprobamos si existe el directorio “flashdriver”. O sea, miramos si tenemos conectado o no el pendrive. En caso de que así sea, realizamos el respaldo viendo los datos que están siendo copiados.

Dejandolo todo en su sitio:
Ejecutaremos el comando:
$ chmod +x ./respaldo
$ cp ./respaldo /usr/bin/respaldo

Donde “respaldo” es el nombre de nuestro comando. Lo copiamos en /usr/bin porque así, cada vez que queramos ejecutar el respaldo de datos bastará con escribir en una consola:
$ respaldo

Saludos!

martes, 9 de febrero de 2010

Second round con Debian

Pos hoy escribo con gusto de boca amargo. Cuando cargaba el sistema se me ha calado en la maquina virtual... bueno, reinicia y va bien. Pero a la segunda. Me sale el cartelido de ayer "Kernel Faliure"... quiere mandar los datos para reparar el error? "Si a todo siempre"... ale, por colaborar que no sea

Bien. Lo primero, instalar SSH. Algo que siempre debe estar ahí.
# sudo aptitude install openssh-server ( porque me acuerdo de memoria, de veces que lo he instalado )
Todo OK. Instalación rapida. Voy a instalar el Firefox, que no viene por defecto:
# sudo aptitude install firefox..... espero. no sale nada. no propone ningńu paquete...

pruebo:
# sudo aptitude install firefox
Paquete no encontrado. Mecachis!

Bueeeeno, esto es que no estoy escribiendo bien el nombre. Ves a Synaptic, que siempre ayuda. Le doy a buscar: "firefox".
Resultados... pos que no sale nada parecido al navegador Firefox... algunos complementos pero nos se ve el navegador. Me mosqueo. Voy a los repositorios y cambio la fuente. Refresh. Error en 4 sources. Mierda. Busco el firefox de nuevo. Ahora ya ningún resultado, ni los complementos. Nada. Intento volver a los repositorios anteriores perooo.... aaamigo, donde antes habían dos elementos en la lista, ahora solo hay uno. Fuck.

Bueeeeeno. A saber porque falla. Pero soy un tio de recursos. Paaaagina oficial de firefox. Descarga un .tar.gz descomprime y busca un fichero INSTALL que no está. Afortunadamente veo un "run.firefox", le doy y funciona. Estupendo! Ya tengo el Firefox andando. Claro que toodos sus ficheros y dependencias se encuentran en una carpeta del sistema y no en sus respectivas carpetas del sistema. Pero almenos navego con el navegador que me gusta. Bien.

Pruebo el flash de youtube. Ya me lo esperaba: no funciona. Noooproblemo. A instalar el flash. Lo busco en repositorios y debian casi se rie de mi. Normal. Voy a la pagina oficial. "DESCARGAR" y tengo que elegir entre:
> flash_ubuntu.deb
> flash.apt
> flash.tar.gz
Hombreeeee.... el primero es .DEB... y estoy usando Debian. Igual funciona..... mmmm.... EPIC FAIL. No tira. Bueeeno. Probamos el segundo link. No carga. Jodeeeeer. A por el .tar.gz. Lo descargo, lo descomprimo y que hay dentro? un fichero .SO! Como se come esto? Es la primera vez que veo uno. Me aburro. Vago un poco por el sistema. La estetica es austera. Me gusta.

Que sabía yo de DEBIAN. Que era dificil. Que no te da nada masticadito. Hasta hace poco tenías que montarte tu los USB que pusieras ( no he conectado ninguno todavía )... y que me he encontrado? Exactamente esto. Pero es estable, robusto y seguro....

Tenía dos candidatos: Debian, por ser el "padre" de Ubuntu, y porque suponía que me sentiría familiarizado con el SO. Y Fedora, porque es la versión light de Red Hat, y a mi me gustaría presentarme algún dia al examen del RHCE (Red Hat Certified Enginieer). Mañana le hecharé otro vistazo a Debian, haber quetal... seguiré haciendo algunas pruebas, que igual hoy he tenido mala suerte y no he ha ido bien la cosa... nosé.

Si alguien usa este SO a diario, me encantaría oir la opinión que tiene sobre Debian. =)

Saludos!

EDIT: OppenOffice 2.4?!!! OMG! Creo que ya es mas que evidente que tengo algún problema de configuración en los repositorios. Ahora ya estamos a la 3.1 y estan por sacar ( si no han sacado ya ) la vesión 3.2!! Mañana investigo al respecto, sin duda se trata de algo que hago muuy mal.

lunes, 8 de febrero de 2010

Primera impresión Debian

Primero vía linuxzone y después ampliado en ubuntizando el planeta he visto la opinión de Debian sobre Ubuntu. Me ha parecido todo muy correcto, como debería ser siempre. Reconociendo tanto lo bueno como lo malo.

Y me ha apetecido probar Debian. He probado hasta ahora Mandrake, SUSE y Fedora... virtualizados y durante cortos periodos de tiempo. Nada de instalarlo nativamente y usarlo como herramienta de trabajo habitual.

La instalación muy simple. Lo dejé descargando paquetes durante la noche e instalandose y hoy por la mañana me lo he encontrado todo heho. Virtualizado con VirtualBox, version 32 bits con 1GB de RAM, trabaja más rapido que el Ubuntu nativo.

Primera impresión buena. Solo un pequeño mensajito que se queja de "Kernel Faliure"... que parece algo gordo, pero la verdad que todo funciona bien :P. Y también me ha sorprendido que no venga con Firefox, pero esto es un tema de personalización de cada uno.

Como me va con este "nuevo" SO, y si me decido por cambiar... porque ya sabeis, dicen que en la variedad está el gusto.

P.D.: Sigo con mi ajetreo diario. Mañanas ocupadas, dos horitas al mediodia y tooda la tarde en clase. Hasta las 21:30 que llego a casa, cansado ya. Proyectos finales, examenes... seguiré publicando a medida que tenga cosas interesantes que contar.

Saludos!

sábado, 6 de febrero de 2010

Funky Bussines

[...] y en una tribu ( léase "colectivo" ), una persona saca energía del resto. Los zulúes lo llaman ubuntu (abreviatura de unmunta ngumuntu nagabuntu). Esto se puede traducir como "una persona es persona gracias a las otras personas". O, en palabras de Carl Jung: "Necesito el nosotros para ser plenamente yo". [...]
Del libro: Funky Bussiness Foreves, de Kjell A Nordström y Jonas Ridderstrale.

Dedicado a aquella gente que se dedica a distribuir sus conocimientos para que otros puedan consumirlos. Muchas gracias.