¿Porqué el ciberataque no me importa?

Como diría Pablo Iglesias en el congreso refiriéndose a Rajoy, el «ciberataque» de estos días no me importa lo más mínimo, me trae sin cuidado o, al final, me la bufa.

¿Porqué me la bufa?

Primero, porque ese «ataque» no me afecta en lo más mínimo. Se basa en un factor de infección exclusivo de windows, utilizando una vulnerabilidad conocida hace pocos meses (excepto para la CIA) y que, por tanto, no afecta a los ordenadores Linux con los que trabajo. Así, ante la alarma causada por todos los medios de comunicación y el principio del apocalipsis cibernético augurado, yo me senté tranquilamente a ver el espectáculo.

Segundo, porque hago backups regularmente de TODO ya que no te puedes fiar de nada en esta vida y de un disco duro menos. Aunque algún muñón de colaborador le diese por venir infectado de casa con un windows y se conectase a mi red los daños que podría causar serían mínimos.

Tercero, porque no es nada nuevo, ni nada que no hayamos vivido antes. Todavía recuerdo los famosos ataques por messenger, donde toda la oficina en la que trabajaba empezó a ver como sus ordenadores empezaban a mandar infecciones a sus contactos mientras les impedía seguir trabajando. O aquella vez que cada vez que instalaba windows a mi hermana y lo conectaba a internet no pasaban ni dos minutos hasta que el virus se instalaba de nuevo y me reiniciaba el ordenador (el famoso sasser).

Y, por último, porque ahora que guardo casi todo en la nube y mis passwords están seguras en mi móvil con nomorepass, nada de esto me ha quitado ni un solo minuto de mi tiempo. ¿No hay posibilidades de infecciones en Linux? Si, claro que si, pero si un sistema operativo se ha hecho para gente sin conocimiento (como windows), lo más normal es que gente sin conocimiento lo use (y caiga más fácilmente en trampas) y eso arrastre a muchos otros que tienen que cargar con las deficiencias de un sistema que solo puede parchear un equipo determinado en un país determinado. Los usuarios de Linux suelen estar más informados y las soluciones pueden llegar de cualquier parte del mundo en cualquier momento.

Creando extensiones para los navegadores

Como ya os he comentado, desarrollando mi nuevo proyecto NoMorePass, uno de los elementos fundamentales para que se usase la app era disponer de un plugin para el navegador que permitiese interceptar las páginas con usuario/password y entrar en las mismas con el protocolo seguro de NoMorePass. Aunque en principio solo quería hacer uno para demostrar lo que se podía hacer (el de chrome, por obvias razones), al final terminé desarrollando cinco para cubrir la mayoría de las necesidades. No voy a entrar en detalles ahora sobre la tecnología subyacente, lo que voy a hacer es contaros las principales diferencias entre cada uno de los ecosistemas para los que hice las extensiones y los problemas que nos vamos a encontrar.

Todas las extensiones que he programado han funcionado (que no es poco) y todas están en javascript, así que esa parte me la voy a saltar y voy a contaros los problemas que me encontré en orden cronológico.

Chrome

Aunque, a priori, creí que iba a ser el más complicado, porque partía de una base muy pobre en lo que a extensiones se refiere, al final no fue para tanto. La documentación que dispone en la web de developers de chrome es muy completa y con ejemplos que sirven para casi todo.

Probar la extensión es sencillo, solo hay que activar el modo desarrollador en la pestaña de extensiones y cargar el directorio en el que estamos trabajando… La depuración y lo demás es muy sencillo si estamos acostumbrados a inspeccionar o depurar páginas web.

La parte más «complicada» es cuando quieres distribuir la extensión. Hay una opción que te permite empaquetarla en un archivo .crx, peeeeeero, eso no sirve para nada ya que al abrir el crx con chrome te dice que no va a instalarte nada… Así que tienes que decirles a tus probadores que se descompriman el archivo y activen la parte de desarrollador (que es un rollo de explicar) o bien pasarlo al chrome web store… Es lo que hice y puedes dejar la extensión sin publicar para que lo usen tus probadores. Muy fácil y rápido. Eso si, te pueden banear la extensión (a mi me pasó) si la revisan y ven algo sospechoso. Lo bueno es que puedes explicar lo que pasa y como funciona y si todo está ok son muy rápidos en volverte a activar la extensión. Muy contento con esta parte.

