martes, 25 de enero de 2011

Autenticación básica en Apache con Ubuntu

image
Hasta ahora hemos visto cómo montar nuestro sitio web permitiendo, o bien acceso público al mismo o bien usando autenticación LDAP. En este artículo explicaré como restringir el acceso a determinadas carpetas de nuestro sitio –o al sitio entero- empleando las posibilidades de autenticación básicas incorporadas en Apache.

1.- Montando un sitio de Acceso público

Para hacerlo, en primer lugar debemos tener creado un sitio web, en mi caso www.mczones.es al que se puede acceder públicamente. A continuación os copio la configuración básica del sitio antes de realizar ninguna modificación:
Fichero /etc/apache2/sites-available:
image

He creado una entrada en el fichero /etc/hosts para la realización de pruebas de tal modo que www.mczones.es apunte a la 127.0.0.1
image

Recargamos/reiniciamos apache para comprobar que el sitio por defecto funciona:
/etc/init.d/apache2 reload
/etc/init.d/apache2 restart

Finalmente comprobamos que todo está funcionando normalmente
image

2.- Configurando una zona de acceso privado

Una vez que nuestro sitio web está funcionando vamos a crear una carpeta a la que sólo daremos acceso a usuarios autenticados empleando la autenticación básica proporcionada por apache.

Para ello, en primer lugar crearemos la carpeta en la que queramos restringir el acceso a determinados usuarios:
mkdir /var/www/mczones/privado

A continuación debemos crear el fichero dónde se almacenarán los usuarios y contraseñas de los usuarios que tendrán acceso a la zona restringida. Para ello, en primer lugar nos crearemos una carpeta (fuera de nuestro sitio web) en la que crearemos el fichero:
mkdir /etc/apache2/mczones

Dentro de ella creo el fichero de contraseñas y ya añado el usuario juan:
htpasswd -c /etc/apache2/mczones/passwords juan
Me pedirá la  contraseña para el usuario:
image


Una vez hecho nos vamos al fichero de configuración de nuestro sitio web –en /etc/apache2/sites-available/mczones -  y añadimos los parámetros necesarios para permitir la autenticación.

En primer lugar hemos de insertar la directiva que nos permita modificar/añadir los parámetros de configuración de acceso:
AllowOverride AuthConfig

Posteriormente añadimos el directorio que queremos hacer de uso restringido especificando los permisos que van a tener los usuarios, el lugar dónde guardamos el fichero con los passwords encriptados (fuera de nuestro sitio web, por favor) y a qué usuarios o grupos de usuarios vamos a permitir el acceso. Un ejemplo completo del fichero podría ser:

NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin webmaster@mczones.es
ServerName www.mczones.es
ServerAlias mczones.es
DirectoryIndex index.html
DocumentRoot /var/www/mczones/
<directory />
Options FollowSymLinks
AllowOverride None
</directory>
<directory /var/www/mczones>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</directory>
<directory /var/www/mczones/privado>
AllowOverride AuthConfig
AuthType Basic
AuthName "Acceso restringido a alumnos A Carballeira"
# (La siguiente línea es opcional)
AuthBasicProvider file
AuthUserFile /etc/apache2/mczones/passwords
Require user juan
Order allow,deny
Allow from all
</directory>
UseCanonicalName off
</VirtualHost>
Tras guardar las modificaciones reiniciamos/recargamos apache y comprobamos que todo ha ido bien:
/etc/init.d/apache2 reload
/etc/init.d/apache2 restart

Si ahora intentamos acceder a nuestra carpeta “restringida” veremos que nos pide un usuario y contraseña (OJO QUE IRÁN EN TEXTO PLANO POR LA RED SI NO EMPLEAMOS CERTIFICADOS/HTTPS) y tras introducir los usuarios correctos nos dará acceso a la carpeta:
image

image

*Para  añadir nuevos usuarios emplear htpasswd sin el parámetro –c o eliminaremos el fichero anterior y crearemos uno nuevo.

2.1 Creación de grupos de usuarios

Si lo que queremos es restringir el acceso basándonos en grupos de usuarios, el procedimiento es muy similar:
  1. en primer lugar creamos los usuarios –añadiéndolos al fichero con htpasswd-
  2. Creamos un fichero en el mismo lugar que el anterior pero con el siguiente formato
    GroupName: juan pepe ana
  3. Empleamos también la directiva AuthGroupFile
    AuthGroupFile /usr/local/apache/passwd/groups
  4. Requerimos el uso de un grupo determinado:
    Require group GroupName
  5. En algunas versiones de apache no carga el módulo authgroup y lo deberemos habilitar "a mano": a2enmod authz_groupfile

Creo el fichero grupo, al que añado un grupo llamado Alumnos y un par de usuarios “pepe y juan”
echo “Alumnos: juan pepe” > /etc/apache2/mczones/grupo
Permito el acceso sólo a los usuarios de ese grupo, en definitiva nos quedaría:
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin webmaster@mczones.es
ServerName www.mczones.es
ServerAlias mczones.es
DirectoryIndex index.html
DocumentRoot /var/www/mczones/
<directory />
Options FollowSymLinks
AllowOverride None
</directory>
<directory /var/www/mczones>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</directory>
<directory /var/www/mczones/privado>
AllowOverride AuthConfig
AuthType Basic
AuthName "Acceso restringido a alumnos A Carballeira"
# (Following line optional)
AuthBasicProvider file
AuthUserFile /etc/apache2/mczones/passwords
AuthGroupFile /etc/apache2/mczones/grupo

Require group Alumnos
Order allow,deny
Allow from all
</directory>
UseCanonicalName off
</VirtualHost>
Otra directiva que nos simplificaría el proceso para permitir el acceso a cualquier usuario válido sería:
Require valid-user 


Enlace al resto de manuales de Linux con autenticación, LDAP,...

3. Bibliografía

http://httpd.apache.org/docs/2.2/howto/auth.html
Digest: https://help.ubuntu.com/community/Apache2WebDavDigestAUTH

1 comentario:

Anónimo dijo...

Hola.
Excelente blog, me sirve de mucho pues me estoy iniciando y me considero torpe. Es complicado.
queria hacerte una pregunta y si me puedes ayudar estaria encantado, y si no pues nada,jej. seguire el blog pk me interesa.
Como puedo hacer para que un host virtual "pepito" tenga un directorio raiz y otro directorio que solo sea accesible desde la subred del usuario.
gracias de antemano.
salu2.
mikel.