Saltar a contenido

P2.5 Directiva Directory

La directiva Directory en un archivo de configuración de Apache se utiliza para aplicar configuraciones específicas a un directorio particular en el sistema de archivos del servidor web. Esta directiva permite definir permisos, opciones y otras configuraciones que afectan cómo Apache maneja las solicitudes para ese directorio.

Situación inicial

Supongamos que tenemos un host virtual configurado en Apache que sirve contenido desde el directorio /var/www/sitio1 pero queremos que se sirva el contenido desde el directorio /www/sitio1.

Si creamos el directorio /www/sitio1 y colocamos un archivo index.html en él:

sudo mkdir -p /www/sitio1
sudo nano /www/sitio1/index.html
En el archivo de configuración del host virtual, tenemos algo como esto:

<VirtualHost *:80>
    ServerName sitio1.local
    DocumentRoot /www/sitio1
</VirtualHost>

Y luego intentamos acceder a http://sitio1.local, es probable que recibamos un error 403 Forbidden, ya que Apache no tiene permisos para acceder a ese directorio.

Configuración de Directory

Si queremos que Apache sirva contenido desde el directorio /www/sitio1, necesitamos configurar la directiva Directory en el archivo de configuración del host virtual correspondiente.

  1. Editar el fichero de configuración del host virtual:
    sudo nano /etc/apache2/sites-available/sitio1.conf
    
  2. Agregar la directiva Directory. Dentro del bloque <VirtualHost>, agrega la siguiente configuración:
        <Directory /www/sitio1>
            Options Indexes FollowSymLinks
            AllowOverride None
            Require all granted
        </Directory>
    
  3. Guardar y salir del editor.

  4. Reiniciar Apache para aplicar los cambios:

    sudo systemctl restart apache2
    

Verificación

Ahora, si accedemos a http://sitio1.local en nuestro navegador, deberíamos ver el contenido del archivo index.html ubicado en /www/sitio1.

Esto demuestra cómo la directiva Directory puede ser utilizada para configurar permisos y opciones específicas para un directorio en Apache, permitiendo que el servidor web sirva contenido desde ubicaciones personalizadas en el sistema de archivos.

Alias y Directory

Es común utilizar la directiva Alias junto con la directiva Directory para mapear una URL a un directorio fuera de la raíz del documento web y luego configurar los permisos para ese directorio. Por ejemplo, si queremos servir el contenido del directorio /www/recursos a través de la URL http://sitio1.local/recursos, podemos hacer lo siguiente:

Crear el directorio y agregar un archivo:

sudo mkdir -p /www/recursos
sudo nano /www/recursos/index.html
En el archivo de configuración del host virtual, agregamos las siguientes directivas:

  1. Agregar la directiva Alias. En el archivo de configuración del host virtual, dentro del bloque <VirtualHost>, agrega la siguiente línea:

    Alias /recursos /www/recursos
    

  2. Configurar la directiva Directory. Justo después de la directiva Alias, agrega la siguiente configuración:

    <Directory /www/recursos>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
    

  3. Guardar y salir del editor.

  4. Reiniciar Apache para aplicar los cambios:

    sudo systemctl restart apache2
    

Verificación

Ahora, si accedemos a http://sitio1.local/recursos en nuestro navegador, deberíamos ver el contenido del directorio /www/recursos.

Esto demuestra cómo las directivas Alias y Directory pueden ser utilizadas en conjunto para servir contenido desde ubicaciones personalizadas en el sistema de archivos, mientras se configuran los permisos adecuados para el acceso a esos directorios.

Directory Options

La directiva Options dentro de una directiva Directory permite configurar varias opciones que afectan cómo Apache maneja las solicitudes para ese directorio. Algunas de las opciones más comunes incluyen:

  • Indexes: Permite la generación automática de un índice de directorio si no hay un archivo index presente.
  • FollowSymLinks: Permite que Apache siga enlaces simbólicos en el sistema de archivos
  • None: Desactiva todas las opciones.

Indexes

Si no habilitamos la opción Indexes, Apache no generará automáticamente una lista de los archivos y subdirectorios dentro del directorio si no hay un archivo index presente. Por ejemplo:

  • 1. Borrar el archivo index.html para probar:
    sudo rm /www/sitio1/index.html
    
  • Creamos varios archivos en el directorio:
    cd /www/sitio1
    sudo touch archivo1.txt archivo2.txt archivo3.txt
    
  • Configurar la directiva Directory sin Indexes:
        <Directory /www/sitio1>
            Options None
            AllowOverride None
            Require all granted
        </Directory>
    
  • Reiniciar Apache para aplicar los cambios:
    sudo systemctl restart apache2
    

