sábado, 27 de diciembre de 2008

Configurar Apache 2 en Debian 4

A diferencia de Apache 1.3 que contaba con un único archivo de configuración (el mítico y añorado /etc/apache/httpd.conf), Apache 2 tiene numerosos archivos de configuración. Veamos algunas de las principales directivas de /etc/apache2/apache2.conf:

  • Información que facilita Apache sobre sí mismo. Por defecto vale Full:
    ServerTokens Full

    Y Apache da toda la información:

    Apache 2.0.4 (Debian - PHP/5.2.0-8+etch3)

    Por seguridad, mejor ponerlo a Prod para que envíe el mínimo de información:

    ServerTokens Prod
  • Datos sobre Apache en el pie de los mensajes de error. Por defecto vale On:
    ServerSignature On

    Y Apache da todos los datos:

    Apache 2.0.4 Server at 192.168.1.3 Port 80

    Por seguridad, mejor ponerlo a Off para dar el mínimo de datos:

    ServerSignature Off
  • Comportamiento del servidor cuando se produce un error. Por ejemplo, podemos configurar Apache para que redireccione a un fichero en nuestro servidor al ocurrir un Error 404. La página no existe:
    ErrorDocument 404 /info.html
  • La directiva Alias permite redireccionar a un directorio que puede estar fuera del árbol de directorios especificado en DocumentRoot. Por ejemplo, con la directiva:
    Alias /icons/ /usr/share/apache2/icons/

    si tecleamos en el browser:

    http://www.domain.com/icons/

    Apache servirá el contenido de:

    http://www.domain.com/usr/share/apache2/icons/

    Para los directorios definidos en las directivas Alias tendremos que crear una directiva Directory en la que se definan los permisos, por ejemplo:

    
    
    ...
  • La directiva userDir permite redireccionar al directorio personal del usuario si se recibe una solicitud del tipo ~usuario:
    userDir public_html

    Si tecleamos en el navegador:

    http://www.domain.com/~francis/

    el servidor accederá a:

    http://www.domain.com/home/francis/public_html/

  • La configuración general de Apache puede sobreescribirse para un directorio determinado si ubicamos en él un archivo .htaccess. La directiva AccessFileName define el nombre de ese archivo:
    AccessFileName .htacces

    Para impedir que los .htaccess puedan ser vistos por los usuarios:

    
    
    Order allow deny
    Deny from all

Otro archivo de configuración de Apache 2 es /etc/apache2/mods-enabled/dir.conf:

  • la directiva DirectoryIndex establece el archivo que busca Apache al entrar en un directorio de nuestra web. Por ejemplo, para decirle que si no encuentra index.html busque index.htm o index.cgi, en ese orden, pondremos:
    DirectoryIndex index.html index.htm index.cgi

Otro archivo más, /etc/apache2/conf.d/charset:

  • la directiva AddDefaultCharset se configura en el archivo /etc/apache2/conf.d/charset y establece qué sistemas de codificación son aceptados y cuál es el sistema por defecto. Admite tres valores:
    • para que Apache sirva la página en ISO-8859-1 sea cual sea la codificación de la página web usaremos on (es la opción por defecto):
      AddDefaultCharset on
    • usaremos para que Apache sirva la página en ese charset concreto, sea cual sea la codificación de la página web. Por ejemplo, para UTF-8:
      AddDefaultCharset utf-8
    • para que Apache sirva la página con el charset especificado en la etiqueta META de la página web usaremos off (es la opción más recomendable):
      AddDefaultCharset off

      Por ejemplo, para UTF-8, la etiqueta META será:

Configurar los hosts

Para configurar nuestro host editaremos el archivo /etc/apache2/sites-available/default. Si nuestro Apache tiene que servir varios dominios crearemos un bloque VirtualHost para cada uno de ellos, siendo el host por defecto el primer host virtual listado.

Supongamos que tenemos dos dominios (www.domain.com y www.otherdomain.com) apuntando a nuestra IP. Para cada uno de ellos existirá una sección VirtualHost, siendo www.domain.com el sitio por defecto:

NameVirtualHost *


ServerName www.domain.com
ServerAlias domain.com *.domain.com
DocumentRoot /var/www/domain
ServerAdmin webmaster@domain.com

Options SymLinksIfOwnerMatch
AllowOverride None


Options -Indexes -Includes -FollowSymLinks Multiviews
AllowOverride None
Order allow, deny
Allow from all

CustomLog /var/log/apache2/access.domain.log combined
ErrorLog /var/log/apache2/error.domain.log



