Monthly Archives: March 2010

Te da tu software suficiente libertad ?

Introducción.

La libertad del software hace referencia a lo que puedes hacer con él (free speech) y no precisamente al valor económico de este en el mercado (free beer).  La GNU, desarrolladora del sistema operativo GNU/Linux, nos habla de los derechos que deberíamos tener sobre el software (y de manera extensible para otros tipos de contenido) para que estos sean de real provecho y utilidad para la humanidad, facilitando el desarrollo de nuevos contenidos e innovación.

Esto es en pocas palabras lo que diferencia al software propietario o no libre del software libre (free software).  El núcleo de todo se fundamenta en el acceso al código, en lo que coinciden con el movimiento de código abierto (open source), pero adicionan además todo un sustento filosófico que propende por los derechos del usuario y la libertad para utilizar y manipular el software según sus propias necesidades, evitando las restricciones innecesarias y autoimpuestas de otros tipos de licenciamiento que van en detrimento del propio usuario y sólo favorecen al editor que en muchos casos se lucra de manera desmedida al mantener atado al usuario con restricciones poco éticas.

En el contexto en el que nos encontramos, sociedad y época, es muy posible que fácilmente encontremos argumentos para dar soporte a los licenciamientos no libres y encontremos un tanto utópico al software libre y a todo lo que este movimiento ideológico incluye, sin embargo los temas son profundos, tanto de ancho como de altos, así que es importante para todos, especialmente para quienes desarrollamos software -o incluso conocimiento-, estudiar un poco mas del tema para forjarnos una idea real de estas tendencias y apartarnos de las ideas impuestas por otros que recibimos a diario a través del mercadeo en los medios.

Si encuentra sensato que usted no esté en capacidad legal de compartir el software con sus familiares, amigos o colaboradores, lo invito a que considere cual es el orígen real de estas restricciones legales ?  Para proteger a quién fueron diseñadas ?  En la época actual surten realmente ese efecto ?  Las tecnologías digitales -incluyendo a Internet- deben adaptarse a esas normas o deberían las normas adaptarse a la actualidad en la que vivimos ?  En qué medida deberíamos ceder nuestros derechos de utilizar, manipular y adaptar nuestras cosas según nuestras necesidades ?

Es posible que muchos consideren que el licenciamiento actual es el idóneo ya que los desarrolladores deben vivir de algo y el desarrollar aplicaciones es su trabajo, de esta manera el licenciamiento está protegiendo a los desarrolladores de que otros se roben sus logros y se lucren de ellos.  Sería muy interesante investigar si son realmente los desarrolladores (léase las personsa que realizan el análisis, diseño e implementación) del software quienes reciben -al menos la mayor parte- de la remuneración o si hay toda una cadena de intermediarios (realmente necesarios ?) que toman su tajada también.  Esta inquietud puede ser trasladada a otros contextos similares como la composición de música, la elaboración de películas o la escritura de libros.

Considere también la posibilidad de que pasaría si estas normativas de licenciamiento idóneas aumentan su cobertura limitando aún mas sus derechos con el contenido o producto ?  Compraría usted un libro qué sólo pudiera leer en la sala de su casa ?  Qué solo pudiera leer usted y no pudiera compartirlo con sus familiares o vecinos ?  Compraría usted un libro que sólo se pudiera leer una determinada cantidad de veces ?  Qué no pudiera citar o basarse en él para sus propios escritos, para generar nuevo conocimiento ?  Si sus respuestas son negativas, tal vez no quiera saber de las nuevas tecnologías para la gestión de derechos electrónicos que se están intentando desarrollar en este momento.

Este es un tema muy interesante y muy denso que la mayoría conocemos o hemos meditado con una mínima profundidad y vale la pena investigar mas al respecto.  Como mencioné anteriormente probablemente nos sea mas fácil entender el punto de vista que nos han vendido diariamente y el propuesto por GNU nos suene un tanto idealista y utópico.  Puede que así sean las cosas … o puede que no.  Lo realmente importante es que todos debemos tomar decisiones drásticas al respecto y que estas deben beneficiar a todos -la humanidad- mediante el apoyo para la generación de nuevos contenidos e innovación y no limitarse a beneficiar lucrativamente a pocos que bien pueden estar montando un negocio a costa de la pérdida de nuestras libertades.