Firefox

El segundo en preferencia es, como no, Firefox. Había oído que los .xpi ya estabán obsoletos y que ahora había que hacer extensiones más parecidas a las de chrome… Y tanto! El estandar webextension está bien documentado en la MDN y, el problema, es que no es un estándar maduro del todo. Está muy basado en las extensiones chrome a las que «copian» casi todo, por lo que es muy sencillo pasar de una a otra, pero con carencias importantes (que en mi caso me hicieron reescribir gran parte de la extensión). Lo prometedor del tema es que están avanzando y según los navegadores vayan incorporando las funcionalidades que faltan vamos a un escenario de muy, muy facil adaptación.

Mozilla te ofrece la función en el AMO (addons.mozilla.org) de subir tu extensión y que te la firmen para que la puedas dstribuir entre tus probadores sin que se queje mucho el navegador. Obviamente también puedes subirla a la página pública, pero ahí el tema varía mucho…. Subí una primera versión no del todo pulida y a los dos días me rechazaron la extensión y me dieron consejos para resubirla. Lo hice a los 30 minutos de recibir la respuesta pero, según lo que dicen, me metieron en la cola de revisión de los administradores y esa cola es EXAGERADAMENTE lenta. Hoy llevo ya 32 días esperando en esa cola y estoy todavía en el número 126:

A este paso a finales de mes igual tengo ya la extensión en la página de addons de Mozilla… Completamente desesperante.

Safari

A petición de mis amigos mac-queros estudié la posibilidad de realizar una extensión para Safari. Dejadme que os diga una cosa, es un puto infierno. Apple ha cambiado la forma de construir una extensión para que tengas que escribir parte del código en Xcode (Objective-c o swift) y otra parte en javascript y que tengas que utilizar un sistema infame de empaquetado para subirlo al itunes y que aparezca disponible. El caso es que lo hice, siguiendo todas sus intrucciones, y después de conseguir que funcionase en mi mac me encontré con la maraña de certificados, firmas, perfiles, etc. que me obligaron a cambiar el proyecto un poco… Con tan mala suerte que una vez subido a itunes resulta que no funcionaba ¡¡!!

Así que, recuperé la forma antigua de hacer las extensiones, puramente en javascript y con un esquema muy parecido a las de chrome y las webextensions y un empaquetado mucho más sencillo… Y generé un archivo que Safari puede instalar sin problemas y que puedo distribuir sin problemas… Una pena que Apple se empeñe con todo su alma en hacer las cosas difíciles a los desarrolladores.

Opera

Ya con todos los deberes hechos me pareció interesante ver el nivel de compatibilidad de las webextensions entre navegadores… Y decidí hacer la extensión para Opera. Mi sorpresa fue mayúscula cuando vi que la misma extensión de chrome funcionaba sin apenas cambios en opera (quité un par de cosas del manifest.json y poco más). Así que, ole por Opera! El proceso de publicación, no obstante, sigue siendo bajo revisión y tienes que subirlo (con mucha más info de la que deseaba) en https://addons.opera.com/developer/ y ahí sigue esperando revisión… El problema es que no se en qué puesto de la cola estoy ni cuanto tiempo va a tardar en llegar a estar disponible.

Edge

Y llegamos a la gran esperanza «windowsera», visto que, según la documentación, edge permitía un esquema muy parecido a las webextensions de firefox me lancé al ruedo y, con una máquina virtual de windows10 profesional, empecé a adaptar la extensión de firefox.

La definición correcta para las extensiones de Edge es: ¡niseteocurraporDios! Después de un montón de horas lidiando con actualizaciones del sistema, con cuelgues, con malos funcionamientos del sistema de depuración y con mi bisoñez en el sistema conseguí que la extensión funcionase en desarrollo en mi máquina… Bueno, ahora distribuirlo…

