Configure Juniper VPN Web Client Ubuntu 14.04 64 bits

So i am doing a project with Mercado Libre and they use Juniper VPN.

I love to code using Linux, it has a lot of advantages. At this moment I am using Ubuntu 14.04 64 bits.

Mercado Libre sent me the instructions on how to connect with my login/password. So I followed them, but thanks to the awesome people of Juniper, they does not have support for Linux 64 bits. At least they have this guide.

That guide did not work for me. I had to struggle and read a lot over the internet, view system logs, etc. After one day I was able to connect, so this are the instructions i followed:

  1. sudo dpkg –add-architecture i386
  2. sudo aptitude purge firefox
  3. sudo aptitude install firefox:i386 icedtea-7-plugin:i386 openjdk-7-jdk:i386
  4. Open Firefox, enter the login/password/token, then it will load the plugin and ask to allow and accept a lot of things, click all yes and that is it. You need to make sure Firefox have all the permissions to run the java applet.

That guide works if you are running the client directly from the computer, not from the browser. We just need to be sure that Firefox will load the Juniper VPN applet running on a 32 bits JVM.

Advertisements

Como vamos

Primero comentare del pasado domingo brevemente:

No hubo fraude, simplemente tenemos una mayoría en el país que fue exluida por 40 años y ahora que le dan migajas de esperanzas, dan su voto por la mediocridad. Un cambio es necesario y es hora de una política seria.