ServerName www.otherdomain.com
ServerAlias otherdomain.com *.otherdomain.com
DocumentRoot /var/www/otherdomain
ServerAdmin webmaster@otherdomain.com

Options SymLinksIfOwnerMatch
AllowOverride None


Options -Indexes -Includes -FollowSymLinks Multiviews
AllowOverride None
Order allow, deny
Allow from all

CustomLog /var/log/apache2/access.otherdomain.log combined
ErrorLog /var/log/apache2/error.otherdomain.log

Examinemos algunas de las directivas que se incluyen en cada VirtualHost:

  • Nombre que el servidor utiliza para identificarse (debe figurar en el DNS). Si no tenemos un dominio registrado usaremos localhost:
    ServerName localhost

    Si tenemos un dominio registrado lo usaremos:

    ServerName www.domain.com
  • Directorio donde está la web, donde Apache busca la página por defecto (si pensamos servir varios dominios, tendremos un directorio para cada uno):
    DocumentRoot /var/www/domain
  • Email del administrador que saldrá cuando haya errores (por ejemplo, Error 404. La página no existe. Contacte con el administrador: webmaster@localhost). Si no tenemos un dominio registrado usaremos localhost:
    ServerAdmin webmaster@localhost

    Si tenemos un dominio registrado lo usaremos:

    ServerAdmin webmaster@domain.com
  • Archivo donde se guardan los logs de acceso y formato (si pensamos servir varios dominios, tendremos archivos de logs de acceso diferentes):
    CustomLog /var/log/apache2/access.domain.log combined

    La directiva LogFormat define los posibles formatos para los logs generados: (full, debug, combined, forensic, common, referer y agent).

  • Ubicación de los logs de error (si pensamos servir varios dominios, usaremos archivos de logs de error diferentes):
    ErrorLog /var/log/apache2/error.domain.log

    Tipo de mensajes que se guardarán en los logs de error (de menos a más gravedad: debug, info, notice, warn, error, crit, alert y emerg):

    LogLevel warn
  • Con la directiva Directory definimos opciones que se aplican al directorio indicado y sus subdirectorios. Lo habitual es configurar unos permisos por defecto muy restrictivos:
    
    
    Options SymLinksIfOwnerMatch
    AllowOverride None

    y posteriormente habilitar el acceso y permisos más amplios en directorios específicos. Por ejemplo, para la raíz del árbol de documentos y sus subdirectorios:

    
    
    Options -Indexes -Includes -FollowSymLinks Multiviews
    AllowOverride None
    Order allow, deny
    Allow from all
    • La opción SymLinksIfOwnerMatch sólo permite que puedan seguirse los enlaces simbólicos si el propietario del link y el del archivo apuntado es el mismo.
    • La opción FollowSymLinks permite que puedan seguirse los enlaces simbólicos. Por seguridad, esta opción la desactivamos.
    • Con la opción Indexes, si se solicita un directorio y no existe la página especificada con DirectoryIndex (index.html, index.htm, etc.), Apache mostrará el contenido del directorio.

      Es preferible desactivar esta opción con -Indexes para no arriesgarnos a que el usuario pueda acceder a archivos sensibles, de manera que Apache mostrará el mensaje de error Forbidden - You don’t have permission. Una solución sencilla muy utilizada para evitar riesgos es ubicar en los directorios que no se desea que sean mostrados un archivo index.html vacío: si alguien entra en estos directorios sólo verá una página en blanco.

      En caso de activar Indexes controlaremos la apariencia del listado con la directiva IndexOptions. Por ejemplo, para mostrar iconos (FancyIndexing) y que se muestren primero los directorios (FoldersFirstcon) pondremos:

      IndexOptions FancyIndexing FoldersFirstcon
    • La directiva AllowOverride controla qué opciones pueden sobreescribirse con un archivo .htaccess. Puede impedirse la modificación con None o permitirse con All.
    • La opción Multiviews permite negociar los contenidos con el navegador para elegir la mejor representación de acuerdo con sus preferencias (idioma, conjunto de caracteres, codificación, etc.).
    • La directiva Includes permite el uso de SSI (Server Side Includes). Las instrucciones SSI se utilizan para generar páginas dinámicas y se incluyen normalmente en ficheros con extensión .shtml. Si no utilizamos SSI es preferible desactivar esta opción con -Includes.
    • Con las directivas Order y Allow se controla el acceso al servidor utilizando el nombre de dominio o la IP del cliente. La directiva Order allow, deny determina que primero se evalúa la lista Allow y luego la Deny. La directiva Allow from all permite acceder a todo el mundo. Las directivas Allow y Deny serán similares a:
      Allow from all
      
      Allow from none
      Allow from 192.168 80.58.61.254 fransberns.com
  • Si tenemos páginas dinámicas a las que se accede pasando parámetros en la URL, pueden convertirse en URLs amistosas con la directiva RewriteRule. En primer lugar, activamos el módulo mod_rewrite sin generar logs para las redirecciones:
    RewriteEngine on
    
    RewriteLogLevel 0

    A continuación, establecemos las reglas de reescritura. Por ejemplo, con la directiva:

    RewriteRule /news/(.+) /index.php?id=$1

    cuando se solicite la página:

    http://www.domain.com/news/medicina.php

    el servidor devolverá (de forma transparente para el usuario):

    http://www.domain.com/index.php?id=medicina.php

  • El módulo mod_rewrite nos permite una cosa muy interesante, protegernos contra el hotlink o "robo de ancho de banda", que consiste en enlazar directamente las imágenes de otros sitios en vez de almacenarlas en el propio servidor, de manera que se perjudica a la web enlazada al incrementar su tasa de transferencia. Evitar el hotlink no es capricho, si nuestro plan de hosting va "justito" superaremos los límites y seremos penalizados. Pondremos algo similar a:
    RewriteEngine on
    
    RewriteCond %{HTTP_REFERER} !^$
    RewriteCond %{HTTP_REFERER} !^http://(www\.)?mi_dominio.com(/)?.*$ [NC]
    RewriteRule .*\.(gif|jpg|png)$ - [F,NC]

    Para reemplazar la imagen solicitada por otra sustituiremos la última línea por:

    RewriteRule .*\.(gif|jpg|png)$ http://www.mi_dominio.com/nohotlink.jpe [R,NC]

    Y la imagen que se verá en la web ladrona será nohotlink.jpe:

    no hotlink

    Recursos

  • El protocolo HTTP dispone de dos mecanismos de autentificación para restringir el acceso a un directorio mediante nombre de usuario y contraseña: Basic (el usuario y el password viajan por la red sin cifrar) y Digest (el usuario y el password viajan por la red cifrados con MD5). Para utilizar Digest debemos cargar el módulo:
    LoadModule digest_auth_module  /usr/lib/apache2/modules/mod_auth_digest.so

    Ambos mecanismos de autentificación funcionan de forma similar:

    1. crearemos el archivo que contiene los nombres de los usuarios autorizados (que no tienen que coincidir con usuarios del sistema) y sus contraseñas cifradas. Este archivo es /etc/apache2/passwd y se crea al añadir el primer usuario con el comando:

      - Basic:

      # htpasswd -c /etc/apache2/passwd 

      - Digest:

      # htdigest -c /etc/apache2/passwd Private 

      Nos pedirá la contraseña del usuario y su confirmación. La opción -c creará el archivo (si no existe) o lo sobrescribirá (si existe). Para Digest tenemos que especificar el nombre del dominio de autentificación (Private) que figura en la directiva AuthName (es el nombre que se muestra cuando se solicita la autentificación al usuario).

    2. una vez creado el archivo, para añadir usuarios o modificar contraseñas haremos:

      - Basic:

      # htpasswd /etc/apache2/passwd 

      - Digest:

      # htdigest /etc/apache2/passwd Private 
    3. indicaremos al servidor qué recursos están protegidos y cuáles son los usuarios que pueden acceder a ellos. Por ejemplo, para proteger el directorio /var/www/secret pondremos:

      - Basic:

      
      
      AuthType Basic
      AuthName "Only by invitation"
      AuthUserFile /etc/apache2/passwd
      Require valid-user

      - Digest:

      
      
      AuthType Digest
      AuthName Private
      AuthDigestFile /etc/apache2/passwd
      Require valid-user
      lt;/Directory>
    4. a partir de este momento, para acceder a /var/www/secret nos tendremos que autentificar:

      - Basic:

      Directorios protegidos Basic

      - Digest:

      Directorios protegidos Digest

Comprobar Apache

Una vez configurado Apache, guardamos los cambios y reiniciamos el servidor:

# /etc/init.d/apache restart

Comprobaremos si funciona poniendo en el directorio donde está la web (/var/www) la página HTML más sencilla, Hola mundo. El archivo hello.html contiene lo siguiente:




Hola mundo


Hola, mundo.



Si todo está correcto, al abrir http://127.0.0.1/hello.html en el navegador veremos lo siguiente:

Hola mundo HTML

No hay comentarios: