Saltar la navegación

Autenticación Basic

Hemos aprendido a configurar la autorización (proceso de permitir que alguien esté donde quiere estar o que tenga lo que quiere tener) de recursos a través de la directiva Require de Apache, vamos ahora a configurar la autenticación (proceso que verifica que alguien es quien dice ser).

En Apache la autenticación se puede llevar a cabo por varios métodos, y el que vamos a ver aquí se denomina Basic, implementado por el módulo mod_auth_basic incluido por defecto, el cual no es muy seguro pues tiene la debilidad de que las contraseñas se transmiten en claro por la red.

Por regla general, las directivas de configuración de la autenticación irán dentro de una directiva contenedora <Directory> o dentro de ficheros .htaccess.

Lo primero que se necesita es disponer de un fichero que funcionará como una base de datos de usuarios y contraseñas, que debe colocarse en algún lugar del sistema de ficheros al que no se pueda acceder desde la web, por ejemplo: /var/www/password o /etc/apache2/password, y en cuanto a los permisos del fichero, deberíamos asignarle la máscara 640, siendo el root el dueño y www-data el grupo.

La forma de crear este fichero depende del método de autenticación que utilicemos, y con el método Basic utilizaremos el comando htpasswd, que se instala con Apache.

La sintaxis de htpasswd es:

htpasswd [-c] fichero_bd usuario

La opción -c se utilizará solo en la primera ejecución del comando, ya que sirve para crear la base de datos, y si la usáramos una segunda vez con la misma base de datos, la sobrescribiríamos, perdiendo la información que tuviera hasta el momento.

El nombre del usuario está limitado a 255 caracteres y no puede contener el carácter dos puntos ( : ).

# htpasswd -cB /var/www/password/.usuarios-claves u1
New password:
Re-type new password:
Adding password for user u1
# htpasswd -B /var/www/password/.usuarios-claves u2
New password:
Re-type new password:
Adding password for user u2
# cat /var/www/password/.usuarios-claves
u1:$apr1$.Tq6IXwB$QCiAna9uGsMoDpvufE1x2.
u2:$apr1$Vo5gsEPP$oqOp7a7M.CiFUl1NhJFIm0

Como vemos al final, creamos un fichero de texto, donde cada línea representa a un usuario, cuyo identificador va al principio, y a continuación, separado por el carácter dos puntos ( : ), va la contraseña cifrada. El algoritmo de cifrado por defecto es el algoritmo MD5 modificado por Apache (-m), pero podríamos mejorarlo con un algoritmo mucho más seguro como bcrypt, para lo que añadiríamos la opción -B.

En el caso de que por error el mismo usuario estuviera repetido en varias líneas, la primera aparición es la que se tiene en cuenta.

A continuación, dentro de la directiva <Directory> o del fichero .htaccess, hay que poner las directivas relacionadas con la autenticación del método Basic, y estas son las siguientes:

Directiva AuthType

Sintaxis: AuthType None|Basic|Digest|Form

Contexto: directory, .htaccess

Con esta directiva establecemos el método de autenticación que vamos a utilizar, que en nuestro caso, ahora es Basic. El valor None sirve para desactivar la autenticación, lo cual será necesario si queremos desactivarla en un subdirectorio de un directorio que requiere autenticación.

Directiva AuthName

Sintaxis: AuthName ámbito-de-autorización

Contexto: directory, .htaccess

Esta directiva establece el nombre del ámbito de autorización para un directorio. Este ámbito se le proporciona al cliente para que el usuario sepa qué nombre de usuario y contraseña enviar. Las sucesivas veces que el usuario accede al mismo ámbito no se le pedirá la contraseña, de forma automática se envía el mismo usuario y contraseña. Si el mismo ámbito se repite en varios directorios, solo se pedirá el usuario y contraseña la primera vez que se acceda a uno de ellos dentro del mismo sitio web. Si ámbito-de-autorización contiene espacios, se debe entrecomillar. Con el método Basic, el valor de ámbito-de-autorización se mostrará sobre la ventana de diálogo que nos pedirá el usuario y la contraseña. Pueden utilizarse variables de las expresiones de Apache.

AuthName "Host: %{HTTP_HOST}"

O un texto normal:

AuthName "Apuntes ASIR"

Directiva AuthBasicProvider

Sintaxis: AuthBasicProvider proveedor...

Contexto: directory, .htaccess
Valor por defecto: file

Con esta directiva indicamos el módulo que va a acceder a la base de datos de usuarios y contraseñas, y dependerá de su formato. En nuestro caso, la base de datos tiene el formato que da el comando htpasswd, y eso implica que tendrá que ser accedida por el módulo mod_authn_file, por lo que tenemos que indicar file como proveedor, que al ser el valor por defecto, estrictamente no sería necesario poner esta directiva. Los proveedores pueden ser: dbm, file, dbd, ldap y socache.

Directiva AuthUserFile

Sintaxis: AuthUserFile ruta-a-fichero

Contexto: directory, .htaccess

Con AuthUserFile indicamos el fichero de texto que contiene la base de datos de usuarios y contraseñas, normalmente creado por las utilidades htpasswd (método Basic) y htdigest (método Digest). Si se pone una ruta relativa en ruta-a-fichero, será con respecto a ServerRoot.

Una última directiva que nos faltaría sería Require user para autorizar a determinados usuarios, la cual puede ser más o menos compleja, como se vio en el apartado anterior.

AuthType Basic
AuthName "Apuntes ASIR"
AuthBasicProvider file
AuthUserFile "/var/www/password/.usuarios-claves"
Require user u1 u5 u9