Para tomar decisiones inteligentes es necesario conocer mas ambos puntos de vista.  El no libre es bastante mas conocido ya que lo respiramos practicamente a diario en todos los ámbitos de la vida cotidiana, mientras que el libre suena mas esotérico y nebuloso.  A quien esté interesado en aprender un poco mas de la filosofía del software libre lo invito a leer el libro "Software libre para una sociedad libre", escrito por Richard Stallman precursor de este movimiento.  En el libro el autor explica los comienzos y los conceptos que lo llevaron a iniciar esta cruzada en pos de los derechos de los usuarios y desarrolladores de software e incluye varios capítulos en los que se analizan de manera inteligente muchos de los supuestos que hacemos con respecto a las políticas de licenciamiento que estamos acostumbrados.  Tal y como podría suponerse, el libro es de distribución libre y puede descargarse del sitio web de GNU (ver enlaces).

Entonces, qué es el software libre ?

Como se mencionó inicialmente al hablar de software libre (free software) se habla de libertad, de lo que se me está permitido hacer con el software mas no necesariamente de precio.  Nosotros no tenemos la confusión semántica que se tiene en el idioma inglés en el cual la misma palabra (free) tiene ambas connotaciones libre y gratis.  De paso es bueno mencionarlo, el software libre no es necesariamente gratis, yo puedo contratar (pagándole obviamente) a un desarrollador para que implemente una aplicación y después publicarla como software libre, quienes la obtengan después recibirán todos los derechos que esto incluye.

Esto lo menciono porque es importante desligar las dos palabras gratis y libre del free software.  También es posible cobrar una módica cuota por distribuír el software libre, por hacerle mejoras específicas que a su vez se convertirán en libres también y por capacitaciones, asesorías y soporte.  Como se dijo anteriormente, los desarrolladores también necesitan de que vivir y esta filosofía no es ajena a eso.