Desde hace que no posteo nada, he estado ajustado de tiempo. Las cosas que han pasado:

  • Ya no ando programando en asp.NET (use MVC 3.0 con VB y 2.0 con C#)
  • Lo del artículo va en camino de tortuga.
  • Ahora ando en un proyecto de investigación, donde he tenido que usar Java, Python, bash y SQL.
  • Me compre un Nexus 7 y unos audífonos. Excelente hasta ahora, 100% recomendables.
  • asp.net MVC >= 3.0 no tiene nada que envidiarle a otro frameworks. Es facil de usar y de programar. En mi caso use el EntityFramework para manejar la parte del modelo. Es bastante configurable y permite usar stored procedures. Ésto último es muy buena práctica. IIS lo poco que tuve que tocar, me pareció bueno. Mis quejas serían tener que pagar por algo que se puede tener gratis igual o mejor (RoR, Django) y la documentación no es tan buena en comparación con las cosas que son open source.
  • Team Fundation y svn, son un asco al lado de git. Gracias Linus Trovalds.
  • Como escribí antes me encanta Python, lástima que lo conocí y aprendí tarde. Es bastante legible y poderoso. Ando seguro que Perl es muy usado y posiblemente más poderoso, pero odio los $ (si odio php).
  • Es increíble la cantidad de herramientas que existen hoy en día. Ejempo son hadoop, pig, oozie, que otros en el trabajo andan usando.
  • Con respecto al anime, me leí gran parte de las novelas de Sword Art Online. Muy buenas. Salió una ova de Code Gueass.
  • Me puse a ver Breaking Bad. Voy terminando la 3era temporada. Que serie tan buena. Tiene unas partes que te mantienen pegado, pero debo decir que a veces se pone algo calmada y lenta. Ya veremos como sigue.

A ver si tengo cosas más interesantes que colocar, ya veremos.

Mi tesis

Decidí escribir sobre mi tesis.

Primero hablaré el porque tome este camino y no pasantía. Lo primero, trabajo para mi mismo y mi compañero, es decir, yo dispongo de mi tiempo. Segundo, trabajar usualemente es algo muy mecánico y en la cual uno no toca temas interesantes  de la teoría de la computación, la cual me parece full interesante. Con éstas razones, sumándole de tener un buen compañero y una profesora dispuesta a ser tutora, se dió el proyecto.

Mi tesis trata sobre clustering de datos, el cual hoy en día es usado en diversas aplicaciones, como lo son Data Mining, preprocesamiento de imágenes, etc. Es una búsqueda no supervisada (no se tiene información previa y se clasifica desde cero). Es un problema NP-Hard.

La manera para atacarlo fue mediante metaheurísticas. Éstas son algoritmos, génericos, por ello la palabra meta, que usan suposiciones/intuiciones que no siempre dan resultados exactos, de ahí la palabra heurística. Hay montones: genético, búsqueda Tabu, algoritmo hormiga, PSO, simulated anieling, etc. Mi compañero y yo implementamos 5 de ellas, basadas todas en población e inteligencia colectiva.

La implementación fue en C++. Para este tipo de problemas se quiere un lenguaje que compile a código de máquina. Se busca eficiencia. La diferencia entre C y C++ es mínima en tiempo, siendo este último preferible por ser orientado a objetos.

De todo lo que se hizo, lo que mejor quedó fue el algoritmo genético. Dió los mejores resultados, es muy flexible, eficiente, etc. Mi compañero y yo hemos estados haciendo pruebas, cambiando y mejorando el código para ver si con la tutora, que tenemos abandonada, logramos escribir una publicación. El código ha sido reescrito y mejorado. Ahora es super entendible y a su vez bastante efieciente. Ya en uno de mis post toque el tema de mis intentos y logros por hacer el código mas efieciente.

Es bastante divertido saber la cantidad de lenguajes que usamos. Además de C++, se usan Python, Haskell y Latex, cada uno para cosas diferentes. Para el manejo de versiones se usa GIT. Ya veremos que sucede, posteo unas imágenes para demostrar lo que es capaz de hacer:

Antes:

Peppers

Después:

Peppers, Resultado

Antes:

Lenna

Después:

Lenna, Resultado

Antes:

Fotografía

Después:

Fotografía, Resultado

Finalmente una imagen de la cual se pueden conseguir patrones escondidos:

John Lennon

Eso es todo, hablamos !

Cosas interesantes que he aprendido

Éstos últimos días en el trabajo como tal no he averiguado muchas cosas nuevas, pero quisiera mencionar algunas cosas interesantes:

  • Leí como funcionaba el protocolo OAUTH, el cual es usado por Facebook, Twitter, Google, etc. que consiste en la autentifícación de usuario fuera del proveedor de un servicio web para un tercero(consumidor). El ejemplo más común es el poder autentificarte/registarte en alguna página mediante tu cuenta de FB. Super interesante lo que leí y conocer en cierto modo su funcionamiento general ya que la forma en que es aplicado varía de cierta forma entre quienes lo ofrecen. Facebook da un uso bastante sencillo.
  • Éste mismo día mi jefe encontró un artículo sumamente interesante de como hacer consultas eficientes cuando se necesita tomar elementos de una tabla de forma aleatoria. El link es el siguiente: http://blog.rhodiumtoad.org.uk/2009/03/08/selecting-random-rows-from-a-table/
  • Hace un rato que conseguí este excelente artículo: http://blog.zx2c4.com/749. De verdad que impresionante lo que el conocimiento y curiosidad pueden lograr.
  • Tuve una gran noticia: es mu factible que haga un publicación de ciertas cosas hechas en mi tesis. Hare un artículo con mi compañero de tesis y tutora usando el algoritmo genético y abaje para Data Clustering de datos numéricos. Veamos que tal sale eso 🙂
  • Y bueno siguiendo a las personas de Anonymous por twitter he visto como tumban páginas web usando XSRF y SQL Injections. Eso me acordó del siguiente artículo que hace un rato conseguí: http://google-gruyere.appspot.com/
  • Me sucribí al curso de seguridad y machine learning que ofrecerá Standord

Configurando diversas máquinas virtuales y vigilarlas con puppet

Este sera mi primer post,

Les explico en el trabajo, producción consta de diversas máquinas (usan ubuntu), en las cuales corren diversas cosas:

nginx

haproxy

uwsgi

python

Usualmente ocurren problemas que hacen que se caiga todo y eso causa mucha molestia, ya que la mayoría de las cosas para levantarlas de vuelta, es necesario hacerlo mano.

Por ello se decidió usar alguna herramienta de administración automática, pero primero se tenía que montar el ambiente de pruebas. Se uso VirtualBox.

Se hizó lo siguiente:

  1. Se creó una imagen base
  2. La máquina donde se colocan las máquinas virtuales no tiene X, por lo que todo se hizo por cónsola, cosa que era necesaria ya que la idea es hacer un shell script que teniendo la imagen base cree el resto de las cosas. En las máquinas creadas se agregó la clave pública, que es la misma en todas las máquinas creadas, en .ssh/authorized_keys de forma que no preguntara el password a la hora de usar ssh y además se quitó la necesidad de tener que colocar clave para hacer sudo. Tardó un buen rato ver la manera más eficaz y sencilla de crear las cosas mediante VirtualBox (se copia el disco duro, el archivo .vdi),  además lograr darle las capacidad de que tomen ip propia de la red usando la configuración bridged . El problema es que hay que eliminar un archivo en /etc/udev/rules.d/70-net… (no me acuerdo bien), de forma que tomaran una macadress única y el servidor dhcp diera ip distintas. Luego cada una se le agregan los hosts a /etc/hosts para que cada una se comunicara con las otra sin la necesidad de colocar alguna ip.
  3. A cada máquina se le creo un script que la configurar con las consas necesarias. También se tuvo que crear 3 servicios, que reiniciaran diversas cosas que no corren como demonios, eso también robó un buen rato, la mejor forma de correr programas como demonios es start-stop-daemon, permite darle toda la configuración necesaria.
  4. Ya con las máquinas corriendo las cosas, la tarea era ver que herramienta usar para la administración automática usar. Existen varias. Se empezó a leer de CFEngine, la cual es conocida y es muy capaz. Estuve un buen rato leyendo su documentación y todo el mundo la pintaba como una maravilla, cosa que no dudo. Pero debo decir que la documentación es muy básica y mala, no me agradó en nada. El lenguaje de programación que usa, está basado en la teoría de promesas. Éste es no intuitivo y complicado en su forma de uso. Tiene cosas muy complejas que se pueden hacer con el. Pero lo que menos me gustó, fue que todos los ejemplos que conseguí eran para probar y no lo que buscaba:  algo que estuviera cada cierto tiempo vigilando el sistema y lo recuperará, avisando de todas formas que paso algo.  Leí y si tiene la capacidad, pero no conseguí un ejemplo práctico.
  5. Al ver no lograr nada, decidí tomar otro camino usando otra herramienta. Me tope con otras dos muy usadas: chef y puppet. Ambas están escritas en ruby. Busque full información de ambas. Unos amaban chef y otro puppet. A la final tome la decisión de usar puppet por diversas razones: el lenguaje es MUY fácil, es MUY usado y esta apoyado por google y otras compañías. Chef recién salió, y fue creado por una persona que estuvo involucrado con puppet, pero sentía que le faltaba.  Me parece algo complejo también además, y por no se muy viejo, podía tener falta de documentación.

Configurando puppet

Puppet es super fácil de configurar. Su arquitectura consta de dos componentes:

  • Servidor(es) maestro(s)
  • Cliente(s)

Lo primero es instalar las cosas en cada máquina.

Configurando el servidor maestro

Instala lo siguiente:

aptiude install puppetmaster

Luego edita el archivo /etc/puppet/fileserver.conf agregando que direcciones de ips quieres permitir.

Een mi caso: allow 192.168.24.0/24. (ejecuté el comando sed -i ’12s/#  allow 192.168.0.0\/24/allow 192.168.24.0\/24/’  /etc/puppet/fileserver.conf)

Finalmente a edita /etc/puppet/puppet.conf y agrega al final las siguientes líneas:

certname=servidormaestro

autosign=false

Ésta última anda por default, pero para estar seguro. Eso es para que se tenga que certificar a los nodos.

Configurando los clientes

Instala lo siguiente:

sudo apitude install puppet

Luego edita el /etc/puppet/puppet.conf

En la sección [main] agrega

server=servidormaestro

runinterval=segundos

Se puede ejecutar:

sudo sed -i '/\[main\]/a\server=servidormaestro' /etc/puppet/puppet.conf
sudo sed -i '/server=servidormaestroa\runinterval=60' /etc/puppet/puppet.con

Y agrega la siguiente sección:

[agent]

certaname=nombre del cliente

Puedes ejecutar:

sudo sh -c "echo \"[agent]\ncertname=${NAME}\" >> /etc/puppet/puppet.conf"

Ésta última para indicar cada cuantos segundos uno quiere que puppet se ejecute.

Recuerda ejecutar lo siguiente:

sudo sed -i 's/START=no/START=yes/g' /etc/default/puppet

Agregando los certificados

Luego de un rato los clientes hacen una petición al sevidor y se va a emitir un falló. Éste sucede porque puppet usa certificados y el servidor debe agregar a los clientes. Para ello primero en los clientes ejecuta:

sudo service puppet stop
sudo puppetd --waitforcert 30 -v
sudo service puppet start

Después en el servidor

for mc in `sudo puppetca --list | sed 's/([A-Z0-9:]*)//g'`
do
 sudo puppetca --sign ${mc}
do

Probando

En el servidor crea las carpetas /etc/puppet/modules/nginx/manifests (sudo mkdir -p /etc/puppet/modules/nginx/manifests) . Ahí crea el archivo init.pp (si tiene que ser este nombre sino no lo importa). Si quieres colocarle el nombre que desee debes importarlo así include ngnix::nombre y tener el archivo dentro de /etc/puppet/modules/nginx/manifests

Ahí coloca lo siguiente:

class nginx
{
 package
 {
    "nginx":
     ensure => installed
 }
 service
 {
     "nginx":
     ensure => running,
     hasrestart => "true",
     enable => "true",
 }
}

Luego en /etc/puppet/manifests crea dos archivos nodes.pp y site.pp (ambos son convención de puppet)

En nodes colocas como el va a mapear los nodos que se conoecten. Supongamos que la máquina que queremos que reinicie el nginx si se cae se llama, clienteweb. Para ello se coloca lo siguiente en el archivo:

node /^clienteweb/
{
 include nginx
}

Algo muy bueno es que se pueden colocar expresiones regulares, lo que facilita muchísimo.

Finalmente en site.pp colóca lo siguiente:

import "nodes.pp"

Ahora procede a probar que las cosas anden bien, para ellos puede tumbar el servicio puppet y correr puppetd -t, que es para hacer pruebas. Algo muy bueno ademas es que puppet tiene opción de debugeo (-debug), cosa fenomenal.

En teoría si configuraste todo como debías si tumbas los sevicios en clienteweb, despues del tiempo que colocaste, este debe reiniciarse.

Espero que esto sea de ayuda,  hasta luego