Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.

Piano daemon

Archive for Ubuntu

Formas mas usuales de encriptacion sobre sistemas GNU/linux

Aqui les hablare de las 3 mas comunes formas de encriptacion de datos, que actualmente conosco.

  •    Funciones Hash
  •    Cifradores simetricos
  •    Cifradores asimetricos

Funciones Hash
Las funciones hash son faciles de computar pero dificil de aplicarles ingenieria en reversa.
Aque me refiero con esto?, lo explicare con un ejemplo sencillito sobre sistemas linux:

$ echo "Esto se encriptara mediante una funcion hash" | md5sum
f538fb4f2360fcbb3af0f31cdd479829
$ echo "Esto se encripta mediante una funcion hash" | md5sum
fa5f1a88d876d3974a501b3a9c140e2a

Observemos que la cadena introducida via pipe a el comando md5sum nos ha generado un valor hexadecimal, este valor dificilmente podria llegar a ser igual a otro, que quiero decir con esto? Que no hay dos cadenas que computen el mismo valor. Matematicamente podrias llegar a la siguiente deduccion:

f(x) = valor_resultante_para_x_unico

o bien

md5sum("cadena_a_encriptar") = valor_resultante_para_cadena_a_encriptar_unico

hash_funccion

Uso comun
Un uso muy comun de esto, lo puedes ver cuando te has bajado una distribucion linux. En los servidores ftp donde se pone a disposicion la descarga de las imagenes de los DVDs que componen a una distribucion linux, tambien se te ofrecen los valores hash md5 que corresponden a cada imagen, una vez que has descargado una de las imagenes… Habras de comparar que estas imagenes te den el valor md5 indicado por los fabricantes de dicha distribucion linux.

$ md5sum redhat5.1.iso
fa5f1a88d876d3974a501b3a9c140a2d

Si el valor fa5f1a88d876d3974a501b3a9c140a2d es el que indica el fabricante de la distribucion linux, entonces la imagen que hemos de quemar en un dvd virguen, es la correcta… pero si el valor no es el indicado por el fabricante… lo mas probable sera, que te estes bajando un fichero imagen corrupto, o en el peor de los casos… una copia alterada por alguien que ha vulnerado el servidor ftp.. y te ha colocado un backdoor sobre la distribucion que aun no te has instalado.

Cifrados Simetricos

Un Cifrado Simetrico es una transformacion, que fue llevada a cabo por un llave secreta, Esta llave traduce su entrada conocida como texto plano, a un salida conocida como texto cifrado, de esta manera excluimos el criptoanalisis(accion contraria a la criptografia..) , solo aquella entidades que posean la llave secreta podran recobrar el texto plano que esta oculto sobre el texto cifrado.

Cifrado Simetrico

Los Cifrados Simetricos tienen una larga historia, y han mutado en variantes de los mismos bastante interesantes.. una de estas variantes es el triple-DES… muy usado por routers de prestigio hoy en dia.

Cifradores Asimetricos

Un cifrador asimetrico es semejante a un cifrador simetrico, pero el asimetrico ejerce su poder en el uso de un par de llaves.. y no solo una llave como lo hace el simetrico.

El par de llaves a las cuales hago referencia son las siguientes:

  •    Llaves Publicas -- Usadas para encriptar el texto plano
  •    Llaves Privadas -- Usadas para desencriptar el texto cifrado

Las llaves son generadas de una manera sencilla, lo cual permite deducir cual es la llave privada y cual es la publica. Aplicarle ingenieria en reversa a estas llaves, es algo sumamente dificil.
Esta fabulosa propiedad permite a la gente el intercambiar sus llaves publicas sobre canales o comunidades y mantener conductos de comunicacion completamente privados.

Los mas notables sistemas de cifrado asimetrico inclullen funciones Diffie-Hellman y RSA (como openssl). Los sistemas de encriptacion asimetrica son usados comunmente para intercambiar llaves de sistemas simetricos.

Los que usamos Mysql ya no somos tan hippies…. ?

Ahora resulta que soy experto en la base de datos open source de sun.. ?



Jamas pense que algo asi pudiece pasar con mysql….. a lo mejor tu si lo pensaste(con un porrito en mano..)….

