Vamos a ver en detalle los aspectos más importantes del archivo de configuración httpd.conf del servidor web Apache. Lo podemos encontrar en: /etc/httpd/httpd.conf
El archivo httpd.conf de configuración del servidor web Apache
El archivo httpd.conf es la principal fuente de configuración del servidor web Apache, en el se encuentran todas las directivas aplicables a la configuración del servidor web, y conocer profundamente este archivo y su estructura es vital para el administrador del servidor web.
El archivo de configuración se divide en cuatro secciones, a saber:
- Directivas de funcionamiento del servidor web Apache
- Parámetros de gestión de recursos del servidor web Apache
- Hosts Virtuales del servidor web Apache
- Parámetros de seguridad del servidor web Apache
Es necesario que sobre este archivo no tenga acceso ningún usuario que no sea root, ya que las modificaciones de este archivo pueden desencadenar en terribles agujeros de seguridad en el servidor web Apache.
Directivas de funcionamiento del servidor web apache
Las directivas de funcionamiento del archivo de configuración del servidor web Apache son, como su propio nombre indica, unas directrices que definen el funcionamiento interno y externo del servidor web Apache en aspectos tales como el nombre del servidor, la dirección de correo del webmaster, el número de subprocesos que se abrirán en cada sesión del servidor Apache etc.
A continuación vamos a ver una relación de las directivas más importantes de este apartado:
ServerName: Especifica el nombre y el puerto que el servidor utiliza para identificarse, normalmente se determina automáticamente, pero es recomendable especificarlo explícitamente para que no haya problemas al iniciar el servidor. Si el servidor no tiene un nombre registrado en las DNS, se recomienda poner su número IP. No puede estar dentro de ninguna sección.
La sintaxis de uso es:
ServerName direccionIP:Puerto p.e. ServerName localhost:80
ServerAdmin: especifica la dirección de correo electrónico del administrador, esta dirección aparece en los mensajes de error, para permitir al usuario notificar un error al administrador. No puede estar dentro de ninguna sección. Se encuentra disponible a través del módulo Core. Es aconsejable que la dirección de correo no pertenezca al dominio administrado, pues, en caso de que falle, no podremos acceder al correo que probablemente pueda contener mensajes advirtiéndonos del fallo.
ServerRoot: especifica la ubicación del directorio raíz donde se encuentra instalado el servidor web Apache, a partir del cual se crea el árbol de directorios comentado anteriormente. Esta directiva no debería cambiar a no ser que se mueva la carpeta de instalación del servidor web apache a otro directorio. Se encuentra disponible a través del módulo Core.
KeepAlive: especifica si se utilizarán conexiones persistentes, es decir, que todas las peticiones de un usuario se atenderán con la misma conexión.
MaxKeepAliveRequests: número máximo de conexiones persistentes. (Número máximo de usuarios concurrentes si KeepAlive esta en ON). Para establecer este parámetro, hay que tener en cuenta el ancho de banda de salida de nuestro servidor, por el cual deberá ser enviada toda la información, si se establece un valor muy grande respecto al ancho de banda, el tiempo de respuesta se verá incrementado para cada usuario. Se encuentra disponible a través del módulo Core.
KeepAliveTimeout: tiempo que espera en segundos entre peticiones de un usuario, antes de considerar que este ha terminado, y cerrar su conexión. Esta directiva solo es valida si la directiva KeepAlive esta activada.
ServerType: Indica la forma de arrancar servidor web Apache. Puede tener como valores inetd o standalone.
Su sintaxis es la que a continuación se especifica:
ServerType [inetd | standalone]
El arranque mediante inetd indica que no existe un servidor httpd permanente arrancado, sino que el arranque se realiza a partir del servidor de red inetd o xinetd. Cuando inetd recibe una conexión de un servicio, genera un nuevo proceso hijo que ejecuta el programa que proporciona el servicio. En este caso el servidor ejecutado es Apache. El servidor inetd vuelve a su estado original (esperar conexiones) y el proceso recientemente generado sirve la hoja HTML al cliente que la solicitó.
La forma habitual de trabajar se realiza en standalone. En este caso es el propio servidor web Apache el que esta “escuchando” las conexiones de la red. Cuando se recibe una petición HTTP, se genera un nuevo proceso (si es necesario) y se sirve la petición. En la mayor parte de las ocasiones se ahorra para cada petición la creación de un proceso hijo. Las directivas Port, MinSpareServers, MaxSpareServers, StartServers, MaxClients y MaxRequestPerChild son solo validas para la configuración en standalone
Port y Listen: Se utilizan solo cuando se ejecuta el servidor en modo standalone. La directiva Port especifica el puerto por el que el servidor web Apache acepta conexiones. Si el servidor debe atender a varios puertos, se deben usar tantas directivas Listen adicionales como sean necesarias.
La configuración de ejemplo que a continuación transcribimos le indica al servidor web Apache que atienda las peticiones web por los puertos 80 y 8080
Port 80
Listen 8080
MaxClients: Se utiliza para especificar el máximo número de clientes (navegadores) que se pueden conectar simultáneamente al servidor. Si se alcanza este límite, los clientes quedan bloqueados hasta que algunos de los servidores queda libre. Este valor no conviene que sea demasiado bajo (su valor por defecto es 150) y se utiliza como mecanismo para limitar el numero de procesos que se crean ante un numero de peticiones demasiado elevado. Este límite, que se impone el propio servidor web Apache evita caídas indeseadas del servidor. Su sintaxis se especifica a continuación:
MaxClients
TimeOut: el valor se utiliza para configurar medido en segundos, tres parámetros:
1. El tiempo tal que puede tardar una petición en ser recibida entera
2. La cantidad de tiempo que espera entre recepción de paquetes TCP
3. La cantidad de tiempo entre ACK's en transmisiones TCP
Pasado este tiempo se produce un mensaje de error en el que se indica que se ha consumido el tiempo máximo de espera. Establecer un valor muy pequeño puede dar lugar a que los usuarios reciban este mensaje de error, y establecer un valor muy pequeño dará lugar a una sobrecarga de la máquina.
CacheNegotiateDocs: Se utiliza para trabajar con proxies. Si esta directiva no aparece, el servidor Apache envía una respuesta que indica a los servidores Proxy que no almacenen los documentos en su caché. Esto impide que se obtengan versiones antiguas de páginas HTML, pero tiene como desventaja que se desaprovecha el ancho de banda de la red. Si la directiva aparece, se permite que los proxies almacenen documentos proporcionados por este servidor en su caché. Su sintaxis es la que a continuación se especifica.
CacheNegotiateDocs
Parámetros de Gestión de Recursos del servidor web Apache
Siguiendo con la estructura propuesta por el archivo de configuración, dejamos atrás las Directivas de Funcionamiento y nos adentramos en el siguiente apartado. Este apartado, el de Parámetros de Gestión de Recursos, no es más que una colección de directivas (como anteriormente) dedicadas a indicar al servidor Apache donde encontrar la información necesaria en cada momento o para definir como debe actuar de cara a sucesos como no existir la página solicitada o gestionar Hosts Virtuales. A continuación veremos los parámetros más interesantes de este apartado:
DocumentRoot: Esta directiva le indica al servidor web Apache la carpeta raíz que se ubica en el servidor, desde la que se servirán los documentos. Por defecto, todas las peticiones tendrán como raíz esta carpeta, a no ser que se utilicen alias (Directorios virtuales en IIS).
La carpeta raíz por defecto es la carpeta htdocs, la cual podemos encontrar en la ruta /srv/www/htdocs. Si se cambia este directorio por otro, practica muy recomendable, es muy importante que se ponga el nuevo valor, no solo en esta línea, sino también en la sección en la que se establecen los parámetros de configuración de este directorio.
DirectoryIndex: Mediante este parámetro, indicamos al servidor web Apache qué archivo debe buscar, por defecto, en caso de que no se especifique ninguno. Este archivo, de forma predeterminada es index.html, es decir, si desde el navegador tratamos de acceder a www.miservidor.com el servidor por defecto servirá www.miservidor.com/index.html .
Una de las partes atractivas de esta directiva es que podemos indicarle más de un archivo a
buscar de la siguiente forma:
DirectoryIndex archivo1 archivo2 archivo3
El orden con el que se especifica el nombre del archivo determinara la prioridad a la hora de decidir que archivo es el que se muestra.
RedirectPermanent: Se utiliza para indicar que una página alojada en el servidor web ha pasado ha estar en otro URL. De esta forma, la respuesta que genera el servidor web permite al cliente iniciar una nueva petición a un nuevo servidor que aloja la página pedida.
DefaultType: Especifica el tipo mime que se servirá por defecto en caso de no conocer la extensión del archivo que se esta sirviendo. Por defecto, se indicará que se sirve texto plano, con el valor text/plain.
ErrorLog: Especifica la ubicación del archivo que contiene el registro de errores, por defecto en la carpeta logs (/var/logs/apache2)
LogLevel: Indica el tipo de mensajes que se guardaran en el archivo de registro de errores, dependiendo de los valores especificados, se guardaran unos u otros.
Los valores disponibles son: debug, info, notice, warn, error, crit, alert, emerg.
LogFormat: La directiva permite definir el formato que se utilizará para almacenar los registros. A cada formato se le puede asignar un nombre, utilizándolo luego para crear distintos tipos de archivos de registro.
Sintaxis: LogFormat “configuracionError” nombre
IndexOptions: Esta directiva controla la apariencia de la página que se mostrara a un usuario cuando se pide la lista de archivos de un directorio. Entre las opciones posibles, destaca:
FancyIndexing, que muestra los nombres de los archivos con iconos etc…
FolderFirst: Hace que primero se muestren los directorios, esta opción solo se puede establecer en el caso de que FancyIndexing este activa.
Hosts Virtuales en el servidor web Apache
Llegamos a una de las partes mas interesantes del servidor web Apache, el uso de Hosts Virtuales o Alias, aunque nos vemos obligados a recalcar que este apartado pertenece en parte a las directivas de funcionamiento que anteriormente describíamos.
Mediante la correcta configuración de esta directiva podemos alojar mas de un sitio web en el mismo servidor, totalmente independientes uno del otro. A continuación describiremos con un caso teórico el uso de esta directiva, después, claro está, de una precisa explicación del funcionamiento de la misma.
Directivas VirtualHost y NameVirtualHost en el servidor web Apache
Esta es una directiva de bloque que se utiliza para especificar que un mismo servidor Apache sirva peticiones a varias direcciones web. De esta forma se podrán atender peticiones web para dos cabeceras distintas en un mismo servidor.
Hay dos alternativas básicas para aplicar esta técnica:
- Basada en Nombres DNS
Se trata de que un computador con una única interfaz de red que solamente tiene asignada una dirección IP pueda servir páginas a dos nombre se servidores Web diferentes. Para que sea posible la utilización de esta técnica es necesario definir al menos un alias DNS
- Basada en dirección IP
Se trata de que un computador con varias interfaces de red albergue dos dominios diferentes dependiendo de la IP que haya atendido la petición. Esta opción es útil cuando un computador esta conectado a dos redes diferentes (Intranet e Internet) y desea que el usuario tenga una visión diferente dependiendo de la interfaz de red por la que acceda al computador.
La opción mas comúnmente utilizada es la primera y para ello e necesario emplear las directivas NameVirtualHost y VirtualHost en el archivo de configuración del servidor Apache.
Supongamos que deseamos dar de alta dos dominios, www.servicio1.com y www.servicio2.com, que se desea atender vía web. En este caso se deben definir dos directivas VirtualHost que contengan directivas ya explicadas, que particularizaran el servicio proporcionado por cada nombre.
Por otra parte, es necesario incluir la directiva NameVirtualHost que indica que dirección IP va a proporcionar el servicio a los hosts virtuales. Si el computador solamente tiene una dirección de red, basta con especificar la dirección IP del servidor que ejecuta Apache, o el carácter *. En este último caso se indicara que todas las direcciones asignadas al servidor que ejecuta Apache se utilizaran como direcciones asignadas a los Hosts Virtuales.
En el caso teórico que describimos a continuación, la máquina con una única tarjeta de red cuya dirección es 138.100.9.22 sirve a dos dominios. Dentro de cada sección VirtualHost se especifican directivas que particularizan cada host virtual. Merece especial atención la directiva DocumentRoot, puesto que el sistema de archivos que se exporta vía web es diferente para cada host. De esta forma, aunque ambas máquinas se resuelvan a la misma dirección IP, el acceso a las dos URL proporciona páginas diferentes.
Configuración del ejemplo
NameVirtualHost *
www.servicio1.com>
ServerAdmin admin1@servicio1.com
DocumentRoot “/srv/www/htdocs/uno”
ServerName www.servicio1.com
www.servicio2.com>
ServerAdmin admin2@servicior2.com
DocumentRoot “/srv/www/htdocs/dos”
ServerName www.servicio2.com
La técnica de hosts virtuales basada en direcciones IP requiere que el computador que alberga los dos hosts tenga dos direcciones IP diferentes (dos interfaces de red). En este caso cada sección VirtualHost hace referencia a cada una de las direcciones.
Configuración del ejemplo
ServerAdmin admin1@servicio1.com
DocumentRoot “/srv/www/htdocs/uno”
ServerName www.servicio1.com
ServerAdmin admin2@servicior2.com
DocumentRoot “/srv/www/htdocs/dos”
ServerName www.servicio2.com
Directivas de seguridad del servidor web Apache
A continuación, serán expuestas las directivas de configuración del servidor que especifican quien tiene permisos para acceder a determinados recursos. De esta forma se pueden restringir accesos no autorizados a determinados documentos. En esta sección se exponen las formas mas simples que ofrece el servidor web Apache para proteger documentos:
- Autorización de acceso basada en el usuario.
- Autorización de acceso basada en el nombre o dirección del cliente que realiza la petición.
Estos dos tipos de autorizaciones se pueden especificar de dos formas:
- En un archivo de configuración global del servidor: access.conf o http.conf
- En un archivo de configuración que puede haber en cada directorio del sistema de archivos exportado
En esta sección se muestran las directivas más importantes que aparecen en los archivos de configuración del servidor web Apache, y que permiten establecer los mecanismos básicos de autorización por computador y por usuario. Estas directivas aparecerán en el archivo global access.conf o httpd.conf y en el que especifica la directiva AccessFileName.
Directivas
AccessFileName: Se utiliza para especificar el nombre de cada archivo que contiene directivas que especifican los parámetros de seguridad para cada directorio. Su sintaxis se especifica a continuación:
AccessFileName [archivo]
En cada directorio exportado puede haber un archivo con este nombre que contendrá directivas que especifican parámetros de seguridad para los archivos del directorio en el que esta almacenado el archivo y sus subdirectorios.
AllowOverride: Cuando el servidor encuentra un archivo .htaccess (como se explica en la directiva AccessFileName) es necesario saber que directivas presentes en ese archivo pueden prevalecer sobre las directivas de configuración previas. En ese momento es cuando entra en juego la directiva AllowOverride, porque especifica que tipos de directivas se pueden modificar por el archivo .htaccess de un directorio.
La directiva AllowOverride puede definirse como:
AllowOverride opcion opcion opcion….Cada una de estas opciones que se aplican como parámetro a esta directiva indica que directivas se pueden sobrescribir. Seguidamente se explican las más importantes:
AuthConfig:
Permite el uso de directivas que permiten el control de acceso a usuarios a una zona Web: AuthGroupFile, AuthName, AuthType, AuthUserFile, requiere. Hay mas directivas como: AuthDBMGroupFile, AuthDBMUserFile, etc.
Indexes:
Permite la aparición de directivas que permiten mostrar el contenido de un directorio que no contiene el archivo index.htm: AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon…
Limit:
Permite la aparición de la directiva Limit que permite acotar el acceso a una zona Web por nombre o dirección Ip del cliente. Esta directiva se explicara seguidamente.
Options:
Permite la aparición de la directiva Options que permite modificar los valores de seguridad por defecto que haya establecido el administrador del servidor Web.
All:
Si aparece se permiten todas las opciones anteriores.
None:
Si aparece no se permite ninguna de las opciones anteriores.
Sintaxis: AllowOverride All|None|directive-type [directive-type] ...
Valor por defecto: AllowOverride All
En este ejemplo que se muestra a continuación no se permite que los usuarios almacenen en su zona Web programas CGI que se puedan ejecutar ni que se pueda mostrar el contenido de un directorio que no contiene el archivo index.html.
Options –ExecCgi –Indexes
AllowOverride Indexes Options
Por otra parte, se permite que sea el usuario el que, si lo desea, pueda cambiar estas restricciones modificando el archivo .htaccess para cambiar las autorizaciones por defecto, de tal forma que si se incluye la siguiente línea en el archivo .htaccess de un directorio Web de usuario, podrá mostrar el contenido de un directorio y ejecutar programas CGI.
Options +ExecCgi +Indexes
Limit: Se utiliza para limitar el acceso a la información de un directorio bajo un conjunto
de métodos. Esta limitación se realiza incluyendo un conjunto de directivas dentro del bloque. Su sintaxis se especifica a continuación:
Directivas
Dependiendo de las operaciones que se realicen sobre el subárbol de directorios que se desea limitar se debe especificar un método u otro. Supóngase que en un directorio no se necesita que ningún cliente “envíe” ningún tipo de información al servidor. En este caso habría que habilitar los métodos que permiten obtener información del servidor (GET y HEAD) y restringir los métodos POST, PUT y DELETE.
Directivas
Directivas
Los métodos incluidos en la lista pueden ser uno o más de los siguientes: GET, POST, PUT, DELETE, CONNECT, OPTIONS, PATCH, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, y UNLOCK.
Los nombres de los métodos distinguen mayúsculas de minúsculas. Si usa GET también se restringirán las peticiones HEAD. El método TRACE no puede limitarse.
Consejo:
Es mejor usar una sección LimitExcept en lugar de una sección Limit cuando se quiere restringir el acceso, porque una sección LimitExcept protege contra métodos arbitrarios.
LimitExcept: Se usa para englobar un grupo de directivas de control de acceso que se aplicarán a cualquier método de acceso HTTP no especificado en los argumentos; es lo contrario a lo que hace una sección Limit y puede usarse para controlar tanto métodos estándar como no estándar o métodos no reconocidos. Sintaxis:
method [method] ... >
Autorización de acceso por dirección del cliente:
Directivas allow, deny y order
La autorización de acceso a un subárbol de directorios basado en la dirección del cliente autoriza o deniega el acceso dependiendo de la dirección IP del host que haya generado la petición sin necesidad de pedir información adicional al cliente. La especificación del PC se puede realizar por nombre de DNS o por la dirección IP. La especificación de acceso se realiza con las directivas:
Order
Allow from
Deny from
Estas tres directivas deben estar incluidas en un bloque Limit (anteriormente explicado).
La directiva order define el orden en el que se deben procesar las directivas allow y deny. Las posibles opciones son:
- Order allow, deny: primero se evalúan las directivas allow y posteriormente las directivas deny.
Order deny, allow: primero se evalúan las directivas deny y posteriormente las directivas allow.
Order mutual-failure: las máquinas que aparecen asociadas a la directiva allow y no aparecen en la directiva deny son autorizadas
La directiva allow from especifica una lista de máquinas a las que se les autoriza el acceso a un directorio o árbol de directorios. La directiva deny from especifica una lista de computadores a los que se les deniega el acceso a un directorio o árbol de directorios. Los parámetros que contiene pueden ser los siguientes:
all: se autoriza/deniega el acceso a todas las máquinas independientemente de su IP
dirección IP: se autoriza el acceso a la máquina cuya IP sea la especificada.
dominio: se autoriza el acceso a las máquinas que pertenezcan al dominio indicado.
Ejemplo:
order deny, allow
deny from all
allow from upv.es
allow from upc.es
Autorización de acceso por usuario
La autentificación es cualquier proceso mediante el cual se verifica que alguien es quien dice ser, es decir; un proceso por el cual a alguien se le permite acceder donde desea u obtener la información busca.
La autorización de acceso basada en autentificación de usuarios permite controlar el conjunto de usuarios que tienen acceso a un subárbol de directorios. Esta autentificación se basa en utilizar nombres de usuarios y contraseñas. Cuando el cliente accede a dicho subárbol, el servidor le pedirá que se identifique mediante un nombre de usuario y una contraseña. Si la identificación tiene éxito, se autoriza al usuario a entrar en la zona restringida sin volver a pedirle la información de identificación. Las directivas que permiten la autentificación de usuario son:
Directiva require: Especifica el usuario o conjunto de usuarios que están autorizados a entrar en la zona restringida.
Sintaxis: Require entity-name [entity-name] ...
Require debe ser usada de forma conjunta con las directivas AuthName, AuthType, y directivas como AuthUserFile y AuthGroupFile (para definir usuarios y grupos) para funcionar correctamente.
Esta directiva está incluida en el bloque Limit. Si el último parámetro es valid-user, indica que se autoriza a un cliente a entrar en el espacio web siempre que proporcione un usuario válido, es decir, debe estar dado de alta en el archivo de usuarios y debe proporcionar su contraseña correcta.
Require user userid [userid] ...
Solo los usuarios mencionados pueden acceder al recurso.
Require group group-name [group-name] ...
Solo los usuarios pertenecientes a los grupos mencionados pueden acceder al recurso.
Require valid-user
Todos los usarios pueden acceder al recurso.
Directiva AuthType: Especifica el tipo de autentificación que se requiere. Actualmente solamente están implementadas las opciones Basic y Digest. La primera utiliza el mismo algoritmo que utilizan los sistemas Unix para codificar las palabras clave; La otra se basa en MD5 y no todos los navegadores lo soportan.
Para que funcione correctamente, esta directiva tiene que ir acompañada por las directivas AuthName y require, y de directivas como AuthUserFile y AuthGroupFile.
Sintaxis:
AuthType Basic|Digest
Directiva AuthName: Esta directiva especifica el nombre de dominio que se muestra al solicitar autorización para acceder a un directorio. Este nombre de dominio se muestra al cliente para que el usuario sepa qué nombre de usuario y contraseña ha de introducir.
AuthName toma solamente un argumento; si el nombre de dominio contiene algún espacio, debe escribirse entre comillas. Para que funcione correctamente, esta directiva debe usarse junto con las directivas AuthType y require,, y con directivas como AuthUserFile y AuthGroupFile.
Directiva AuthUserFile: Especifica el archivo que contiene los usuarios con las palabras clave. Cada línea del archivo de usuarios contiene un username seguido de un punto y coma, seguido de la contraseña cifrada. Si el mismo usuario ID es definido múltiples veces, mod_auth usarán la primera aparición para verificar la contraseña.
Sintaxis:
AuthUserFile file-path
Este archivo se compone de dos campos: el primero es el nombre de usuario y el segundo es la palabra clave que tiene asociada (cifrada). Para añadir un nuevo usuario a este archivo, Apache incluye un programa que permite dar de alta a un usuario o cambiar su clave. Este programa es htpasswd, y su sintaxis es la que a continuación se especifica:
htpasswd -c Filename username
La opción –c indica que se debe crear un nuevo archivo de usuarios y solo se debe incluir la primera vez que se crea un usuario. A este programa se le pasan dos parámetros: el primero es el archivo que contiene los usuarios y el segundo es el nombre de usuario que se desea añadir al archivo o al que se desea cambiar su contraseña.
Directiva AuthGroupFile: Especifica el archivo que contiene los grupos con sus palabras clave. El archivo AuthGroupFile se edita manualmente, usando tu editor de texto preferido, y su formato es el siguiente:
Sintaxis: nombre_del_grupo: usuario1 usuario2 usuario3
Aspectos sobre seguridad del servidor web Apache
El administrador debe asegurarse de que el archivo AuthUserFile es almacenado fuera del árbol de documento del servidor web. No debe ponerse en el directorio que protege. En ese caso, los clientes podrían ser capaces de trasvasar el archivo.