Autentificaci´on mediante PostgreSQL en Apache
ProFTPd
y
Paco Brufal
[email protected]
Versi´on: 0.2r4 2002
Este peque˜no documento explica de manera breve c´omo usar los m´odulos de autentificaci´on mediante base de
datos PostgreSQL que vienen con los servidores Apache (web) y ProFTPd (ftp). El Sistema Operativo usado
es Linux GNU/Debian Stable (aka Potato). Este documento se distribuye SIN NINGUNA GARANTIA bajo la
licencia GPL ( http://www.gnu.org ). No me responsabilizo de los posibles da˜nos que pueda causar la ejecuci´on
de los pasos descritos en este documento.
Contents
1 Introducci´on
2 Apache: m´odulo mod auth pgsql
2.1 Compilaci´on del m´odulo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Creaci´on de la base de datos.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Configuraci´on b´asica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4 Configuraci´on avanzada.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3 ProFTPd: m´odulo mod pgsql
3.1 Compilaci´on del m´odulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Creaci´on de la base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3 Configuraci´on b´asica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4 Configuraci´on avanzada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 Interfaces de administraci´on
5 Consideraciones finales
1 Introducci´on
1
2
2
4
4
6
7
7
8
8
9
10
10
Si eres administrador de un servidor web, este documento te ser´a muy util, ya que el trabajo rutinario de
mantener al dia los usuarios, grupos y contrase˜nas de la gente que accede a los recursos privados del servidor
web puede llegar a ser muy pesado, debido a que siempre hay ficheros con contrase˜nas esparcidos por todo
el directorio de p´aginas web.
En el caso de los servidores FTP, el crear un usuario que tenga acceso por FTP implica crear un usuario de
sistema, y esto tiene varios inconvenientes:
• Shell. Si no hemos configurado el fichero /etc/adduser.conf para que cree los usuarios con una
shell del tipo /bin/false, todos los usuarios tendr´an la shell por defecto, que puede ser /bin/bash
o /bin/sh, con lo que el usuario tendr´ıa acceso por telnet o ssh sin darnos cuenta.
2. Apache: m´odulo mod auth pgsql
2
• Fichero /etc/passwd descontrolado. Un sistema con 20 cuentas se administra de manera c´omoda,
pero un sistema que tiene entre 500 ´o 1000 cuentas, se hace muy pesado.
• Centralizaci´on. Si tuviesemos m´as de un servidor FTP, independientes, el administrar las cuentas de
todos ellos ser´ıa una tarea infernal. Alguno pensar´a que se podria mantener solo un fichero de claves
de usuarios, y que todos los servidores compartiesen ese fichero mediante NFS o CODA, pero esto
significa que un usuario tendr´ıa acceso a todos los servidores, cosa que posiblemente no queramos.
El uso de la autentificaci´on mediante base de datos PostgreSQL resuelve todos los inconvenientes anteriores
de una manera eficaz, c´omoda y elegante, haciendo la vida del administrador mucho m´as feliz y productiva
:D
Veamos c´omo se evitan los puntos anteriores.
• En primer lugar, al crear un usuario de web o ftp, no se crean en el sistema, sino en una base de datos
que se puede encontrar en otro servidor, y dicho usuario no tendr´a acceso mas que a los servicios que
usen la base de datos.
• En segundo lugar, la administraci´on de una base de datos siempre es m´as f´acil que un fichero de sistema,
si se disponen de las herramientas adecuadas (l´ease interfaces web o X-Window para administrar
PostgreSQL).
• Una base de datos la puedes crear y moldear a tu gusto, a˜nadiendo o quitando campos a placer, y no
te tienes que restringir a los campos del fichero /etc/passwd o /etc/shadow. Lo que me refiero es
que tanto Apache como ProFTPd permiten hacer b´usquedas selectivas dentro de la base de datos, con
lo que podemos restringir las b´usquedas a campos tales como servidor (el usuario pepito solo puede
acceder a los servidores 1 y 3), horarios (el usuario manolito solo tiene acceso al servidor 2 de 9 de la
ma˜nana a 4 de la tarde), niveles de acceso, etc.
• Y una ventaja m´as es la seguridad. La base de datos podr´ıa estar en una m´aquina distinta a la que
ofrece los servicios de web o ftp, y dedicarle una atenci´on especial al procedimiento de securizaci´on o
hardening del sistema (poner un firewall entre los servidores de web/ftp y la base de datos, no ofrecer
servicios de telnet, ssh, rlogin, etc...).
2 Apache: m´odulo mod auth pgsql
En este apartado voy a explicar de manera r´apida c´omo se configura el Apache y la base de datos Postgres.
Pondr´e las ordenes que hay que ir ejecutando y un ejemplo de los ficheros de configuraci´on. Ah´ı va :)
2.1 Compilaci´on del m´odulo.
Antes que nada, vemos si nuestro Apache viene de serie con el m´odulo mod auth pgsql. Siguiendo la
estructura de ficheros de una Debian , miramos en el fichero /etc/apache/httpd.conf si existe una linea
tal que as´ı:
LoadModule pgsql_auth_module /usr/lib/apache/1.3/mod_auth_pgsql.so
Esta linea debe estar descomentada, y el fichero debe existir. En caso que exista el fichero, pero la linea no,
escr´ıbela en la secci´on de los m´odulos y pasa al punto siguiente. Si la linea est´a comentada, pero el fichero
no existe, entonces deber´as compilarlo aparte.
2. Apache: m´odulo mod auth pgsql
3
La compilaci´on de un m´odulo no reviste ninguna complicaci´on. En primer lugar debemos bajarnos la ´ultima
versi´on disponible del sitio http://www.giuseppetanzilli.it/mod auth pgsql/dist/
. En el momento de escribir este art´ıculo, la ´ultima versi´on es la 0.9.10. Para instalar el m´odulo con ´exito,
primero debemos asegurarnos que disponemos de los siguientes paquetes (aqui los escribo con nomenclatura
Debian)
• apache
• apache-dev
• postgresql
• postgresql-clients
• postgresql-dev
Para compilar el m´odulo en una distribuci´on Debian, debemos retocar un poco el c´odigo fuente. Un cambio
consiste en cambiar en el fichero mod auth pgsql.c la linea
#include <libpq-fe.h>
por esta otra
#include <postgresql/libpq-fe.h>
El otro cambio consiste en editar el fichero /usr/bin/apxs y cambiar estas 2 lineas
my $CFG_LD_SHLIB
= q(); # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(); # substituted via Makefile.tmpl
por
= q(ld); # substituted via Makefile.tmpl
my $CFG_LD_SHLIB
my $CFG_LDFLAGS_SHLIB = q(-G); # substituted via Makefile.tmpl
Seguimos los pasos de fichero INSTALL que describen c´omo compilar el m´odulo (APXS DSO Install).
Ejecutaremos el comando
./configure --with-apxs=/usr/bin/apxs --with-pgsql=/usr/include/postgresql
para generar el fichero Makefile. Para compilar el m´odulo ejecutaremos el comando
/usr/bin/apxs -I/usr/local/pgsql/include \
-L/usr/local/pgsql/lib -lpq \
-o mod_auth_pgsql.so -c mod_auth_pgsql.c auth_pgsql_shared_stub.c
y lo instalaremos con
/usr/bin/apxs -i -a -n auth_pgsql mod_auth_pgsql.so
Debemos verificar que en el fichero /etc/apache/httpd.conf existe la linea que mencionamos al inicio de
este apartado:
LoadModule pgsql_auth_module /usr/lib/apache/1.3/mod_auth_pgsql.so
Tan solo queda reiniciar el Apache y esperar que todo haya salido bien ;)
2. Apache: m´odulo mod auth pgsql
4
2.2 Creaci´on de la base de datos.
Ahora vamos a crear la base de datos en PostgreSQL. Siendo root, ejecutamos la orden
su - postgres
para crear el usuario y la bases de datos necesarias. Debemos crear un usuario, cuyo nombre ser´a igual que
el usuario que ejecuta el servidor Apache. En el caso de Debian, el usuario se llama ”www-data”:
postgres$ createuser www-data
Enter user’s postgres ID -> 10000
Is user "www-data" allowed to create databases (y/n) n
Is user "www-data" a superuser? (y/n) y
WARNING: Any user who can add users can also modify the system catalog
createuser: www-data was successfully added
Shall I create a database for "www-data" (y/n) n
don’t forget to create a database for www-data
Seguidamente, debemos crear el fichero wwwusers.sql, que contiene:
create table usuarios (
login varchar(255),
password varchar(255)
);
create table grupos (
login varchar(255),
grupo varchar(255)
);
grant all on usuarios to "www-data";
grant all on grupos to "www-data";
Creamos la base de datos y el esquema de las tablas:
postgres$ createdb wwwusers
postgres$ psql wwwusers < wwwusers.sql
create table usuarios ( login varchar(255), password varchar(255) );
CREATE
create table grupos ( login varchar(255), grupo varchar(255) );
CREATE
grant all on usuarios to "www-data";
CHANGE
grant all on grupos to "www-data";
CHANGE
EOF
postgres$
2.3 Configuraci´on b´asica.
Ahora ya tenemos la base de datos y el usuario ”www-data”. El siguiente paso es definir el fichero .htaccess
que ir´a en cada directorio que queramos proteger. Adem´as, debemos asegurarnos que Apache est´a bien
configurado para que maneje correctamente estos ficheros. En especial nos fijaremos en las directivas
2. Apache: m´odulo mod auth pgsql
5
AllowOverride none
AccessFileName .htaccess
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>
El fichero .htaccess contiene la siguientes lineas:
# m´aquina que contiene la base de datos
Auth_PG_host localhost
# puerto tcp de conexi´on
Auth_PG_port 5432
# nombre de la base de datos
Auth_PG_database wwwusers
# nombre de la tabla de usuario
Auth_PG_pwd_table usuarios
# nombre del campo de login
Auth_PG_uid_field login
# nombre del campo de password
Auth_PG_pwd_field password
# nombre de la tabla de grupos
Auth_PG_grp_table grupos
# nombre del campo de grupo
Auth_PG_gid_field grupo
# descripci´on de la zona protegida
AuthName "Autentificaci´on de Usuario"
# tipo de autentificaci´on
AuthType basic
# limitaciones del grupo administrador
<LIMIT GET POST>
require group administrador
</LIMIT>
Explicaci´on r´apida: en esa zona pri
Comentarios de: Autentificación mediante PostgreSQL en Apache y ProFTPd (0)
No hay comentarios