Pues no es tan sencillo, ni mucho menos, después de gastarme 90 euros (75+iva) en darme de alta como desarrollador de microsoft para reservarme el nombre de la aplicación y poder subirla a la tienda de windows.. Resulta que la tienda no admite extensiones. ¡¡¡¡¡!!!!! y, lo que es peor, para distribuir el appx que consigo generar tengo que firmarlo con unos certificados que no tengo y que solo se pueden generar con extraños comandos que no te explican de donde salen (si al menos te dijeran como hacerlo con openssl) y luego el usuario tiene que instalarse el certificado en su máquina antes de instalar la extensión.. En suma, no se cómo distribuir esta extensión ni si merece la pena….

Según microsoft esto es lo que pasa:

Así que hay que pedir por favor, por favor, que te tengan en cuenta en esta url: http://aka.ms/extension-request

Y esperando estoy…

 

 

NoMorePass

¿Alguna vez habéis sentido como que se os olvidaba algo importante? ¿y si ese algo era un password de los que podías necesitar en cualquier momento? ¿y si el proceso para recuperar el password perdido fuese tan tedioso y largo que le quitasen las ganas a cualquiera? ¿y si habéis perdido, lo que es peor, el password de la cuenta de correo con la que teníais ligada esa password rebelde?

Todos esos problemas, y más me acuciaban día si y día también. Para asegurar tendía a poner el mismo password (o variaciones triviales) en todos los servicios en los que me registraba que eran, por cierto, incontables… Que si foros, que si demos, que si nuevos servicios, que si sitios oficiales, que si… Total, que al final solo confiaba en mi navegador para que me guardase los passwords, peeeeero, ¿y si alguien me pedía un rato el ordenador para cualquier cosa? ¿tendría acceso a mis passwords? Claro que si, por eso es tan seguro dejar el password en el navegador como en pos-it pegado en la pantalla… Un desastre, vamos.

Hablando, además, con un sobrino mío que también utilizaba el método de tener una libreta con todos los passwords (pues anda que no pierdo yo libretas, o que no son propensas a ser hojeadas por cualquier visitante inesperado), llegué a la conclusión de que debía hacer algo… Y lo he hecho, se llama nomorepass y te permite guardar de manera segura todas tus contraseñas en tu móvil, protegidas por una contraseña maestra y/o los sistemas biométricos (huella) del dispositivo y, lo que es mejor, te permite olvidarte de ellos sin problema, ¿cómo? Muy sencillo, nunca más tendrás que teclear un password, así que nunca te inportará qué password es y, por eso, podrás generar un password distinto para ca web o servicio, que ya se encarga el móvil de guardarlo y enviarlo a quien lo necesite.

¿Es seguro? 

Un montón, es imposible interceptar los datos necesarios para recomponer la password que estás usando.

Además, podrás sacar una copia de seguridad de tus passwords con la seguridad de que solo tu desde tu aplicación podrás volver a recuperarla, ya sea en tu teléfono o en otro nuevo (ya sabes, suele caer en sitios muy húmedos)

¿Es sencillo?

Apuntar con el movil a la pantalla y listo… No hay nada más facilito. Además, tendrás siempre contigo tus passwords, sin importar en qué ordenador estés.

Pero entonces, ¿me tengo que fiar de tus servidores?

No, te recomiendo que no te fies de nadie, ni siquiera de mi. Tus passwords nunca salen de tu móvil (al menos nunca en claro) y no se pueden almacenar en otro sitio y nunca está la clave de encriptación junto a los datos encriptados (ni siquiera en los backups)… Así que, no, no te fíes. Simplemente usa la app y se dueño de tus passwords, se acabaron los hackeos, filtraciones y demás problemas.

Me mola… ¿Qué hago para probarlo?

Directo a https://www.nomorepass.com allí tienes todos los enlaces e instrucciones…

Instalar un servidor de correo con docker

Hace tiempo que vengo mirando la tecnología de contenedores con interés, la verdad es que desde hace mucho tiempo el trabajo más ingrato, después de haber terminado un desarrollo, era configurar el servidor donde se iba a ejecutar finalmente. No basta con saber el sistema operativo, necesitas instalar una miriada de dependecias y de versiones de software que no siempre se encuentra en la versión que usaste para el desarrollo. Docker promete poder replicar entornos completos mediante una virtualización parcial y eso me parece muy, muy interesante.