Podríamos haber utilizado también Require valid-user para autorizar a cualquier usuario de la base de datos.

También es posible, con el método Basic, trabajar con grupos de usuarios. Para ello necesitamos crear un fichero de texto donde cada línea representa un grupo. El formato de la línea es el siguiente:

grupo: usuario1 usuario2 usuario3 ...

donde los usuarios deben existir en el fichero de contraseñas creado con htpasswd.

Para indicar al método Basic que se van a utilizar grupos además de usuarios, se usa la directiva AuthGroupFile.

Directiva AuthGroupFile

Sintaxis: AuthGroupFile ruta-a-fichero

Contexto: directory, .htaccess

La directiva AuthGroupFile establece el nombre de un archivo de texto que contiene la lista de grupos de usuarios para la autorización de los usuarios. La ruta-a-fichero es la ruta al archivo de los grupos, y si no es absoluta, se trata como relativa a ServerRoot.

Esta directiva necesita que se habilite el módulo mod_authz_groupfile.

El último paso es utilizar Require group en conjunción con Require user, según lo que pretendamos con las autorizaciones. No es obligatorio usar la dos directivas a la vez.

<Directory ...>
...
AuthType Basic
AuthName "Apuntes ASIR"
AuthBasicProvider file
AuthUserFile "/var/www/password/.usuarios-claves"
AuthGroupFile "/var/www/password/.grupos
Require user u1 u5 u9
Require group sri sad
...
</Directory

Un problema que surge cuando se trabaja con las bases de datos de usuarios en modo texto creadas con htpasswd es que son lentas, sobre todo cuando poseen unos pocos cientos de usuarios. En estos casos, se obtiene una mejora considerable del rendimiento de Apache si se utilizan otros tipos de formatos de bases de datos, como el DBM.

En primer lugar, para crear una base de datos DBM de usuarios utilizaremos el comando htdbm. El cual posee la opción -c con el mismo sentido que con el comando htpasswd, por lo que se utilizará con el primer usuario de la base de datos, y no con el resto. Otra opción importante es -t, con la que vamos a poder, si queremos, incluir al usuario en un grupo o varios. Los grupos se incluirán al final en una lista separada por comas y sin espacios. El carácter dos puntos ( : ) no puede formar parte del nombre del grupo. También se puede usar la opción -B para que las contraseñas se cifren con el algoritmo seguro bcrypt.

La base de datos creada por htdbm se almacena en un fichero binario que puede tener cuatro diferentes formatos internos. Podemos elegir el que deseemos con la opción -T seguido del nombre del formato: SDBM, GDBM, DB, NDBM o default. Este último es el formato elegido cuando no se especifica ninguno.

# htdbm -ctB /var/www/password/.usuarios_claves_grupos_dbm u1 g1,g2
New password:
Re-type new password:
Database /var/www/password/.usuarios_claves_grupos_dbm created.
# htdbm -tB /var/www/password/.usuarios_claves_grupos_dbm u2 g1
New password:
Re-type new password:
Database /var/www/password/.usuarios_claves_grupos_dbm updated.
# htdbm -tB /var/www/password/.usuarios_claves_grupos_dbm u3 g2
New password:
Re-type new password:
Database /var/www/password/.usuarios_claves_grupos_dbm updated.

A partir de aquí intervienen las siguientes directivas:

La directiva AuthBasicProvider, que vimos anteriormente, llevará como argumento el valor dbm.

AutBasicProvider dbm

Directiva AuthDBMType

Sintaxis: AuthDBMType default|SDBM|GDBM|NDBM|DB

Contexto: directory, .htaccess
Valor por defecto: default

El valor indicado aquí debe coincidir con el formato interno elegido cuando se creó la base de datos con el comando htdbm. En el caso de haber elegido el formato default, esta directiva no sería necesario usarla.

Directiva AuthDBMUserFile

Sintaxis: AuthDBMUserFile ruta-a-fichero

Contexto: directory, .htaccess

Con esta directiva indicamos el fichero de usuarios, claves y grupos, siempre a través de una ruta absoluta, y también debemos cuidar en colocarlo fuera de cualquier DocumentRoot.

Las dos directivas anteriores precisan de la activación del módulo mod_authn_dbm.

Es posible no haber añadido ningún grupo a los usuarios cuando se crearon con htdbm, y utilizar estos, como ya vimos, a través de un fichero de texto y las directivas AuthGroupFile y Require group. Pero si hemos creado grupos en el fichero DBM, para usarlos necesitamos de las siguientes directivas que precisan de la habilitación del módulo mod_authz_dbm.

Directiva AuthDBMGroupFile

Sintaxis: AuthDBMGroupFile ruta-a-fichero

Contexto: directory, .htaccess

Con esta directiva especificamos la ruta absoluta del fichero de grupos, que será el mismo que el indicado con AuthGroupFile. Es posible crear ficheros separados, pero preferible tener uno solo.

Por último, la directiva Require admite una nueva sintaxis para autorizar mediante grupos en bases de datos DBM:

Require dbm-group grupo1...

Uniéndolo todo la directiva <Directory> podría quedar así:

<Directory ...>
    ...
    AuthType Basic
    AuthName "Apuntes ASIR"
    AuthBasicProvider dbm
    AuthDBMType default
AuthDBMUserFile "/var/www/password/.usuarios_claves_grupos_dbm"
AuthDBMGroupFile "/var/www/password/.usuarios_claves_grupos_dbm"
Require user u1 u5 u9 Require dbm-group g2
...
</Directory>