Apache

De Taquiones

Enlaces y referencias

Módulos

mod_autoindex

Este módulo permite exponer una relación de archivos y directorios desde el servidor web. Para activarlo en un directorio o localización se debe emplear la opción Indexex puesto que el módulo ya está incluído en la base del servidor.

Dispone de varias opciones que alteran la información que presenta:

<Directory /docs>
   # Activamos el listado de archivos
   Options +Indexes

   # Ancho variable para el nombre de los archivos
   IndexOptions DescriptionWidth=*
   # Mostrar antes las carpetas 
   IndexOptions FoldersFirst
   # Ordenar sin distinguir mayúsculas de minúsculas
   IndexOptions IgnoreCase

   # Archivo de cabecera en todas las páginas
   HeaderName HEADER.html

   # Descripciones alternativas a documentos concretos
   AddAlt "Documento PDF" *.pdf
</Directory>

Recetario

Forzar conexión segura

Empleando mod_rewrite se puede incluir una estrofa como la siguiente:

# redirect to https when available (thanks omen@descolada.dartmouth.edu)
RewriteEngine on
RewriteCond %{HTTPS} !^on$ [NC]
RewriteRule . <nowiki>https://%{HTTP_HOST}%{REQUEST_URI}</nowiki>  [L]

Proteger con contraseña

Incluir la siguiente estrofa en el recurso que se quiera proteger:

AuthType        Basic
AuthName        "Password Required"
AuthUserFile    /etc/apache/passwd/users
AuthGroupFile   /etc/apache/passwd/groups
Require Group   admins

crear el archivo de contraseñas de esta forma

<# htpasswd -c /etc/apache/passwd/users victor
New password:
Re-type new password:
Adding password for user victor
#

y el de grupos de esta otra:

# echo "admin: victor" >> /etc/apache/passwd/groups

Definir nombre del servidor

Emplear la directiva ServerName en la configuración principal así como en cada host virtual. En caso contrario Apache intenta una resolución inversa DNS con los resultados que pueden llegar a esperarse. De esta forma también es posible indicar el número de puerto sin ninguna duda.

 ServerName taquiones.net:80

Esto soluciona la advertencia que aparece cuando los certificados digitales (a través del campo CommonName) no coinciden con el nombre del servidor.

