viernes, 13 de marzo de 2015

Mensaje "304 NOT MODIFIED" en HTTP

Cuando estamos depurando aplicaciones web, y más concretamente analizando el tráfico HTTP entre el servidor y el cliente, es normal que aparezca de forma recurrente un mensaje 304 NOT MODIFIED.

Mensaje 304 de HTTP
Mensaje 304 de HTTP

Si consultamos el protocolo HTTP (RFC 2616), veremos que los mensajes que comienzan por 3 hacen referencia a las operaciones de redirección que requieren la intervención del Agente de usuario, por lo cual el mensaje 304 no representa es un error. 

Con base a lo anterior no debe ser una preocupación que aparezca este mensaje, ya que el servidor nos está informando que el recurso solicitado desde la última vez que lo pedimos no ha sufrido cambios, y por lo tanto será servido desde la chaché.

jueves, 12 de marzo de 2015

Instalar Django bajo Python 3 en Linux

Antes explicaba como instalar Django en Linux usando apt, sin embargo como se están haciendo uso de los repositorios de la distribución, con este método se tendrá una entorno de desarrollo basado en Python 2.7 y una versión de Django que no corresponde a la última liberada.

Para instalar la última versión de Django corriendo sobre Python 3, basta con instalar algunos paquetes y hacer uso de los entornos virtuales como se explica a continuación.

Intérprete de Python

La mayoría de distribuciones traen instalado la versión 2.7 del intérprete de Python con el fin asegurar el correcto funcionamiento de programas y librerías que ya tienen su tiempo. Algunas distribuciones como Ubuntu o Elementary por ejemplo, a la par traen instalado el intérprete de Python 3 aunque por defecto se ejecute siempre Python 2.7.

Para comprobar si tenemos el intérprete de Python 3 sólo basta con ejecutar el comando con similar nombre, y si nos responde la consola de Python significa que ya está instalado y por tanto no debemos hacer nada para instalarlo:

Intérprete de Python 3
Intérprete de Python 3

En caso de no estar instalado, sólo basta con instalarlo así:

sudo apt-get install python3

Se debe tener en cuenta que si se ejecuta el comando python (sin el 3 al final), se ejecutará por defecto el intérprete de la versión 2.7.

Instalar PIP3 y Django

El siguiente paso es instalar pip3, ya que el pip que traen las distribuciones es la versión que trabaja con el intérprete de Python 2.7. Lo primero será instalar el paquete python3-setuptools:

sudo apt-get install python3-setuptools

Y a continuación el paquete pip3:

sudo easy_install3 pip

Con esto ya contamos con PIP3, con lo cual podemos instalar programas que funcionen con el intérprete de Python 3; para nuestro caso Django que se instala así:

pip3 install Django

Con esto ya tenemos una instalación de Django y Python3, solo queda crear un entorno virtual para desarrollar con más comodidad.

Crear un entorno virtual

Ahora que ya tenemos el intérprete de Python3 y PIP3, es necesario instalar la herramienta virtualenv, con la cual podemos crear un entorno virtual a cada uno de nuestros proyectos,  y por tanto las dependencias, versión de las librerías, y en general cambios y ajustes de un proyecto no interferirán con los demás proyectos.

Los primero será instalar virtualenv con PIP3:

pip3 install virtualenv

Ahora creamos una carpeta que contendrá los entornos virtuales y sus proyectos llamándola como deseemos, por ejemplo creando en nuestro home la carpeta virtualenvs:

mkdir ~/virtualenvs

Accedemos a ella y creamos una carpeta para nuestro primer proyecto:

cd ~/virtualenvs
mkdir miproyecto

Y creamos un entorno virtual en ella:

virtualenv --system-site-packages miproyecto

Con esto ya tenemos creado un entorno virtual en la carpeta "miproyecto", que debemos de activar antes de comenzar a trabajar en nuestro proyecto y desactivarlo una vez terminemos.

Para activar el entorno virtual, dentro de la carpeta del proyecto ejecutamos:

source bin/activate

Y para desactivarlo:

deactivate

Si omitimos la activación del entorno virtual tendremos algunos problemas, como por ejemplo errores al ejecutar el servidor web que incorpora Django.

Si ejecutamos el comando python con el entorno virtual activo, veremos que por defecto se ejecutará el intérprete de la versión 3, y no la 2.7 como habitualmente sucede en el sistema operativo.

Probando todo

Finalmente para probar que todo funciona sin problemas, creamos un proyecto dentro de la carpeta del proyecto (~/virtualenvs/miproyecto para este ejemplo) con el entorno virtual activo:

django-admin.py startproject miproyecto-django

Ingresamos a la nueva carpeta que se crea (miproyecto-django) y desde allí activamos el servidor web:

python manage.py runserver 127.0.0.1:8080

En vez de 8080 podemos usar cuslquier puerto siempre y cuando no esté en uso. Nos vamos a nuestro navegador y accedemos a http://localhost:8080 con lo cual veremos algo similar a esto:

Proyecto en Django
Proyecto en Django

Conclusiones

Con todos estos pasos ya contamos con un servidor de desarrollo para construir aplicaciones con Django y Python 3. El servidor que provee el framework jamás debe ser utilizado para poner las aplicaciones en producción, sólo debe ser usados con fines de desarrollo ya que a diferencia de apache o ngix por ejemplo, no cuenta con las características de seguridad y robustez para expornerlo en una red. 

- Más información de Django en https://www.djangoproject.com/.
- Más información de Virtualebv en https://virtualenv.pypa.io.

domingo, 8 de marzo de 2015

El Libro Negro del Programador [Leído]

Continuando con las opiniones nada profesionales de los libros que leo, hoy me gustaría compartir uno que terminé de leer, y que sin miedo a equivocarme recomiendo como lectura obligada si estamos vinculados a la industria del desarrollo de software desde cualquier cualquier rol (analista, desarrollador, arquitecto, manager del proyecto, etc.).


El libro en cuestión es El Libro Negro del Programador, escrito por Rafael Gómez Blanes, quien con una lectura agradable nos relata una serie de experiencias y recomendaciones de lo que se debe y no se debe hacer en proyectos de desarrollo de software.

Basándose en su experiencia profesional de muchos años, el autor reúne en varios capítulos una serie de situaciones que se presentan en un proyecto de desarrollo de software que pueden afectar su calidad y cumplimiento de metas.

Aunque su título parece sugerirlo, el libro no aborda aspectos técnicos como el uso de determinadas herramientas o tecnologías por ejemplo; sino que se centra en describir una serie de comportamientos y en describir las buenas practicas que pueden mejorarlos.

Durante todo el libro se destacan buenas practicas como el uso de los principios del software (DRY, KISS, y S.O.L.I.D por ejemplo), la importancia del refactoring, la importancia de que el software sea altamente depurable, el rol que juega el manager en un proyecto, la capacidad de resilencia de un profesional, y otros muchos aspectos que es mejor conocerlos con la lectura del libro que a través de esta entrada.

Para adquirir el libro sólo basta con acceder al sitio web del autor, y desde allí acceder a los distintos enlaces que nos llevan a las distintas tiendas donde podemos adquirir el libro en formato físico o digital.

lunes, 2 de marzo de 2015

Otorgar permisos en carpeta /var/www/html (Apache + Linux)

Si tenemos un servidor web apache sobre Linux que está recién instalado, es probable que al intentar guardar archivos en la carpeta /var/www/html (que es donde se alojan las páginas y aplicaciones web) tengamos problemas porque nuestra cuenta de usuario no cuenta con permisos de escritura.

Una manera de solucionarlo es otorgar todos lo permisos sobre dicha carpeta con el comando chmod:
sudo chmod 777 /var/www/html 

Sin embargo esta solución no es la mejor en términos de seguridad, ya que le estamos dando permisos de lectura y escritura a cualquier usuario del sistema, dando la posibilidad de que cualquiera pueda modificar los archivos de nuestras aplicaciones con o sin autorización.

Una solución más segura es cambiar el propietario de la carpeta /var/www/html para que seamos nosotros mismos a través de nuestra cuenta de usuario. Suponiendo que nuestra cuenta es "webmaster", usando el comando chown podemos cambiar el propietario así:

sudo chown webmaster /var/www/html

Así podremos acceder de forma remota mediante FTP o SSH por ejemplo, haciendo uso de nuestra cuenta de usuario con la posibilidad de leer y escribir datos.

miércoles, 25 de febrero de 2015

Configurar un servidor FTP con protfpd en Linux

Supongamos que tenemos un servidor sobre Linux en el que por alguna circunstancia necesitamos subir y descargar archivos, por ejemplo un entorno de desarrollo. Una manera de satisfacer esta necesidad es implementar el servicio FTP cuya simpleza permite un rápido despliegue.

Para configurar el servicio en FTP en Linux podemos recurrir a ProTFPD, un servidor de código abierto para sistemas UNIX como Linux, BSD, AIX, y similares. Entre sus características podemos destacar que es muy configurable, que brinda la posibilidad de implementar servidores FTP anónimos, con autenticación, host virtuales,  entre otras características propias de este servicio.

Para instalar ProFTPD en una distribución Linux tipo Debian como Ubuntu por ejemplo, solo basta con seguir los siguientes pasos.

Primero instalamos proftpd con apt:

sudo apt-get install proftpd

Dado que el servicio FTP por diseño es inseguro puesto que la información viaja sin encriptación, lo ideal es añadirle una capa de seguridad con TSL. Para implementarlo nos ubicamos en el directorio /ect/proftpd:

cd /etc/proftpd

Y desde allí creamos una clave usando openssl:

openssl req -new -x509 -days 365 -nodes -out ftpd-rsa.pem \
   -keyout ftpd-rsa-key.pem

Una vez creada la clave abrimos el archivo de configuración del servicio con un editor de textos, por nano:

sudo nano /etc/proftpd/proftpd.conf

Y en él añadimos las siguientes líneas:

<ifmodule mod_tls.c="">
   TLSEngine on
   TLSLog /var/log/proftpd-tls.log
   TLSProtocol TLSv1

   # Are clients required to use FTP over TLS when talking to this server?
   TLSRequired off

   TLSRSACertificateFile    /etc/proftpd/ftpd-rsa.pem
   TLSRSACertificateKeyFile /etc/proftpd/ftpd-rsa-key.pem
   

   # Authenticate clients that want to use FTP over TLS?
   TLSVerifyClient off
</ifmodule>

Con esto ya tenemos un servicio FTP funcional. Podemos probarlo usando un cliente FTP, como Filezilla por ejemplo, ingresando como datos de conexión:

  • Servidor: IP o hostname de nuestro servidor
  • Usuario: login con el que nos autenticamos en el servidor
  • Clave: clave con la que nos autenticamos en el servidor
  • Protocolo: SFTP ya que implementamos TSL, en caso de no implementarlo FTP simple.

Por ejemplo:

Configuración SFTP en Filezilla
Configuración SFTP en Filezilla

Al conectarnos ya tendremos acceso a los directorios del servidor y podremos subir y descargar archivos.

Otra buena practica es limitar los directorios a los que un usuario tiene acceso, para ellos solo basta con modificar o descomentarear la siguiente línea:

DefaultRoot                    ~

Teniendo en cuenta que la ~ hace referencia al directorio home del usuario, esta línea esta limitando a los usuarios a acceder solamente a sus carpetas de usuario. Para mi caso por ejemplo, al ser un servidor web de desarrollo limito el acceso a mi cuenta de usuario (juancho) al directorio de las páginas de Apache (/var/www) así:

DefaultRoot /var/www/html juancho

Finalmente no está demás tener en cuenta algunas buenas practicas al momento de implementar un servicio FTP en nuestra red:


  1. No exponer datos sensibles
  2. Implementar acceso anónimo solo si es estrictamente necesario.
  3. Exponer el servicio a internet sólo si es necesario, teniendo en cuenta medidas de seguridad como limitar el acceso a directorios del sistema, hacer uso de host virtuales, implementar mecanismos de autenticación más fuertes, entre otras.
  4. Implementar mecanismos de encriptación en el servicio a fin de dificultar la interceptación de los datos que se transmiten.
Para más información de ProFTPD y de como extender sus capacidades no está demás consultar su documentación oficial.