miércoles, 26 de mayo de 2010

Control de usuarios personalizado con Apache y mod_authnz_external

Apache Software Foundation

A medida que pasa el tiempo me convenzo más de que es correcto separar la lógica de autentificación de los usuarios y el código de las aplicaciones web. En este artículo explicaré una alternativa para delegar estas tareas al servidor Apache, pero sin tener que escribir un nuevo módulo. Por fortuna existen muchas extensiones de propósito específico para hacer esto. Un ejemplo notable es mod-auth-pam, el cual expande las posibilidades pues se aprovecha toda la flexibilidad que ofrece la arquitectura Pluggable Authentication Modules. Pero por ejemplo, ¿qué hacer si ya tenemos una aplicación que brinda acceso a los usuarios de una forma muy particular y queremos reutilizar en nuevas aplicaciones ese método y los mismos datos? Continúe leyendo este artículo y encontrará la vía de solución. Notará que la configuración es relativamente fácil de hacer en sistemas GNU/Linux como Ubuntu . No olvide suscribirse a este blog si desea conocer más trucos del mundo de la informática.

¿Qué es mod_authnz_external?

Existen muchas extensiones de propósito específico para validar la identidad de los usuarios. La lista incluye a authn_alias, authn_anon, authn_dbd, authn_dbm, authn_default, authn_file, authnz_ldap, authz_dbm, authz_default, authz_groupfile, authz_host, authz_owner, authz_user, mod-auth-kerb, mod-auth-mysql, mod-auth-pgsql, mod-auth-plain, authcassimple-perl, authenntlm-perl, mod-auth-cas, mod-auth-openid, mod-auth-radius, mod-auth-sys-group, mod-authn-sasl, mod-authnz-external, mod-authz-unixgroup, webauth. El módulo mod_authnz_external es un módulo de Apache que permite autenticar los usuarios contra servicios externos. Sus ventajas consisten en que se puede utilizar para construir rápidamente infraestructuras de este tipo que sean seguros y fiables. Sin embargo hay que ser muy cuidadosos pues, si se utiliza mal, puede ser una fuente de vulnerabilidades. Esto se debe a que se delega todo el trabajo a un proceso externo que ejecuta un script configurado para este próposito. Además, debido a su diseño, no siempre es posible utilizarlo junto con autentificación del tipo Digest. Por tal razón frecuentemente se necesitaría transmitir las claves como texto plano. Una solución a este problema sería utilizar SSL. Pero, bueno, vayamos al grano ...

Seguridad web basada en los usuarios del sistema

Una de las aplicaciones más notables de este módulo es poder reutilizar la base de datos de usuarios locales del sistema para proteger una aplicación web, sin tener que exponer el fichero shadow. Para eso utilizaremos pwauth. Solo con unas pocas líneas ya es posible saber lo que hace

$ sudo apt-get install pwauth
$ sudo pwauth
myuser
mypassword
$ echo $?
0
$ sudo pwauth
myuser
wrong_password
$ echo $?
1

Como se puede observar el programa lee el usuario y la contraseña desde la entrada estándar y facilita el resultado a través del código de retorno del proceso (el valor 0 indica que los datos son correctos). Para ilustrar el resto del proceso, supongamos que tenemos una instancia de Trac corriendo con FastCGI. Para utilizaríamos unas líneas como las que aparecen a continuación:

ScriptAlias /trac /var/lib/trac/share/cgi-bin/trac.fcgi
<Location "/trac">
  Order allow,deny
  Allow from all
</Location>
ApacheConf

Para lograr nuestro objetivo solo debemos instalar el módulo y habilitarlo.

$ sudo apt-get install libapache2-mod-authnz-external
$ sudo ln -s /etc/apache2/mods-available/authnz_external.load /etc/apache2/mods-enabled/authnz_external.load

Luego procedemos a modificar el archivo de la siguiente forma.

# Registrar el método 'unix' para ejecutar `pwauth` e 
# interactuar a través de la entrada y salida estándar
DefineExternalAuth unix pipe /usr/sbin/pwauth   

ScriptAlias /trac /var/lib/trac/share/cgi-bin/trac.fcgi
<Location "/trac">
  Order allow,deny
  Allow from all

  # Autentificación básica
  AuthType Basic

  # Utilice un valor de su preferencia
  AuthName "swl"

  # El módulo `authnz_external` se hará cargo
  # de verificar la identidad de los usuarios
  AuthBasicProvider "external"

  # Para esta aplicación se utilizará el script identificado como 
  # 'unix' (ver la directiva `DefineExternalAuth` más arriba ;o)
  AuthExternal "unix"

  # Proteger el sitio (denegar acceso anónimo)
  require valid-user
</Location>
ApacheConf

¡Es así de simple! Espero que les sea útil en su quehacer cotidiano. Le sugiero suscribirse a este blog pues en próximos artículos podrán conocer cómo escribir su propio utilitario para validar los nombres de usuarios y las contraseñas.

No hay comentarios:

Publicar un comentario