[Thu Nov 04 14:47:16 2010] [warn] RSA server certificate CommonName (CN) `taquiones.net' does NOT match server name!?

Incluir archivos en la configuración

Una manera sencilla y normalizada de incluir en copia archivos de configuración es emplear la directiva include:

Include /etc/apache2/sites-conf/esferas.org/[^.#]*.conf

Y de esta forma sólo se cargan los archivos cuyo nombre no comience por un punto, el carácter almohadilla (#) y tengan la extensión .conf.

Red interior y red exterior

Si un servidor Apache está situado entre la red interior (la intranet) y la red exterior (Internet) y debe servir el mismo contenido pero con diferentes configuraciones de seguridad se pueden usar secciones VirtualHost para encauzar el tráfico.

Conviene echarle un vistazo a los ejemplos para ver cuánto pueden dar de sí las diferentes combinaciones; aquí me limito a anotar un caso real.

Tenemos un wiki instalado en un ordenador fronterizo en la dirección http://example.com/wiki y queremos que sirva el mismo contenido para la intranet que para el exterior, pero en éste último caso necesitamos que esté protegido por contraseña y usuario. Es más, no queremos que la identificación se realice en claro, así que también es necesaria una conexión segura con el servidor antes de pedir las credenciales.

Dado que no queremos incluir módulos extras ni escribir programas específicos nos limitamos a establecer un par de reglas cuando se accede al directorio /wiki:

  • Si la conexión es segura siempre se solicita autentificación.
  • Si la conexión no es segura y procede del exterior siempre se redirige a una conexión segura.

Conexión en claro

La estrofa es bastante simple y se emplea mod_rewrite para verificar desde dónde llega la petición.

# Forzamos una conexión segura si la petición procede de
# fuera y quiere acceder al url /wiki
RewriteEngine   On
RewriteCond     %{REMOTE_ADDR}  !^192\.168\.0
RewriteCond     %{REQUEST_URI}  ^/wiki
RewriteRule     . https://%{HTTP_HOST}%{REQUEST_URI}  [L]

# Configuración para mediawiki
Alias /wiki /var/www/w/index.php

...

Conexión cifrada

En este caso la configuración es prácticamente la misma sólo que protegemos con contraseña el acceso al directorio principal del wiki.

Alias /wiki /var/www/w/index.php

<Directory /var/www/w>
        Options +FollowSymLinks
        AllowOverride All
        order allow,deny
        allow from all

        AuthType        Basic
        AuthName        "Acceso al wiki"
        AuthUserFile    /etc/apache2/passwd/passwords
        AuthGroupFile   /etc/apache2/passwd/group
        Require         valid-user
</Directory>

Host virtuales y redirecciones

También nos encontramos con que anteriormente el acceso al wiki se realizaba en la dirección http://wiki.example.net/, luego se trasladó a http://wiki.example.com y ahora queremos que ambas direcciones lleven al mismo sitio: http://example.com/wiki. Sin embargo no vamos a respetar la equivalencia de direcciones y los dominios de tercer nivel wiki. sólo servirán como punto de entrada a la página principal del wiki; es decir, el URL http://wiki.example.com/Hardware ya no se corresponderá con http://example.com/wiki/Hardware.

La razón de esta decisión está en la documentación de mediawiki, donde los autores aconsejan no emplear dominios específicos para el wiki por su falta de portabilidad entre instalaciones, ya que las referencias intra e inter wikis se romperían en caso de cambiar de dominio de segundo nivel.

La configuración de ambos dominios debe ser distinta a la fuerza. example.net reside en el servidor fronterizo por lo que las peticiones pueden llegarle tanto del interior como del exterior, mientras que el dominio example.com está situado en una máquina en el exterior y todos los accesos a la misma se consideran externos.

Para la máquina exterior la cuestión es simple, una configuración virtual que cubra las dos posibilidades y siempre redireccione al mismo sitio.

#
#  wiki.example.com
#

<VirtualHost *:80>
        ServerName      wiki.example.com
        ServerAdmin     webmaster@example.com

        Redirect permanent / https://example.net/wiki
</VirtualHost>

<VirtualHost *:443>
        ServerName      wiki.example.com
        ServerAdmin     webmaster@example.com

        Redirect permanent / https://example.net/wiki
</VirtualHost>

Para la configuración exterior la configuración no es mucho más complicada puesto que redireccionamos siempre hacia el dominio principal y es allí donde se realizan las diferentes comprobaciones de origen.

#
# wiki.example.net
#
<VirtualHost *:80>
        ServerName      wiki.example.net
        ServerAdmin     webmaster@example.net

        Redirect permanent / http://example.net/wiki
</VirtualHost>

<VirtualHost *:443>
        ServerName      wiki.example.net
        ServerAdmin     webmaster@example.net

        Redirect permanent / https://example.net/wiki
</VirtualHost>

Depuración de errores

Para buscar errores durante el arranque del servidor, errores graves que abortan el proceso y no dejan el rastro habitual se puede emplear lo siguiente:

Los parámetros empleados son:

  • -X: activa el modo de depuración que consiste en arrancar un único proceso trabajador (worker en la jerga) y no desacoplarse del terminal para convertirse en demonio.
  • -e debug: muestra los errores de arranque al nivel indicado.
  • -k start: activa el arranque del servidor.

Se emplea el programa auxiliar apache2ctl porque prepara el entorno correspondiente y adecuado para el servidor y dispone de ese modo transparente en el que pasa todos los parámetros recibidos al nuevo servidor.

Acceso restringido por IP dinámica

Extraído del primer enlace, la siguiente estrofa establece una forma de control dinámico según direcciones IP almacenadas en un archivo de texto plano. Este archivo se recarga cada vez que cambia su sellado de mofidicación, pero también es posible indicar un programa externo que efectúe la consulta y retorne una dirección válida.

RewriteEngine On
RewriteMap isplist txt:/path/to/whitelist.txt
RewriteCond %{REMOTE_ADDR} ^(.*)$
RewriteCond ${isplist:%1|black} ^black$ [NC]
RewriteRule (.*) - [F]

La estrofa define un mapa al que llama isplist y añade dos condiciones:

  1. Comprueba que exista una dirección IP remota
  2. Busca esa dirección (%1) en el mapa de direcciones permitidas (ignorando mayúsculas y minúsculas).

Si no la encuentra emplea el valor por defecto black y comprueba que coincida en la misma condición.

Como se han cumplido las dos condiciones la regla de reescritura finalmente emite un código 403 con el indicador F.

Comentario: Es un poco enrevesado pero hay que entender que la reescritura sólo se lleva a cabo si se han cumplido las dos condiciones anteriores. Es por eso que en la segunda fuerza a que se cumpla con el valor black y deja que las cosas fluyan.

Diferencias entre Apache 2.4 y 2.2

Control de acceso

Mezclar los dos tipos no es aconsejable pero tampoco está prohibido.

# En 2.2
Order allow,deny
Allow from all

# En 2.4
Require all granted

Cuando se combinan la autentificación y el control de acceso las diferencias son mayores:

#
# 2.2 configuration:
#
Order allow,deny
Deny from all
# Satisfy ALL is the default
Satisfy ALL
Allow from 127.0.0.1
AuthType Basic
AuthBasicProvider file
AuthUserFile /example.com/conf/users.passwd
AuthName secure
Require valid-user

#
# 2.4 configuration:
#
AuthType Basic
AuthBasicProvider file
AuthUserFile /example.com/conf/users.passwd
AuthName secure
<RequireAll>
  Require valid-user
  Require ip 127.0.0.1
</RequireAll>

En ambos casos se deben cumplir todas las condiciones: filtrado por origen y por identificación de usuario.