Usando SWIG para interfacear lenguajes script con C/C++

Introduccion
Lenguajes script como Perl, Python, Php, Ruby y Tcl estan recibiendo bastante atencion hoy en dia - principalmente porque estos lenguajes facilitan el desarrollo de aplicaciones y prototipos de las mismas de un modo impresionantemente acelerado. Puedo decir como experiencia que al momento de usar python, el tiempo de desarrollo ha sido drasticamente bajo - con la ventaja agregada de la robustes y flexibilidad del codigo. Pero habra situaciones en las que el scripting puro no trabajara como lo deseamos, un ejemplo tipico de esto son las aplicaciones cientificas que requieren una alta velocidad de calculo para rutinas graficas o aplicaciones que requieren controlar o coordinar hardware en base a tiempo real. Entonces he llegado a la conclucion paradigmatica de que lo que necesito es un lenguaje mezclado, en el cual lenguajes tradicionales como C/C++ realicen lo duro del bajo nivel , mientras la logica de la app la pueda realizar en modo Scripting.

Este articulo se enfoca principalmente en el uso de una herramienta que se enfoca a la creacion de Wrappers, con la intencion de integrar el codigo escrito en C/C++ con el popular lenguaje scripting Python. Los fragmentos de codigo en este articulo fueron probados sobre un ubuntu gutsy y una version de Python 2.5.1. Espero que todo eso te sean tan util como a mi.

Obtener SWIG
SWIG es desarrollado por Dave Beazley y puede ser descargado de www.swig.org. o bien puedes instalaro mediante la herramienta apt-get de tu debian… ojo tambien requieres g++ y python2.5-dev.

apt-get install swig  g++

Un ejemplo simple

Diremos que tenemos una funcion llamada suma(a,b) escrita en codigo C la cual nos retornara la suma de dos numeros que le sean pasados como argumentos. Veremos como usar la funcion “suma” desde Python. Crearemos el archivo de nombre aritmetica.c el cual contendra el siguiente codigo:

int suma(int a, int b)
{
		return a+b;
}

Ahora ejecutaremos el siguiente comando:


swig -python -module aritmetica aritmetica.c

Esto nos retornara lo siguiente:

root@pianodaemon-laptop:/home/pianodaemon$ ls -l
total 100
-rw-r--r-- 1 pianodaemon pianodaemon    41 2008-01-15 15:48 aritmetica.c
-rw-r--r-- 1 pianodaemon pianodaemon  1605 2008-01-15 15:48 aritmetica.py
-rw-r--r-- 1 pianodaemon pianodaemon 92723 2008-01-15 15:48 aritmetica_wrap.c

Observemos que fueron creado 2 nuevos archivos, aritmetica_wrap.c y aritmetica.py. Nosotros deberiamos ahora de compilar ambos aritmetica.c y aritmetica_wrap.c para producir archivos de codigo objeto, la compilacion sera con el siguiente comando:


root@pianodaemon-laptop:/home/pianodaemon$ gcc -I/usr/include/python2.5/ -c aritmetica.c aritmetica_wrap.c 

Observe que ya logramos compilar el codigo objeto con exito.

pianodaemon@pianodaemon-laptop:~/gulsinborrame$ ls -l
total 136
-rw-r--r-- 1 pianodaemon pianodaemon    41 2008-01-15 15:48 aritmetica.c
-rw-r--r-- 1 pianodaemon pianodaemon   707 2008-01-15 16:15 aritmetica.o
-rw-r--r-- 1 pianodaemon pianodaemon  1605 2008-01-15 16:11 aritmetica.py
-rw-r--r-- 1 pianodaemon pianodaemon 92723 2008-01-15 16:11 aritmetica_wrap.c
-rw-r--r-- 1 pianodaemon pianodaemon 28884 2008-01-15 16:15 aritmetica_wrap.o

Ahora procedemos a generar un libreria compartida, para eso utilizaremos el enlazador de linux ld:

ld -shared -o aritmetica.so aritmetica.o aritmetica_wrap.o

Finalmente probaremos la libreria que hemos generado:

import aritmetica
>>>aritmetica.suma(10, 20)
30
>>>aritmetica.suma(10, -10)
0
>>>

Usando lsof

lsof (ls Open Files) o listado de archivos abiertos, es una gran aplicación pero bastante desconocida y que nos puede sacar de muchas dudas o apuros. lsof es una herramienta muy completa, por lo que en éste articulo solo se muestra la información que más vamos a necesitar.

NOTA: Si se quiere saber más sobre el uso de lsof ejecutad “man lsof “.

Utilidad de lsof.

Como he dicho antes, lsof muestra los archivos y procesos abiertos en el moment o del chequeo, por lo que nos será de utilidad para llevar un seguimiento de seguridad o de procesos bloqueados.

Desmontando un CD rebelde.

# umount /cdrom
umount: /cdrom: device is busy

Vaya, ¡¿por qué no se desmonta y me dice que el dispositivo está ocupado?! No se ha desmontado porque algun proceso esta haciendo uso del CDROM y hasta que no lo libere no podremos desmontarlo, el problema es que desconocemos que aplicacion se encuentra usando dicho CDROM, mediante lsof podremos conocerlo.

# lsof +D /cdrom
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
konqueror 621 zx80 cwd DIR 3,64 2048 57344 /cdrom

lsof nos dice que el proceso konqueror está usando el directorio /cdrom con el usuario zx80. La solución es sencilla entoces, basta con cerrar konqueror y problema resuelto. Para los que usamos mucho la consola y llegamos a tener unas cuantas sesiones abiertas pasa que en vez de konqueror puede salir bash. Esto es debido a que alguna de las consolas está dentro del directorio activo del cd-rom, por lo que bastaría salirse del directorio de trabajo del CD o cerrar ese bash.

# kill 621

Ya podemos desmontar.

Quien está detrás de una conexión ?

Esta vez usamos la herramienta netstat. Para quien no conozca esta herramienta decir que es un monitor de red. Nos dirá qué conexiones activas tenemos y mucha inform ación sobre ellas. Vamos a ver qué conexiones tenemos activas:

# netstat - n
Active Internet connections (only servers)
Proto Recv- Q Send - Q Local          Address       Foreign Address
tcp      0    0 *:printer                          *:*            LISTEN
tcp      0    0 localhost:www                 *:*            LISTEN
tcp      0    0 *:6000                            *:*             LISTEN
tcp      0    0 *:smtp                           *:*             LISTEN

Nos muestra información sobre algunos puertos en espera (Listen) pero desconocemos qué aplicación está detrás. Me llama la atención el puerto TCP 6000, así que voy a ver quien está detrás:

# lsoft - i :6000
COMMAND           PID USER    FD     TYPE     DEVICE        SIZE   NODE NAME
    X                 279 root    3u     Ipv4     349                  TCP     *:3000 (LISTEN)

Vemos que la aplicacion X es la culpable de que el puerto 6000 esté abierto y a la espera.

Qué procesos están usando un directorio.

Una de las utilidades que más se usan es averiguar qué aplicaciones están trabajando en un directorio concreto. Se usa esta opción sobre todo para vigilar el uso de troyanos o espias. SI quisiera saber qué procesos están usando mi directorio pondría lo siguiente:

pianodaemon@pianodaemon-laptop:~$ lsof +D /home/pianodaemon/
COMMAND    PID        USER   FD   TYPE DEVICE    SIZE    NODE NAME
x-session 5962 pianodaemon  cwd    DIR    8,1    4096 6684674 /home/pianodaemon/
compiz    6013 pianodaemon  cwd    DIR    8,1    4096 6684674 /home/pianodaemon/
gnome-pan 6015 pianodaemon  cwd    DIR    8,1    4096 6684674 /home/pianodaemon/
nautilus  6017 pianodaemon  cwd    DIR    8,1    4096 6684674 /home/pianodaemon/
emerald   6127 pianodaemon  cwd    DIR    8,1    4096 6684674 /home/pianodaemon/
compiz.re 6128 pianodaemon  cwd    DIR    8,1    4096 6684674 /home/pianodaemon/
................ ...

Otros usos.

Estos son otros usos de la herramienta lsof, que aunque son algo menos usados nos pueden sacar de algun apuro o duda.
# lsof - g n: Donde n es un ID de grupo.

