Versión 2.0 del Servidor HTTP Apache
Autentificación, Autorización y Control de Acceso
La autentificación es cualquier proceso mediante el cual se verifica que alguien es quien dice ser. La autorización es cualquier proceso por el cual a alguien se le permite estar donde quiere ir, o tener la información que quiere tener.
Módulos y Directivas relacionadas
Módulos Relacionados | Directivas Relacionadas |
---|---|
Introducción
Si en su sitio web tiene información sensible o dirigida sólo a un pequeño grupo de personas, las técnicas explicadas en éste artículo le ayudarán a asegurarse de que las personas que ven esas páginas son las personas que usted quiere que las vean.
Este artículo cubre la manera "estándar" de proteger partes de su sitio web que la mayoría de ustedes van a usar.
Los Prerrequisitos
Las directivas tratadas en éste artículo necesitarán
ir en el archivo de configuración principal de su servidor
(típicamente en una sección del tipo
<Directory>
),
o en archivos de configuración por directorios (archivos
.htaccess
).
Si planea usar archivos .htaccess
, necesitará
tener una configuración en el servidor que permita poner directivas
de autentificación en estos archivos. Esto se logra con la
directiva AllowOverride
,
la cual especifica cuáles directivas, en caso de existir, pueden
ser colocadas en los archivos de configuración por directorios.
Ya que se está hablando de autentificación, necesitará
una directiva AllowOverride
como
la siguiente:
AllowOverride AuthConfig
O, si sólo va a colocar directivas directamente en el principal archivo de configuración del servidor, por supuesto necesitará tener permiso de escritura a ese archivo.
Y necesitará saber un poco acerca de la estructura de directorios de su servidor, con la finalidad de que sepa dónde están algunos archivos. Esto no debería ser muy difícil, y trataré de hacerlo sencillo cuando lleguemos a ese punto.
Puesta en funcionamiento
Aquí está lo esencial en cuanto a proteger con contraseña un directorio de su servidor.
Necesitará crear un archivo de contraseñas. Éste
archivo debería colocarlo en algún sitio no accesible
mediante la Web. Por ejemplo, si sus documentos son servidos desde
/usr/local/apache/htdocs
usted podría querer colocar
el(los) archivo(s) de contraseñas en
/usr/local/apache/passwd
.
Para crear un archivo de contraseñas, use la utilidad
htpasswd
que viene con Apache.
Ésta utilidad puede encontrarla en el directorio bin
de cualquier sitio en que haya instalado Apache. Para crear el
archivo, escriba:
htpasswd -c /usr/local/apache/passwd/passwords rbowen
htpasswd
le pedirá la contraseña, y luego se
la volverá a pedir para confirmarla:
# htpasswd -c /usr/local/apache/passwd/passwords rbowen
New password: mypassword
Re-type new password: mypassword
Adding password for user rbowen
Si htpasswd
no está en su ruta, por supuesto
tendrá que escribir la ruta completa al archivo para ejecutarlo.
En mi servidor, éste archivo está en
/usr/local/apache/bin/htpasswd
El siguiente paso es configurar el servidor para que solicite una
contraseña y decirle al servidor a qué usuarios se les
permite el acceso. Puede hacer esto editando el archivo
httpd.conf
o usando un archivo .htaccess
.
Por ejemplo, si desea proteger el directorio
/usr/local/apache/htdocs/secret
, puede usar las siguientes
directivas, ya sea colocándolas en el archivo
/usr/local/apache/htdocs/secret/.htaccess
,
o en httpd.conf
dentro de una sección <Directory
/usr/local/apache/apache/htdocs/secret>.
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /usr/local/apache/passwd/passwords
Require user rbowen
Vamos a examinar cada una de estas directivas por separado. La
directiva AuthType
selecciona
el método que se va a usar para autentificar al usuario. El
método más común es Basic
, y éste
método está implementado en mod_auth
. Es importante
ser consciente, sin embargo, de que la autentificación Básica
envía la contraseña desde el cliente hasta el navegador sin
encriptar. Por lo tanto, este método no debería ser usado
para información altamente sensible. Apache soporta otro método
de autentificación: AuthType Digest
. Este método
está implementado en mod_auth_digest
y es mucho más
seguro. Sólo las versiones más recientes de clientes soportan
la autentificación del tipo Digest.
La directiva AuthName
establece
el Dominio (Realm) a usar en la
autentificación. El dominio (realm) cumple
dos funciones importantes. Primero, el cliente frecuentemente presenta
esta información al usuario como parte del cuatro de diálogo
para la contraseña. Segundo, es usado por el cliente para determinar
qué contraseña enviar para un área autentificada dada.
Así, por ejemplo, una vez que el cliente se haya autentificado en
el área "Restricted Files"
,
automáticamente se volverá a tratar de usar la misma
contraseña en cualquier área del mismo servidor que esté
marcado con el Dominio (Realm) "Restricted Files"
. Por lo tanto,
puede evitar que se le pida al usuario la contraseña
más de una vez permitiendo compartir el mismo dominio (realm)
para múltiples áreas restringidas. Por supuesto, por
razones de seguridad, el cliente siempre necesitará pedir de
nuevo la contraseña cuando cambie el nombre de la
máquina del servidor.
La directiva AuthUserFile
establece la ruta al archivo de contraseña que acabamos de crear
con htpasswd
. Si tiene un gran número de usuarios,
sería bastante lento buscar por medio de un archivo en texto plano
para autentificar al usuario en cada solicitud. Apache también tiene
la capacidad de almacenar la información del usuario en
archivos rápidos de bases de datos. El módulo mod_auth_dbm
proporciona la directiva AuthDBMUserFile
. Estos archivos pueden
ser creados y manipulados con el programa
dbmmanage
. Muchos otros tipos
de opciones de autentificación están disponibles en módulos
de terceras partes en la Base de
datos de Módulos de Apache.
Finalmente, la directiva Require
proporciona la parte de la autorización del proceso estableciendo
el usuario al que se le permite acceder a ese área del servidor.
En la próxima sección, discutimos varias formas de usar la
directiva Require
.
Permitir el acceso a más de una persona
Las directivas anteriores sólo permiten que una persona
(específicamente alguien con un nombre de usuario de
rbowen
) acceda al directorio. En la mayoría de los
casos, usted querrá permitir el acceso a más de una persona.
Aquí es donde entra la directiva AuthGroupFile
.
Si desea permitir la entrada a más de una persona, necesitará crear un archivo de grupo que asocie nombres de grupo con una lista de usuarios perteneciente a ese grupo. El formato de este archivo es muy sencillo, y puede crearlo con su editor favorito. El contenido del archivo será parecido a este:
GroupName: rbowen dpitts sungo rshersey
Esto es solo una lista de miembros del grupo escritos en una línea separados por espacios.
Para agregar un usuario a un archivo de contraseñas ya existente, escriba:
htpasswd /usr/local/apache/passwd/passwords dpitts
Obtendrá la misma respuesta que antes, pero el nuevo usuario será agregado
al archivo existente, en lugar de crear un nuevo archivo.
(Es la opción -c
la que se cree un nuevo archivo
de contraseñas).
Ahora, necesita modificar su archivo .htaccess
para que
sea como el siguiente:
AuthType Basic
AuthName "By Invitation Only"
AuthUserFile /usr/local/apache/passwd/passwords
AuthGroupFile /usr/local/apache/passwd/groups
Require group GroupName
Ahora, cualquiera que esté listado en el grupo GroupName
,
y figure en el archivo password
, se le permitirá
el acceso, si escribe la contraseña correcta.
Existe otra manera de permitir entrar a múltiples usuarios que es menos específica. En lugar de crear un archivo de grupo, puede usar sólo la siguiente directiva:
Require valid-user
Usando eso en vez de la línea Require user rbowen
,
le permitirá el acceso a cualquiera que esté listado en el
archivo de contraseñas y que haya introducido correctamente su
contraseña. Incluso puede emular el comportamiento del grupo
aquí, sólo manteniendo un archivo de contraseña para
cada grupo. La ventaja de esta técnica es que Apache sólo
tiene que verificar un archivo, en vez de dos. La desventaja es que
usted tiene que mantener un grupo de archivos de contraseña, y
recordar referirse al correcto en la directiva AuthUserFile
.
Posibles Problemas
Por la manera en la que la autentificación básica está especificada, su nombre de usuario y contraseña debe ser verificado cada vez que se solicita un documento del servidor. Incluso si está recargando la misma página, y por cada imagen de la página (si vienen de un directorio protegido). Como se puede imaginar, esto retrasa un poco las cosas. El retraso es proporcional al tamaño del archivo de contraseña, porque se tiene que abrir ese archivo, y recorrer la lista de usuarios hasta que encuentre su nombre. Y eso se tiene que hacer cada vez que se cargue la página.
Una consecuencia de esto es que hay un límite práctico de cuántos usuarios puede colocar en un archivo de contraseñas. Este límite variará dependiendo del rendimiento de su equipo servidor en particular, pero puede esperar observar una disminución una vez que inserte unos cientos de entradas, y puede que entonces considere un método distinto de autentificaciên.
¿Qué otra cosa sencilla y efectiva puedo hacer?
La autentificación por nombre de usuario y contraseña es sólo parte del cuento. Frecuentemente se desea permitir el acceso a los usuarios basandose en algo más que quiénes son. Algo como de dónde vienen.
Las directivas Allow
y
Deny
posibilitan permitir
y rechazar el acceso dependiendo del nombre o la dirección de la
máquina que solicita un documento. La directiva Order
va de la mano con estas dos, y le
dice a Apache en qué orden aplicar los filtros.
El uso de estas directivas es:
Allow from address
donde address es una dirección IP (o una dirección IP parcial) o un nombre de dominio completamente cualificado (o un nombre de dominio parcial); puede proporcionar múltiples direcciones o nombres de dominio, si lo desea.
Por ejemplo, si usted tiene a alguien que manda mensajes no deseados a su foro, y quiere que no vuelva a acceder, podría hacer lo siguiente:
Deny from 205.252.46.165
Los visitantes que vengan de esa dirección no podrán ver el contenido afectado por esta directiva. Si, por el contrario, usted tiene un nombre de máquina pero no una dirección IP, también puede usarlo.
Deny from host.example.com
Y, si le gustaría bloquear el acceso de un dominio entero, puede especificar sólo parte de una dirección o nombre de dominio:
Deny from 192.101.205
Deny from cyberthugs.com moreidiots.com
Deny from ke
Usar Order
le permitirá
estar seguro de que efectivamente está restringiendo el acceso
al grupo al que quiere permitir el acceso, combinando una directiva
Deny
y una Allow
:
Order deny,allow
Deny from all
Allow from dev.example.com
Usando sólo la directiva Allow
no haría lo que desea, porque
le permitiría entrar a la gente proveniente de esa máquina, y
adicionalmente a cualquier persona. Lo que usted quiere es dejar entrar
sólo aquellos.
Más información
También debería leer la documentación de
mod_auth
y mod_access
que
contiene más información acerca de cómo funciona todo esto.