En rigor un software es libre cuando su licenciamiento le garantiza al usuario las siguientes libertades.

    1. La libertad para ejecutar el programa sea cual sea nuestro propósito.
    2. La libertad para estudiar el funcionamiento del programa y adaptarlo a tus necesidades —el acceso al código fuente es condición indispensable para esto.
    3. La libertad para redistribuir copias y ayudar así a tu vecino.
    4. La libertad para mejorar el programa y luego publicarlo para el bien de toda la comunidad —el acceso al código fuente es condición indispensable para esto.

      Enlaces.

      Crear un tunel SSH para la conexión a un servidor MySQL detrás de un firewall con Windows utilizando Putty

      Introducción.

      De manera análoga a como se realizó el tunel SSH utilizando Linux, también es posible implementarlo en Windows gracias al uso de herramientas de terceros como Putty.

      Para la verificación de la conexión a la base de datos en lugar de la herramienta básica de línea de comando (que también debe funcionar normalmente) se utilizará MySQL Workbench que es la herramienta de administración gráfica que provee el motor de bases de datos.

      Implementación de la solución.

      Crear la especificación del tunel en Putty.

      Este paso sólo es necesario realizarlo una única vez mientras se configura el perfil en Putty, en ocasiones posteriores sólo será necesario invocarlo.

      Ejecute Putty.exe.

      Session en Putty.exe

      Session en Putty.exe

      En la Session (lado izquierdo) especifique la siguiente información.

      1. Nombre del servidor SSH.  desarrollo.com para este ejemplo.

      2. Puerto del servicio SSH.  Es el puerto 22 por defecto.  Elija además el tipo de conexión (Connection type) SSH.

      3. Especifique un nombre para almacenar la sesión (Saved Sessions).  MiTunel para este ejemplo.

      4. Presione el botón guardar (Save) para almacenar la configuración recién especificada.

      Connection > SSH en Putty.exe

      Connection > SSH en Putty.exe

      En las opciones de Connection > SSH elija la casilla de verificación Don't start a shell para evitar que se cree una consola de comandos interactiva ya que sólo se desea crear el tunel.

      Connection > SSH > Tunnels en Putty.exe

      Connection > SSH > Tunnels en Putty.exe

      Determine la información relacionada con los lados del tunel.

      5. Especifique el puerto local desde el cual se iniciará el tunel.  3307 en este caso.

      6. Especifique el destino y su puerto donde terminará el tunel.  localhost:3306 para este ejemplo.

      Presione el botón agregar (Add) para almacenar los extremos del tunel.

      Finalmente almacena la configuración establecida regresando a la sección de Session y presionando el botón de guardar (Save).

      Establecer un tunel previamente especificado.

      Esto se puede hacer de dos maneras, una desde la interfaz gráfica de Putty seleccionando MiTunel en la lista de las sesiones guardadas (Saved Sessions), presionando el botón cargar (Load) y abriendo la sesión presionando el botón (Open).

      Una segunda alternativa es desde la línea de comando ejecutando la siguiente instrucción.

      C:\ruta\a\putty.exe -load MiTunel

      En ambos casos el resultado es el mismo, aparecerá una ventana de login para realizar la autenticación con el servidor remoto (6).

      Autenticación de usuario con SSH.

      Autenticación de usuario con SSH.

      Realizar la conexión a MySQL a través del tunel SSH.

      Como se mencionó inicialmente para la verificación de la conexión se utilizará MySQL Workbench.

      Connect to database

      Connect to database

      Debe tenerse muy en cuenta que gracias al tunel recién creado, la aplicación cliente de la base de datos interpretará que el motor de base de datos se encuentra ubicado localmente (9) y que su puerto es el 3307 (10) -ver 5 y 6-.

      Crear un tunel SSH para la conexión a un servidor MySQL detrás de un firewall con Linux Debian 5

      Introducción.

      Este es el panorama del esquema de red de la oficina del grupo de desarrollo.

      Esquema de la red

      Esquema de la red

      Un servidor (centro) alberga los proyectos web (Apache) de los cuales el grupo de desarrollo manipula sus archivos (SSH + Samba), así como sus bases de datos (MySQL).  El servidor cuenta con dos interfaces de red las cuales separan físicamente el acceso de la red privada (eth1) de la red pública o Internet (eth0).

      Los desarrolladores utilizan los clientes desde la red privada para la cual no hay ningún tipo de filtro en el servidor y pueden acceder a la totalidad de sus servicios.  Desde el exterior, el servidor implementa un firewall que sólo permite la consulta web de los proyectos y el acceso al SSH.  Como fácilmente se concluye, el firewall de la interfaz pública (eth0) filtra explícitamente el acceso a los servicios de MySQL y Samba que son considerados como inseguros.

      El problema.

      Se requiere ahora que los desarrolladores puedan acceder al servidor desde sus clientes a través de Internet.

      El problema se divide en dos aproximaciones.

      1. Manipular el software, el código y los datos remotamente.
      2. Manipular el software y el código localmente, y los datos remotamente.

      La solución.

      Manipular el software, el código y los datos remotamente (1).

      Este es el caso mas simple.  Como los aplicativos son web se acceden a través de un navegador, su código es manipulado a través de SSHFS (ver instrucciones para Linux y Windows) y sus datos son manipulados a través de la web con PHPMyAdmin.

      Manipular el software y el código localmente y los datos remotamente (2).

      Este caso es mas elaborado que el anterior ya que el software y el código reside localmente porque lo es muy fácil de manipular, sin embargo los datos (la base de datos MySQL) de los proyectos continúan viviendo en el servidor de desarrollo.

      Dado que el puerto de acceso a MySQL se encuentra filtrado para el exterior por razones de seguridad es inicialmente imposible conectarse a la base de datos desde el cliente a través de Internet.  La solución es crear un tunel SSH desde el cliente remoto hasta el servidor a través del medio inseguro (Internet) y desde allí, ahora un lugar seguro, realizar la conexión con el puerto de la base de datos que en este caso reside en el mismo servidor.

      Implementación de la solución (2).

      Por razones que serán obvias, es necesario que los usuarios remotos cuenten con cuentas (nombre de usuario/contraseña) en el sistema operativo del servidor de desarrollo y que estas estén habilitadas para acceder al mismo a través de SSH.

      Las siguientes acciones se realizan desde el cliente remoto.

      Establecer el tunel SSH entre el cliente remoto y el servidor de desarrollo.

      $ ssh desarrollador@desarrollo.com -L 3307:localhost:3306 -N -f

      Con la instrucción anterior estamos creando un tunel entre el cliente remoto y el servidor desarrollo.com con el usuario desarrollador y utilizando al protocolo SSH.  Se le está indicando además que el tunel se deberá establecer entre el puerto 3307 local y el puerto 3306 del servidor remoto, en este caso el mismo localhost.  Es muy importante tener en cuenta que la referencia de este último servidor remoto se realiza previa conexión a desarrollo.com, es decir que su acceso se hace desde este y no directamente desde el cliente que inicia la conexión del tunel ejecutando el comando.

      Otro aspecto interesante a tener en cuenta es que los puertos utilizados no necesariamente deben ser diferentes ya que uno es local (3307 en este ejemplo) y el otro es remoto (3306 el estándar de MySQL), sin embargo en el caso de que ya se cuente con una instalación local de MySQL (utilizando el puerto 3306) será entonces necesario utilizarlos diferentes como se ha planeado en este artículo.

      Realizar la conexión a MySQL a través del tunel SSH.

      Después de establecido el tunel entre cliente y servidor la conexión se realiza directamente con el puerto local (3307) del cliente remoto como si el servicio se estuviera ejecutando en la misma máquina cliente, el tunel se encarga de transmitir la información encriptada y realizar las conversiones necesarias a cada uno de los lados.

      $ mysql -h 127.0.0.1 -u bd_usuario -p -P 3307 bd_nombre

      Tenga en cuenta que el inicio de conexión (connect) a una base de datos toma cierto tiempo ya que el motor de bases de datos realiza una carga previa de los nombres de las tablas y de los campos de estas.  Si desea evitar esta precarga de información puede utilizar el parámetro -A en la invocación al cliente de MySQL (mysql).

      Scripts de conexión.

      A pesar de que el procedimiento es -extremadamente- simple, he creado un par de scripts para facilitar y automatizar el proceso de creación del puente SSH y de conexión a la base de datos a través de línea de comando.

      Los scripts pueden ser descargados de aqui y configurados utilizando cualquier editor de texto.  tunssh_connection se encarga de establecer la conexión del túnel SSH mientras que tunssh_mysql realiza la conexión a la base de datos MySQL remota a través del túnel SSH.

      Enlaces.

      Actualizar DynDNS.org desde Linux Ubuntu utilizando Inadyn

      Introducción.

      El portafolio de DynDNS incluye un servicio gratuito de DNS Dinámico (entre otros servicios algunos pagos) que permite asociar una dirección IP dinámica como la asignada por los proveedores de servicio de internet a las cuentas de banda ancha, a un nombre de dominio proporcionado por ellos.

      La principal ventaja de este servicio es que se actualiza frecuentemente adaptando el DNS según se modifique la dirección dinámica del router, permitiéndole a los clientes acceder al servidor utilizando siempre el nombre DNS y desconociendo por completo la dirección IP o su eventual actualización.

      El servicio de Free Dynamic DNS se puede solicitar directamente desde el sitio web de la empresa, http://www.dyndns.com/.  Del lado del cliente, nosotros, debemos configurar a los equipos para que actualicen dinámicamente la información del servicio cuando se detecte un cambio en la dirección IP local.  Esto frecuentemente se realiza en los enrrutadores.  Por ejemplo, los enrrutadores que se utilizan en los hogares, como era antes mi caso con un Netgear, permiten desde su misma interfaz web de administración suministrar los datos de la cuenta DynDNS.org y ellos se encargan de mantener actualizados los datos.

      Ahora utilizo un enrrutador marca Scientific Atlanta 2325 el cual aparentemente no incluye esta facilidad por lo cual me veo obligado a implementarla en el servidor de desarrollo que utiliza Linux Ubuntu Server 9.10 como sistema operativo.

      Para hacer esto utilizo Inadyn, un software para la actualización de DNS dinámicos que es muy fácil de utilizar e incluye el soporte a DynDNS.org y otros servicios mas.  Este paquete se puede utilizar en Linux (por supuesto), MacOS, OpenBSD e inclusive Windows.

      Instalación & Configuración.

      Instalación de los paquetes de Inadyn.

      $ sudo aptitude install inadyn

      Crear el archivo de configuración por defecto.

      $ sudo cp /usr/share/doc/inadyn/examples/inadyn.conf /etc/inadyn.conf

      Asegurar los permisos del archivo de configuración por defecto.

      $ sudo chmod 600 /etc/inadyn.conf

      Editar la configuración de Inadyn con la información específica del servicio de DynDNS.org.

      $ sudo vi /etc/inadyn.conf

      –username USUARIO
      –password CONTRASEÑA
      update_period_sec 3600
      log_file /var/log/inadyn.log
      alias DOMINIO_DYNDNS
      background

      Modifique el archivo de configuración de acuerdo a sus valores específicos.

      • USUARIO: su nombre de usuario en DynDNS.org.
      • CONTRASEÑA: la contraseña correspondiente al usuario mencionado anteriormente.
      • DOMINIO_DYNDNS: dominio que se configuró gratuitamente con la cuenta en DynDNS.org.

      Crear un proceso cron para ejecutar Inadyn automáticamente al inicio del sistema operativo.

      $ sudo crontab -e

      @reboot /usr/sbin/inadyn

      Comprobación del funcionamiento.

      Cuando reinicie la máquina verifique que el proceso Inadyn se encuentre ejecutándose correctamente.

      $ ps -A | grep inadyn

      1149 ?        00:00:00 inadyn

      $ cat /var/log/inadyn.log

      INADYN: Started 'INADYN version 1.96' – dynamic DNS updater.
      INADYN:IP: Error '0xb' resolving host name 'checkip.dyndns.org'

      Verifique la dirección IP asociada al nombre DNS del servicio utilizando un ping por ejemplo.

      $ ping ejemplo.gotdns.org

      Si ejecuta la verificación desde la misma red interna del equipo, la dirección IP obtenida deberá ser la misma de su modem/router, la cual podrá verificar en servicios como http://whatismyipaddress.com/.

      Relacionar el dominio DynDNS.org con un dominio privado.

      Es posible relacionar el dominio que nos ofrece gratuitamente DynDNS (ejemplo.gotdns.org) con un dominio de nuestra propiedad.  Esto es muy útil ya que permite utilizar el dominio DNS oficial del administrador o de la empresa que lo está configurando haciendo que sea totalmente transparente para el usuario final que se está utilizando DynDNS.org en el intermedio para la conexión.

      Para hacer esto sólo es necesario crear una nueva entrada en el servidor DNS incluyendo un registro CNAME entre el nuevo dominio y el asignado por DynDNS.org.

      ejemplo.jorgeivanmeza.com IN CNAME ejemplo.gotdns.org

      Gracias a lo anterior, el nuevo dominio (ejemplo.jorgeivanmeza.com) hará siempre referencia al original (ejemplo.gotdns.org) el cual se mantendrá siempre actualizado con los cambios de la dirección IP dinámica gracias a la configuración del Inadyn realizada anteriormente.

      La configuración del DNS para agregar el CNAME varía el paquete de DNS u operador de hosting que se utilice.  Estos pasos describen los procedimientos necesarios con los principales operadores de hosting, en un servidor Linux y en un servidor Windows.

      Enlaces.