Esto muestra los archivos abiertos por un grupo que queramos. Si quisieramos ver los archivos de varios grupos a la vez, los separariamos por comas:

# lsof - g wheel,users

# lsof - u n: Donde n es un ID de usuario, lo que nos mostrará los archivos abiertos por ese usuario. Al igual que con los grupos, se pueden especificar varios usuarios de una vez.

# lsof - l: Para no convertir el ID a nombre de usuario, útil en casos de logeos corruptos o sistemas lentos.

# lsof - N: Nos muestra los archivos NFS abiertos.

Instalar un servidor de CVS en Ubuntu

Entre mis nuevas tareas tengo la de administrar un servidor CVS, hacia años que no lo administraba, asi que he vuelto a recordar unas pequeñas nociones de control de versiones. Aqui hablare de como instalar CVS en Ubuntu Gutsy. Es un articulo meramente tecnico, enfocado a desarrolladores.

El significado de CVS como comenta la wikipedia, es el siguiente:
El Concurrent Versions System (CVS), también conocido como Concurrent Version System o Concurrent Versioning System, es una aplicación informática que implementa un sistema de control de versiones: mantiene el registro de todo el trabajo y los cambios en los archivos (código fuente principalmente) que forman un proyecto (de programa) y permite que distintos desarrolladores (potencialmente situados a gran distancia) colaboren. CVS se ha hecho popular en el mundo del software libre. Sus desarrolladores difunden el sistema bajo la licencia GPL.

Basicamente se utiliza en el desarrollo de un proyecto informatico para llevar un control de los archivos del codigo y evitar por ejemplo que el codigo que escribe un usuario sea “machacado” con el codigo de otro usuario. Ademas con un sistema de control de versiones, el programador siempre puede disponer de la ultima version del codigo lo que ayuda a continuar con el desarrollo del proyecto.

Te pondre un ejemplo de para que sirve todo esto.

Imagina dos programadores que estan trabajando en el mismo proyecto, y casualmente ambos estan modificando el mismo archivo de codigo. Cuando uno de ellos actualice ese archivo en el repositorio se queda marcado, de tal manera que cuando el otro intente subir al repositorio de codigo ya ve, que ese archivo ha sufrido una modificacion desde la ultima vez que el se actualizo, lo que le obliga, a traerse de nuevo ese archivo (con los cambios que haya realizado el primer programador), añadir los suyos y volver a subir el archivo. Sin un mecanismo de control de versiones, ese cambio se perderia, el primer desarrollador subiria el archivo y el segundo subiria su version. Esto para un archivo es controlable, pero cuando tienes miles de archivos y miles de lineas de codigo significa un desastre total. Por eso el control de versiones es necesario.

Para instalar el servidor y el cliente cvs ejecutamos:

$ sudo apt-get install cvs cvsd

En un momento determinado nos pedira la ruta para el repositorio, pon por ejemplo /cvsrepo. Este es el directorio a partir del cual se ira colgando todos aquellos modulos/proyectos que administremos con el CVS.
Este directorio lo vamos a definir a partir de /var/lib/cvsd, asi que realmente el path completo seria:
/var/lib/cvsd/cvsrepo

Ejecutamos las siguientes secuencias de comandos:

$ sudo cvsd-buildroot /var/lib/cvsd

Si la carpeta cvsrepo no existe, la creamos

$ cd /var/lib/cvsd
$ sudo mkdir cvsrepo

Le damos permisos sobre la carpeta al usuario cvsd

$ sudo chown -R cvsd:cvsd cvsrepo

Inicializamos el repositorio

$ sudo cvs -d /var/lib/cvsd/cvsrepo init

creamos un usuario cvs y le damos una password.

$ sudo cvsd-passwd /var/lib/cvsd/cvsrepo username 

por ejemplo:

sudo cvsd-passwd /var/lib/cvsd/cvsrepo j4nusx

Ahora editamos el archivo:

sudo emacs /var/lib/cvsd/cvsrepo/CVSROOT/config

Cambiamos “#SystemAuto=no” a “SystemAuto=no”