Aunque no entraré al análisis profundo de cómo funciona docker, por el momento, si que veremos un ejemplo práctico de una tarea muy habitual como administrador de sistemas, configurar un servidor de correo con todos los servicios habituales. Para ello vamos a utilizar una máquina virtual (no sirve cualquiera, hay sistemas de virtualización que no se llevan bien con docker, en mi caso usé un VPS de OVH después de desechar otros dos de strato y webserver4you). Nuestra máquina virtual tiene un ubuntu 14.04… Al lío.

Lo primero que hay que hacer es instalar docker. Por suerte esto es bastante sencillo:

sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates
sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
sudo apt-get install docker-engine

Con esto ya tendremos docker en la máquina. Podemos probarlo:

sudo service docker start
sudo docker run hello-world

Si no queremos andar usando sudo para cada comando, añadiremos nuestro usuario al grupo de docker:

sudo groupadd docker
sudo usermod -aG docker $USER

Ahora usaremos Poste.io como contenedor de nuestro servidor de correo. Es una solución simplemente completa y muy sencilla de instalar y configurar. En nuestro caso lo único que hay que hacer para ponerlo a funcionar es crear un directorio (en mi caso /home/mail/data) y ejecutar lo siguiente:

docker run \
-p 25:25 \
-p 81:80 \
-p 110:110 \
-p 143:143 \
-p 8443:443 \
-p 465:465 \
-p 587:587 \
-p 993:993 \
-p 995:995 \
-v /etc/localtime:/etc/localtime:ro \
-v /home/mail/data:/data \
-e "HTTPS=OFF" \
--name "mailserver" \
--restart=always \
-t analogic/poste.io

Lo más relevante en este caso es que NO queremos las redirecciones https porque vamos a configurar el servidor apache que ya tenemos para que actúe de proxy y será él quien tenga el https y los certificados y que el puerto que exponemos para la administración es el puerto 81 (redirigido al puerto 80 del contenedor).

Para que sea accesible desde el exterior por https lo que hicimos fue configurar un virtualhost en apache de esta manera:

<VirtualHost *:80>
        ServerName mail.midominio.es
        AssignUserId mailuser mailuser

        ServerAdmin [email protected]
        DocumentRoot /home/mailuser/www

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <Directory /home/mailuser/www>
                Options Indexes FollowSymLinks
                AllowOverride All
                Require all granted
        </Directory>

ProxyPass / http://localhost:81/

RewriteEngine on
RewriteCond %{SERVER_NAME} =mail.midominio.es
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</VirtualHost>

La configuración del https es similar, aunque yo dejé que el certbot de let’s encrypt me lo configurase automáticamente al generar los certificados, quedó una cosa como esta:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mail.midominio.es
        AssignUserId mailuser mailuser

        ServerAdmin [email protected]
        DocumentRoot /home/mailuser/www

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <Directory /home/mailuser/www>
                Options Indexes FollowSymLinks
                AllowOverride All
                Require all granted
        </Directory>

ProxyPass / http://localhost:81/

SSLCertificateFile /etc/letsencrypt/live/mail.midominio.es/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mail.midominio.es/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/mail.midominio.es/chain.pem
</VirtualHost>
</IfModule>

Si todo ha ido bien (seguro que algún detalle se nos pasa), tendremos el contenedor funcionando y podremos acceder al administrador de esta manera:

https://mail.midominio.es/admin/

Y, después de verificar la identidad y hacer los primeros ajustes de dominio, cuentas y demás podremos disfrutar de nuestro servidor de correo…

 

La épica del informático

programmingHoy toca una entrada para alabar la tarea de nuestros trabajadores del conocimiento (eufemismo clase Dios) que son, como no, ninguneados e ignorados silenciosamente por el público en general y por sus jefes en particular. Pero esperad, antes de eso, un «mea culpa»… ¿Porqué los profesionales de la informática son tan despreciados en esta, una sociedad construida en base a su esfuerzo? Os diré mi opinión… Porque acostumbramos mal a nuestros clientes. Nos piden lo imposible y se lo damos, nos quejamos, nos revolvemos contra la ignoracia atrevida del que nos pide la luna pero finalmente cedemos y eso es lo que nos conduce inexorablemente a las mazmorras de nuestro propio talento.

