martes, octubre 27, 2015

oss-webmail: Un viejo documento donde se explica como montar un pequeño servicio de correo.

Aunque ya hace bastantes años que publiqué en Como montar un servidor con qmail + vpopmail + squirrel sobre Linux, el documento oss-webmail que describe como montar un sistema de correos usando software de fuentes abiertas sobre una Debian o sobre una RedHat 7.3 - imaginad si ha llovido -, he decido subir de nuevo todas las fuentes a un repositorio de github oss-webmail para que estén fácilmente disponibles para aquellos que quieran usarlas o les pueda ser útil.

Si tengo ganas y tiempo, lo mismo me animo a actualizarlo para una distribución más moderna de Linux. Aunque, por desgracia, hoy en día Internet es un territorio hostil para aquellos que quieran usar sus servidores propios de correos y no depender de los grandes

lunes, octubre 26, 2015

Tunelizar UDP con ssh y socat

Tunelizar UDP con ssh y socat

Hoy me he encontrado con un pequeño problema: Quería mandar un syslog (UDP) sobre Internet a una máquina EC2 con la cual estaba haciendo pruebas en Amazon. Es cierto que podía montar una VPN con OpenVPN o usar stunnel, pero la verdad, no me apetecía estar montando certificados y quería algo rápido. La solución por la que opté fue usar socat para encapsular el tráfico UDP sobre TCP, un reenvío TCP sobre ssh para mandar los datos a la instancia EC2 en Amazon encriptados sobre el canal ssh y de nuevo socat para desencapsular los datos del flujo TCP y lanzarlos sobre el puerto UDP local.

El escenario del que parto es el siguiente:

  • Tengo configurado el daemon de syslog para que mande todo lo que recibe al puerto 5000 de la máquina a través de UDP
  • Voy a redirigir el puerto de la máquina local 4000 al puerto 4000 de la máquina en EC2 a través de un túnel ssh
  • En la máquina local, todo lo que se reciba con protocolo UDP al puerto 5000 se encapsular sobre un flujo TCP y se redirigirá a través del puerto 4000 que es donde está escuchando la redirección de puertos local.
  • En el extremo EC2 todo lo que reciba por el puerto TCP 4000, se dirigirá al puerto UDP 514, que es el syslog daemon local.
  • A modo de ejemplo, asumo que la IP de la máquina de Amazon remota es 10.11.12.13

Para que funcione correctamente hay que dar los siguientes pasos y en orden:

  1. Establecer el tunel TCP con el reenvio de puertos en la máquina local
    $ ssh -L 4000:localhost:4000 -i clave_secreta.pem -l root 10.11.12.13
  2. Realizar con socat la redirección del puerto 4000 TCP al puerto 514 UDP en el servidor EC2
    $ socat -4 TCP-LISTEN:4000 UDP:localhost:514
  3. Por último, en nuestra máquina local, mandar los datagramas UDP que recibimos por el puerto 5000 a través del túnel
    $ socat -4 UDP-LISTEN:5000 TCP:localhost:4000

Decir que en este caso concreto, syslog, podría simplemente no usar UDP y aprovechar las conexiones TCP que también soporta dicho daemon para tunelizar vía ssh directamente los datos, pero trataba de poner un ejemplo de esa encapsulación UDP sobre TCP con socat y ssh.

Otra manera de hacer esta redirección, suponiendo que tengamos credenciales de root en las dos máquinas es esta que me apunta sntg_boff: Se aprovecha las posibilidades de ssh para establecer el túnel TUN/TAP y mandar los datos sobre ssh.

sábado, octubre 24, 2015

ElasticSearch: Notas de instalación

Instalación

ElasticSearch es un sistema de almacenamiento distribuido orientado a documentos JSON construido sobre Apache Lucene. Su punto fuerte es la facilidad que permite crear clusteres de varias máquinas rápidamente. Su especialidad es el análisis y búsqueda de datos introducidos en índices y la potencia de búsqueda que da la librería Lucene sobre la que está construido.

Instalar ElasticSearch es sencillo. La versión estable cuando escribo esta entrada, 1.7.3, necesite al menos Java 7, siendo recomendable el uso de Java 8. En ambos casos es necesario el JDK. Una vez que lo tenemos instalado el proceso de instalación es tan sencillo como bajarse el zip con ElasticSearch, descomprimirlo y activarlo.

$ wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.3.tar.gz
$ wget -O elasticsearch-1.7.3.tar.gz.sha1  \
  https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.3.tar.gz.sha1.txt
$ # Verificamos la hash
$ sha1sum elasticsearch-1.7.3.tar.gz.sha1
$ # El comando anterior debe devolver OK
$ tar zxvf elasticsearch-1.7.3.tar.gz
$ cd elasticsearch-1.7.3
$ bin/elasticsearch

ElasticSearch exporta su funcionalidad a través de una potente interfaz REST que permite realizar todas las operaciones que se necesite. Por defecto, dicha interfaz escucha en el puerto 9200 en cualquier interfaz IP de la máquina. En caso de que dicho puerto esté ocupado, ElasticSearch intentará localizar uno libre desde el mismo, intentando abrir un puerto de manera consecutiva desde el 9200. Se puede comprobar que está el sistema funcionando con ayuda del comando curl

$ curl -XGET http://localhost:9200
{
"status" : 200,
"name" : "Yandroth",
"cluster_name" : "darkelf",
"version" : {
"number" : "1.7.2",
"build_hash" : "e43676b1385b8125d647f593f7202acbd816e8ec",
"build_timestamp" : "2015-09-14T09:49:53Z",
"build_snapshot" : false,
"lucene_version" : "4.10.4"
},
"tagline" : "You Know, for Search"
}

Personalmente, cuando uso ElasticSearch prefiero seguir una estructura que me permita cambiar entre versiones de manera fácil. ElasticSearch, en su configuración por defecto está autocontenido. Puede ejecutarse desde una cuenta de usuario normal sin necesidad de privilegios espaciales. Esto me permite usar enlaces simbólicos para activar la versión que me conviene de ElasticSearch:

lrwxr-xr-x   1 terron  staff    19 21 sep 19:19 elasticsearch -> elasticsearch-1.7.2
drwxr-xr-x+  8 terron  staff   272 16 dic  2014 elasticsearch-1.4.2
drwxr-xr-x+ 19 terron  staff   646 19 oct 18:50 elasticsearch-1.7.2
drwxr-xr-x+  8 terron  staff   272 23 oct 15:26 elasticsearch-1.7.3

Uso siempre rutas que incluyan el enlace simbólico y cambiando el mismo, puedo seleccionar una versión u otra sin alterar otras partes de la aplicación que haga referencias a las mismas.

Configuración mínima

Aunque sea fácil arrancar por defecto ElasticSearch hay que tener en mente algunos problemas de configuración que pueden presentarse. Voy a suponer que existe una variable de entorno $HOME_ES que apunta al directorio raíz donde se ha descomprimido ElasticSearh. El fichero de configuración es $HOME_ES/config/elasticsearch.yml, que utiliza el formato yaml. Además existen una serie de variables de entorno que utiliza el script de arranque para configurar el proceso y el fichero $HOME_ES/bin/elasticsearch.in.sh donde también se pueden configurar diversos aspectos de la aplicación. Si se usa el script de arranque $HOME_ES/bin/elasticsearch

Como mínimo sería interesante establecer el nombre del cluster y el nombre del nodo en el fichero $HOME_ES/config/elasticsearch.yml. Por defecto, gracias al mecanismo de multicast que tiene ElastiSearch, todos los nodos que utilicen el mismo nombre de cluster tratarán de unirse al mismo, creando un entorno distribuido.

cluster.name: avos
node.name: "Nodo 1"

También es intersante establecer la variable de entorno que controla el heap de Java. La variable que controla dicha cantidad es ES_HEAP_SIZE y por defecto es un 1 giga. Ojo, que hay ciertas reglas a tener en cuenta al establecer la memoria máxima que puede usar ElasticSearch.

lunes, octubre 19, 2015

Descripción del kernel de Linux