Ya tenemos todo funcionando. Para comprobar que accedemos:

cvs -d :pserver:username@localhost:/cvsrepo login
cvs -d :pserver:username@localhost:/cvsrepo checkout .

Por ejemplo:

cvs -d :pserver:j4nusx@localhost:/cvsrepo login

Seria adecuado exportar la variable CVSROOT del siguiente modo:

export CVSROOT=:pserver:jose@localhost:/cvsrepo

o el valor que fuera, de esta manera ya no necesitariamos especificarla cada vez que fueramos a usar un comando “cvs”.

Ahora podriamos logarnos con:

cvs login

y por ejemplo colocarnos en la carpeta (dentro) de un proyecto que quisieramos subir al CVS y ejecutar:

cvs import -m "archivos iniciales" MiProyecto HEAD MAIN

Si te sale el error:

/cvsroot: no such repository

es que has especificado mal la ruta del repositorio. deberia ser /cvsrepo o la que pongas, pero asegurate de que no te haya fallado
alguna letra. En caso de que lo hayas definido mal, No lo elimines con apt-get remove cvsd. Pues a la hora de volver a instalarlo
mantendria la configuracion anterior. tendrias que ejecutar:

apt-get remove --purge cvsd

e instalarlo de nuevo
o mejor aun,

dpkg-reconfigure cvsd

que nos permite reconfigurar de nuevo cvs server (cvsd) e indicar ahora si la ruta adecuada para el repositorio (/cvsrepo, /cvsroot, /repo, o el que quieras usar).

Como clientes de CVS yo o utilizo “cvs” desde la linea de comandos, o Eclipse.

Visualizando conexiones, rutas y puertos abiertos en Ubuntu

Hace unos dias (los pocos dias que llevo en telefonica mexico, aqui en el DF), un nuevo conocido y reciente usuario de linux, me hizo la siguiente pregunta…
Como puedo visualizar mis rutas, conecciones y puertos abiertos tcp/ip ?

Esto no es nada absolutamene del otro mundo, y muchos de ustedes creo que ya lo saben, aun asi, considero que es bueno contestar a este tipo de preguntas que son mas cotidianas de lo que uno piensa entre los usuarios newbies.

Le comente que le escribiria la respuesta en el blog de gulsin.. (creo que de esta manera… todos aquellos que se realizacen la misma pregunta en google sin duda obtendran el mismo beneficio que el..)

La orden netstat.
Esta orden se utiliza para visualizar el estado de diversas estructuras de datos del sistema de red, desde las tablas de enrutado hasta el estado de todas las conexiones del host donde se ejecuta.

Conexiones y puertos abiertos….

root@pianodaemon-laptop:/home/pianodaemon# netstat -at
Conexiones activas de Internet (servidores y establecidos)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost:ipp           *:*                     ESCUCHAR
tcp        0      0 pianodaemon-lapto:38621 fg-in-f191.google.c:www ESTABLECIDO
tcp        0      0 pianodaemon-lapto:34637 bu-in-f189.google.c:www ESTABLECIDO
tcp        0      0 pianodaemon-lapto:38622 fg-in-f191.google.c:www ESTABLECIDO
tcp        0      0 pianodaemon-lapto:38821 bu-in-f83.google.co:www ESTABLECIDO
tcp6       0      0 *:8009                  *:*                     ESCUCHAR
tcp6       0      0 *:8180                  *:*                     ESCUCHAR


Visualizando Rutas

root@pianodaemon-laptop:/home/pianodaemon# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.225.181.128  0.0.0.0         255.255.255.128 U         0 0          0 eth0
172.16.142.0    0.0.0.0         255.255.255.0   U         0 0          0 vmnet1
192.168.10.0    0.0.0.0         255.255.255.0   U         0 0          0 vmnet8
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         10.225.181.131  0.0.0.0         UG        0 0          0 eth0

Eso es todo, pasenla chido……….

Ubuntu 7.10 Beta(Gustsy) esta al aire

ubuntuLa beta de la nueva version de Ubuntu ya esta disponible, aca en Tolero´s tech notes pueden encontrar una reseña de la nueva version, desde applets y compiz fusion hasta las basicas del kernel.