Configuración de Acceso y Redirección en Apache

Acceso Privilegiado por Directorios

Por lo general el acceso privilegiado a ciertas secciones de un sitio en Internet no están en amplio uso, y una de las principales razones de esta situación es que la mayoría de los sistemas de acceso están diseñados alrededor de una base de datos que mantenga nombres de usuarios y contraseñas , además de esto es necesario diseñar el sitio con aplicaciones de servidor que sean capaces de utilizar esta información de acceso, generalmente JSP (Java Server Pages),Servlets, ADP (Aol Dynamic Pages) o ASP (Active Server Pages) de Microsoft.

Si bien es costoso mantener una base de datos ya sea por administrarla o bien por requerir de un proveedor de servicios con bases de datos, el desarrollar un sitio alrededor de tecnologías orientadas a programación (JSP,Servlets,ADP's u otra tecnología ) a diferencia de HTML con fotografías GIF/JPEG eleva su tiempo de desarrollo posiblemente hasta 5 veces más, por lo tanto si solo requiere permitir el acceso privilegiado de ciertos documentos HTML a sus 15 o 30 clientes, el utilizar este tipo de tecnologías de acceso seria no solo excesiva sino muy costosa , Apache ofrece una alternativa con su módulo mod_auth .

Si ejecuta el comando httpd -l como usuario raíz debe observar el módulo mod_auth en la lista, si no se encuentra tendrá que recompilar Apache para utilizar este módulo (Vea Módulos en Apache ).

.htpasswd

En las instalaciones que utilizan el módulo mod_auth debe existir un archivo que contenga los nombres y contraseñas de los usuarios que utilizarán el servicio de acceso privilegiado, por lo general este archivo es llamado .htpasswd , aunque si así lo desea puede llamarlo de cualquier otra forma como observará a continuación.

Este archivo esta compuesto de una forma muy sencilla que se muestra a continuación :

exportacion:grfw345Lsd9zM
importacion:efv2dg05234bl
clientes:3fvswe5TCdvAz

Consiste del nombre del usuario y la contraseña que será utilizada para el acceso, para generar este archivo (.htpasswd) se utiliza el comando htpasswd ofrecido por Apache. El comando se utilizaría de la siguiente manera: htpasswd -c /webroot/osmosis/www/.htpasswd daniel , la ejecución de este comando genera el archivo .htpasswd bajo el directorio /webroot/osmosis/www/ del sistema y agrega el usuario daniel .

Una vez ejecutado este comando se solicitará la contraseña que utilizará el usuario; el uso del parámetro -c indica que debe generarse el archivo, si después agrega usuarios a este archivo omita el parámetro -c ya que sobre-escribirá el archivo existente si no lo hace.

El archivo .htaccess

Una vez existiendo el archivo con usuarios y contraseñas en el sistema, solo es cuestión de definir el acceso por directorio, para esto se utiliza un archivo llamado .htaccess que residirá bajo el directorio que se intenta proteger con contraseña, esto es , cada vez que Apache reciba una solicitud revisara si existe un archivo con nombre .htaccess ; cabe señalar que en ocasiones no es utilizado el nombre .htaccess para este archivo, muchos administradores de sistemas cambian este nombre debido al uso extenso de .htaccess ,pero esto solo es medida de seguridad. El parámetro AccessFileName dentro del archivo de configuración Apache (httpd.conf), indica el nombre del archivo que debe ser buscado para controlar el acceso a un directorio, que como se mencionó toma un valor "default" de .htaccess

Suponiendo que desea restringir el acceso a un Directorio-Web,proyectos (www.osmosislatina.com/proyectos), debe colocar un archivo llamado .htaccess bajo este subdirectorio, esto no solo restringirá el acceso al directorio proyectos sino también a todo aquel bajo proyectos , nótese que .htaccess debe iniciar con ". (punto)" para que no sea visible en el directorio, un archivo .htaccess puede ser el siguiente:

AuthName "Zona de Proyectos de Osmosis Latina"
AuthType Basic 
AuthUserFile  /webroot/osmosis/www/.htpasswd
require user importacion

El parámetro AuthName indica un mensaje que debe ser desplegado en la ventana que solicita la autorización, AuthType siempre toma un valor Basic (tipo único), mientras que AuthUserFile indica la ubicación del archivo que contiene los nombres y contraseñas del sistema (definido anteriormente) y la ultima linea require user importacion especifica el usuario que tendrá acceso a este directorio; inclusive este ultimo renglón puede incluir varios usuarios: require user importacion clientes,sin embargo, si se van agregar varios usuarios es más conveniente agruparlos de la siguiente manera.

El archivo .htgroup

Este archivo similar a .htaccess define grupos de usuarios que están definidos dentro de .htaccess , su forma es la siguiente:

mexico: exportacion importacion clientes
us: clientes tramites 
brasil: importacion manufactura finanzas

Una vez definido el archivo .htgroup es posible utilizarlo dentro de cualquier archivo .htaccess , un ejemplo a continuación.

AuthName "Zona de Proyectos de Osmosis Latina"
AuthType Basic 
AuthUserFile  /webroot/osmosis/www/.htpasswd
AuthGroupFile /webroot/osmosis/www/.htgroup
require group mexico

A diferencia del .htaccess anterior, se incluye un linea nueva que indica la ubicación del archivo .htgroup , además se modifica la última linea con el parámetro group ; este archivo permitirá el acceso a los usuarios pertenecientes al grupo mexico(exportacion importacion clientes).

Redireccionar requisiciones al nivel de Servidor

Es casi un hecho que conforme crece un sitio en Internet, la estructura del mismo cambiara drásticamente, estos cambios presentan un serio problema administrativo que en una gran cantidad de ocasiones es desatendido o bien tratado de una manera muy deficiente.

El mayor problema que presenta el cambio de estructura para un sitio es el surgimiento de links muertos: los afamados 404 Document Not Found , estos errores con el cambio de estructura son casi inevitables por dos razones:

La forma más común de solucionar este problema hoy en día es substituyendo la página antigua por otra página que re-direccione al usuario a la nueva locación, sin embargo, esto no solo es ineficiente con mensajes como: En unos segundos más será enviado a otro lugar , sino eventualmente puede ser un carga administrativa substancial, aunque claro, es preferible esto a recibir un error.

Es posible agregar al servidor un mapa de direcciones, para que este realice el redireccionamineto internamente, esto no solo eficientiza el procesar la requisición sino también aisla al usuario final ya que no percibe tal cambio. A su vez es posible mantener este mapa sobre cualquier cambio en un archivo central, limitando la carga administrativa, para este funcionamiento es utilizado el módulo mod_rewrite de Apache.

Módulo mod_rewrite

Al igual que el módulo mod_auth debe verificar que mod_rewrite este disponible , si ejecuta el comando httpd -l como usuario raíz debe observar el módulo mod_rewrite en la lista, si no se encuentra tendrá ; que recompilar Apache para utilizar este módulo (Vea Módulos en Apache ).

La configuración básica de mod_rewrite es relativamente directa, suponga que la página principal del sitio ha cambiado de index.htm a home.htm, a través de mod_rewrite se realiza esta redirección agregando las siguientes lineas al archivo principal de Apache (httpd.conf):

RewriteEngine on 
RewriteLogLevel 0 
RewriteRule  ^http://www\.redireccion\.com/index\.htm$  home.htm  [R]

La primer linea indica que el módulo mod_rewrite sea activado, el segundo parámetro es utilizado para indicarle a Apache que no debe ser generado ningún tipo de registro ("log") para las redirecciones realizadas; la tercer linea representa la regla para realizar la redirección y es descrita continuación.

El parámetro RewriteRule indica el inicio de una regla de redirección, la primer definición representa el URL ("Universal Resource Locator") que será; redireccionado donde la descripción de éste URL es definido a través de Regular Expression. El signo ^ indica el inicio del URL mientras $ indica el final, el uso del "backslash" (\) representa un escape para indicar un punto (.) literalmente; el uso de los signos anteriores es parte de regular expressions y no de Apache. Una vez definido el regular expression se define el archivo de redirección, en este caso home.htm. Las definiciones anteriores son suficientes para realizar la redirección, sin embargo, el uso del parámetro [R] permite que el URL regresado al navegador ("Netscape" o "Explorer") despliegue el URL nuevo, esto es, si se omite [R] el usuario final seguirá observando el URL http://www.redireccion.com/index.htm (con el contenido de home.htm por supuesto) y al agregarse [R] el usuario observará http://www.redireccion.com/home.htm, las implicaciones de utilizar [R] generalmente son sobre algún "bookmark" que pudo haber definido el usuario final en su navegador ("Explorer" o "Netscape").

En dado caso que todos los archivos principales de directorio en un sitio hubieran cambiado de nombre, se definiría el renglón RewriteRule de la siguiente manera:

RewriteRule  index\.htm$  home.htm  [R]

La definición anterior redirecciona todo archivo terminado en index.htm a otro llamado home.htm, lo anterior demuestra la gran flexibilidad de mod_rewrite. El uso de mod_rewrite no sólo puede ser llevado acabo al nivel global de Apache, esto es, en el archivo httpd.conf, sino que sus parámetros también pueden ser colocados dentro de las definiciones de Virtual Hosts , en los .htaccess utilizados en mod_auth , por directorios, etc; lo anterior permite que el redireccionamiento sea llevado acabo de una forma más selectiva.

Como se mencinó al inicio, lo anterior son solo las configuraciones básicas para mod_rewrite ya que también es posible realizar redireccionamientos en base de la hora del día, balanceo de Carga (Round-Robin DNS) y otras facilidades más.