Si alguien pide un presupuesto a un fontanero para que le ponga un grifo debajo de la cama (por estúpido que eso sea) y consigue un profesional que no se descojone de su ocurrencia y le de el presupuesto lo más normal es que consiga su grifo y nada más. Imaginemos la conversación:

  • Cliente: ¿Qué es esto que me has puesto aquí?
  • Fontanero: un grifo
  • Cliente: pero está debajo de la cama, ¿cómo voy a poder usarlo así?
  • Fontanero: es lo que pidió
  • Cliente: si, claro, pero es de sentido común que un grifo debajo de la cama debe tener algo que permita que se use desde encima de la cama
  • Fontanero: eso no es mi problema
  • Cliente: venga, no me vengas con esas, un grifo que no se puede usar no te lo voy a pagar.
  • Fontanero: es lo que has pedido y es lo que tienes que pagar
  • Cliente: ya, pero al menos harás que se pueda usar desde la cama
  • Fontanero: solo tienes que bajar de la cama y amorrate al caño
  • Cliente: eso no es práctico
  • Fontanero: ya ¿y?
  • Cliente: venga, me haces un apaño para que pueda usarlo desde la cama y luego te contrato la pila del baño
  • Fontanero: ni de coña, aquí tiene la factura.
  • Cliente: bueno, vuelve dentro de un mes y te pago junto con el resto de..
  • Fontanero: ahora
  • Cliente: esto…
  • Fontanero: ¿Pagas o me llevo el grifo y se te inunda la casa?

Bueno, algo así… Los clientes suelen ser más razonables con los fontaneros que con los informáticos, porque, total, seguro que a los informáticos les gusta hacer mal su trabajo y no ponen todas las cosas que tienen que poner porque son vagos.

¡Pues no!

Los informáticos, y los programadores principalmente, son héroes. Gente que consigue lo imposible, que cumple con requisitos inverosímiles, que estira el tiempo disponible hasta lo absurdo para conseguir terminar algo que, probablemente, luego sea mal juzgado por algún ignorante en la materia. Los programadores más experimentados crean obras de arte en unas líneas de código que, aunque podrían ser admiradas en museos donde otros programadores no puedan más que deshacerse en halagos, al final son ejecutados una vez por alguien que no está preparado ni para programar una lavadora y obtienen un comentario estúpido sobre el número de clicks que hay que hacer… Estos héroes anónimos mueven nuestro mundo, allí donde mires hay un programa que escribió alguien, que hace más sencilla tu vida, o que te permite hacer cosas impensables hace solo unos años. Estos héroes sin nombre que, por lo menos en España, están mal pagados, mal vistos (como si picar código al azar en un editor fuese programar), mal dirigidos por gente sin criterio y sin empatía. Formando parte de hojas excel que los mide en kilos de carne y los vende y los compra a otros patanes con ínfulas que creen que hacer informática es un simple problema de coste.

Por todo ello, amigo gerente, si alguna vez un programador te intenta explicar lo difícil que es conseguir algo, entiéndelo como un cumplido que te hace intentando dejar que veas una porción pequeña de su complejo mundo interior. Intenta comprender que no te está intentando dar una excusa, sino describiéndote el peligroso campo de batalla en el que va a meterse en tu nombre y dar hasta su última gota de sudor y sangre para acabar con el enemigo y conseguir esa funcionalidad que tu describes en una frase pero que eres completamente incapaz de explicar en sus detalles (o, simplemente, no quieres hacerlo por pereza).

Día a día, proeza a proeza, sin parar, sin esperar recompensa, sin aparecer en los libros de historia (ni siquiera viendo reconocida su propiedad intelectual muchas veces), el programador anónimo sigue siendo el motor de esta sociedad y, desde aquí mi más sincero agradecimiento a todos ellos. Y, por favor, dejad de tratar a los gerentes como niños, que ellos no quieran escuchar los problemas no significa que estos no estén ahí y que merezcan verlos con sus ojos… Igual así despiertan y os empiezan a tratar como lo que sois, los nuevos magos de la tecnología moderna.