lunes, 29 de septiembre de 2014

Integrar Latch en Python

Espero que conozcáis Latch, y si no estáis tardando. Es un excelente método para proteger nuestras cuentas de accesos no autorizados. Se puede implementar en una web, en una aplicación de escritorio, en el propio proceso de logado de usuarios de algunos sistemas operativos, y en general es aplicable a cualquier sistema que ideemos y que sea susceptible de proteger ante eventuales ataques.
Una buena fuente para aprender sobre Latch y seguridad en general es el blog Un informático en el lado del mal.
Como para otros muchos lenguajes y plataformas, Latch tiene una librería para poderse usar desde Python. Con tan solo descargar el fichero latch.py e importarlo en nuestra aplicación Python, podemos usarlo.
Lo primero de todo es darse de alta en la web de Latch como desarrollador. Se hace de forma gratuita. Obtendremos una Latch APP ID y un Latch Secret.

Parear una cuenta de usuario con nuestra aplicación

El proceso de parear un usuario con una aplicación se inicia generando un código aleatorio por parte del usuario, mediante la aplicación para móvil de Latch. En nuestro ejemplo será 92Us26.
El siguiente script Python corresponde al proceso de emparejar un usuario con nuestra aplicación:
# -*- coding: latin-1 -*-

import sys, latch

LATCH_APP_ID = '55HAbMdwQRRS6421AAxZ'
LATCH_SECRET = 'EDadxfiyuyjgfdferRG43658HGEWTRtZ3254VMhE'

usuario = sys.argv[1]
codigo  = sys.argv[2]

latcheo = latch.Latch(LATCH_APP_ID, LATCH_SECRET)
response = latcheo.pair(codigo)
cuenta_latch = str(response.get_data()['accountId'])

print cuenta_latch
La ejecución del script anterior sería de este modo:
$ python parear.py user01 92Us26
ebbcf87d97174f0e397e3a42b2a86ca0e34627e5345f817446eefba348550a82
Como se aprecia, tras el pareo nuestra aplicación se queda con el ID del pestillo que se acaba de crear. En este caso, a modo de ejemplo, se imprime por pantalla. Lo ideal es que nuestra aplicación almacene en una base de datos que el usuario user01 tiene como ID del pestillo de inicio de sesión ebbcf87d97174f0e397e3a42b2a86ca0e34627e5345f817446eefba348550a82.

Comprobar el estado del pestillo de un usuario

Una vez que se ha creado el pestillo, el siguiente paso es conocer la forma de consultar su estado (abierto o cerrado). De esta forma, cuando el usuario (o un atacante) introduzca ese login y su contraseña correcta, la aplicación consultará el estado del pestillo. Si está abierto, la aplicación logará al usuario con normalidad. Si está cerrado, la aplicación devolverá el mensaje de usuario o contraseña incorrectos.
A continuación se muestra un pequeño script para consultar el estado del pestillo (en la práctica lo suyo es obtenerlos de la base de datos):
# -*- coding: latin-1 -*-

import sys, latch

LATCH_APP_ID = '55HAbMdwQRRS6421AAxZ'
LATCH_SECRET = 'EDadxfiyuyjgfdferRG43658HGEWTRtZ3254VMhE'

latchuserid  = sys.argv[1]

latcheo = latch.Latch(LATCH_APP_ID, LATCH_SECRET)
response = latcheo.status(latchuserid)
if response.get_data()['operations'][LATCH_APP_ID]['status'] == 'on':
    print 'Acceso permitido'
else:
    print 'Acceso denegado'
La ejecución del script sería:
$ python comprobar.py
ebbcf87d97174f0e397e3a42b2a86ca0e34627e5345f817446eefba348550a82
Acceso denegado
¿Cómo has usado Latch en tu aplicación? ¿Qué usos le has dado? ¡Deja tu comentario!

miércoles, 24 de septiembre de 2014

Comandos útiles para pgpool-II

Pgpool-II es un middleware entre clientes y servidores PostgreSQL que permite montar un sistema de réplica. Si no lo conocéis os aconsejo que le echéis un vistazo. Es muy interesante y cubre necesidades que otros métodos de réplica sobre PostgreSQL no abordan.

Un aspecto negativo de este proyecto es que no hay demasiada documentación. A continuación indico algunos comandos que facilitan la administración del cluster y permiten conocer el estado de pgpool-II:

Conocer el número de conexiones disponibles

Es necesario saber cuántas conexiones hay disponibles para los clientes con el propósito de anticiparse a un 100% de uso y por tanto a no aceptar nuevas conexiones.

ps -ef | grep "wait for connection request" | grep -v grep | grep -v PCP | wc -l
3030

Conocer el número de conexiones usadas por un equipo

Cuando se usan librerías de terceros para conectar una aplicación a una base de datos, como Hibernate, no se sabe a ciencia cierta cuántas conexiones abre contra pgpool-II. Esta métrica permite conocer mejor el uso que hacen estas librerías de las conexiones y posibilita saber cuántos clientes podemos tener conectados al mismo tiempo.

ps -ef | grep -E "pgpool: .*192.168.46.6" | grep -v grep | wc -l

Ver el estado de los nodos configurados en el cluster

En pgpool-II cada nodo PostgreSQL añadido al cluster puede estar en uno de estos tres estados:
  1. Nodo marcado como válido y sobre el que pgpool no ha escrito desde que se marcó con este estado.
  2. Nodo marcado como válido y sobre el que pgpool ya ha realizado escrituras.
  3. Nodo fuera de servicio, bien porque esa máquina está apagada, no tiene PostgreSQL en ejecución o sí lo está pero no tiene sus datos sincronizados con el resto de servidores válidos.

Dado que el log de pgpool-II tiene bastante verbosidad, la mejor forma de ver el estado de los servidores es el siguiente:

# tail -f /var/log/pgpool.log | grep "DB node"


Poco a poco iré poniendo más trucos sobre Pgpool-II, pues pueden resultar muy útiles para los que se inician en este mundo.