Si accedemos a http://sitio1.local sin la opción Indexes, recibiremos un error 403 Forbidden. Sin embargo, si habilitamos la opción Indexes en la directiva Directory, Apache generará automáticamente una lista de los archivos presentes en el directorio.

    <Directory /www/sitio1>
        Options Indexes
        AllowOverride None
        Require all granted
    </Directory>
Después de reiniciar Apache, al acceder a http://sitio1.local, veremos una lista de los archivos archivo1.txt, archivo2.txt y archivo3.txt.

Advertencia

Las opciones de Directory se heredan en los subdirectorios, a menos que se sobrescriban explícitamente. Por lo tanto, es importante configurar las opciones adecuadamente para evitar problemas de seguridad o acceso no deseado a los archivos.

La opción FollowSymLinks permite que Apache siga enlaces simbólicos en el sistema de archivos. Si esta opción no está habilitada, Apache no podrá acceder a los archivos a los que apuntan los enlaces simbólicos.

Supongamos que tenemos esta configuracion para sitio1.local:

    <Directory /www/sitio1>
        Options Indexes
        AllowOverride None
        Require all granted
    </Directory>
  1. Crearemos el directorio /www/sitio1/enlaces con algunos archivos:

    sudo mkdir -p /www/sitio1/enlaces
    cd /www/sitio1/enlaces
    sudo touch archivo_enlace1.txt archivo_enlace2.txt
    

  2. Ahora, crearemos un enlace simbólico en /www/sitio1 que apunte al directorio enlaces:

    sudo ln -s /www/sitio1/enlaces /www/sitio1/directorio
    

  3. Si intentamos acceder a http://sitio1.local/directorio, recibiremos un error 403 Forbidden porque la opción FollowSymLinks no está habilitada.

  4. Modificamos la configuración de Directory para incluir FollowSymLinks:

    sudo nano /etc/apache2/sites-available/sitio1.conf
    

        <Directory /www/sitio1>
            Options Indexes FollowSymLinks
            AllowOverride None
            Require all granted
        </Directory>
    
    5. Guardamos y salimos del editor, luego reiniciamos Apache:
        sudo systemctl restart apache2
    
    6. Ahora, al acceder a http://sitio1.local/directorio, podremos ver el contenido del directorio enlaces a través del enlace simbólico.

Peligro de seguridad

Advertencia de seguridad

Habilitar la opción FollowSymLinks puede presentar riesgos de seguridad si los enlaces simbólicos apuntan a ubicaciones no deseadas en el sistema de archivos. Asegúrate de que los enlaces simbólicos solo apunten a directorios y archivos que deseas que sean accesibles a través del servidor web.

Por ejemplo:

  1. Si hacemos un enlace simbólico que apunta a un directorio sensible, como /etc:
    sudo ln -s /etc /www/sitio1/sistema
    
  2. Y luego accedemos a http://sitio1.local/sistema, podríamos potencialmente exponer archivos sensibles del sistema, lo cual es un riesgo de seguridad significativo.

Aunque la carpeta /etc no esté accesible directamente por alguna configuración Directory, el simple hecho de tener enlaces simbólicos mal configurados puede llevar a vulnerabilidades.

Multiviews

La opción Multiviews permite a Apache seleccionar automáticamente el mejor archivo para servir en función de las preferencias del cliente (como el idioma o el tipo de contenido). Por ejemplo, si tienes varios archivos con el mismo nombre pero diferentes extensiones (como index.html, index.fr.html, index.es.html), Apache puede elegir el archivo más adecuado según las preferencias del navegador del cliente.

Para habilitar Multiviews, simplemente agrega la opción a la directiva Directory:

  1. Edita el archivo de configuración del host virtual:
    sudo nano /etc/apache2/sites-available/sitio1.conf
    
  2. Agrega la opción Multiviews:
        <Directory /www/sitio1>
            Options Indexes FollowSymLinks Multiviews
            AllowOverride None
            Require all granted
        </Directory>
    
  3. Guarda y sal del editor, luego reinicia Apache:
        sudo systemctl restart apache2
    
  4. Crea varios archivos en el directorio /www/sitio1:
    cd /www/sitio1
    sudo nano index.html
    sudo nano index.en.html
    sudo nano index.es.html
    
  5. Modifica el idioma preferido en tu navegador y accede a http://sitio1.local. Apache seleccionará automáticamente el archivo más adecuado según las preferencias del navegador.