Siempre me ha interesado la programación de sistemas operativos y su diseño interno. He leído algunos libros sobre el tema, tanto del mundo Unix (el magnífico The Design of the UNIX Operating System), mundo Windows (la serie Windows Internal o a nivel teórico el libro de sistemas de operativos de Andrew Tanenbaum.

La disponibilidad del código fuente de Linux o de cualquiera de los BSD siempre me ha permitido curiosear sobre las tripas de los sistemas. Mucho ha cambiado desde finales de los 90 el hardware y estos sistemas, pero de vez en cuando leo algo sobre los mismos en entradas de blogs o en proyectos interesantes como este: el funcionamiento e implementación del kernel de Linux, donde el autor está creando una referencia a la implementación de Linux, desde el cargador de arranque, la inicialización del núcleo, gestión de memoria, interrupciones,...

Linux puede ser muy duro para empezar, así que dejo en esta entrada la referencia a The little book about OS development, un libro que describe como crearse un pequeño sistema operativo desde cero para x86.

¿Ha roto la NSA el intercambio de claves Diffie-Hellman para algunos números primos?

Diffie - Hellman es un método de intercambio de claves criptográficas sobre un canal público de manera segura. Utiliza un número primo con unas determinadas propiedades y extremadamente grande que se usa para realizar una serie de operaciones matemáticas que permitan compartir una clave común sobre el canal público entre dos extremos. Este número es común a los dos extremos que inician un intercambio Diffie-Hellman. Hace falta mucha potencia de cálculo para romper sólo uno de estos números primos usados durante este tipo de intercambios.

Pero, ¿Qué ocurre, si por cualquier razón, la elección de estos números primos se reduce a unos pocos?. Es más, ¿Qué ocurre si muchos de ellos son valores predefinidos?. Pues que sólo hay que utilizar ese ataque una vez contra esos valores, y posteriormente, desencriptar fácilmente esa negociación Diffie-Hellman. Hay sospechas que la NSA está utilizando este sistema para desencriptar tráfico VPN: Ellos tienen el músculo financierio para poder montar las estructura de supercomputación que sea capaz de romper uno de estos números primos. Una vez roto, se puede usar para la multitud de tráfico que los utilizan. Actualmente, el problema más grave se da en los intercambios de clave del protocolo IPSEC, seguido por el protocolo ssh y https. Las cifras pueden verse en WeakDH.

Si alguien tiene más curiosidad sobre este tema, puede leer el Imperfect Forward Secrecy: How Diffie-Hellman Fails in Practice.

viernes, octubre 09, 2015

osquery (I)

Hace unos días que he empezado a mirar el software de inventariado osquery. Ha sido desarrollado por Facebook para obtener datos de instrumentación del equipo en el que está instalado a través de consultas similares a SQL. Es el equivalente en el mundo Linux a los sevicios WMI de Window y a WQL. Se trata de software libre cuyo código puede encontrarse en repositorio de Facebook de github. Puede compilarse desde el código fuente o bien bajar algunos de los paquetes que ya están compilados para diversos sistemas operativos.

Instalarlo en caso de OS X (Mavericks) es bajarse el paquete e instalar el correspondiente pkg a través del cuadro de diálogo que nos presenta. Una cosa que me gusta poco es que no hay posibilidad de comprobar una huella o una firma digital de lo que te bajas.

Una vez instalado puede ejecutarse la interfaz en línea de comandos, que recuerda mucho a la de sqlite. Con .help se puede obtener ayuda y con .schema se puede ver las diferentes tablas que se usan para representar las distintas entidades dentro del sistema. Por ejemplo, para obtener los procesos que están corriendo en el sistema. Se pu

osquery> select * from processes;

Pero lo interesante es la potencia que da hacer este tipo de queries a través de un lenguaje similar a sql. Por ejemplo si se quiere obtener el pid, el nombre y el path cuyo nombre sea bash:

osquery> select * from processes where name='bash';

Si se quiere ver los campos que tiene cualquiera de las tablas que representan los conceptos del sistema operativo se puede hacer con .schema tabla. Por ejemplo, las últimas versiones de OS X tienen un mecanismo de protección de aplicaciones llamado sandboxes. Para ver los campos de dicha tabla:

osquery> .schema sandboxes
CREATE TABLE sandboxes(label TEXT, user TEXT, enabled INTEGER, build_id TEXT, bundle_path TEXT, path TEXT);

Cuando se ejecuta osquery de esta manera, sólo se tendrá acceso a aquella información a la que está autorizado a acceder el usuario que lo está ejecutando

En la web del proyecto se puede consultar todas las tablas, tanto las generales como aquellas que son específicas de cada sistema a las cuales se pueden hacer consultas. Como se ve de esta breve introducción es una herramienta muy potente para instrumentalizar sistemas y así poder recoger información sobre los mismos y consolidarla en sistemas de gestión.