Tabla de Contenidos
208.1 Implementing a web server
Pertenece a Topic 208: Web Services
- Weight: 4
- Description: Candidates should be able to install and configure a web server. This objective includes monitoring the server’s load and performance, restricting client user access, configuring support for scripting languages as modules and setting up client user authentication. Also included is configuring server options to restrict usage of resources. Candidates should be able to configure a web server to use virtual hosts and customize file access.
- Key Knowledge Areas:
- Apache 2.4 configuration files, terms and utilities
- Apache log files configuration and content
- Access restriction methods and files
- mod_perl and PHP configuration
- Client user authentication files and utilities
- Configuration of maximum requests, minimum and maximum servers and clients
- Apache 2.4 virtual host implementation (with and without dedicated IP addresses)
- Using redirect statements in Apache’s configuration files to customize file access
- Terms and Utilities:
- access logs and error logs
.htaccesshttpd.confmod_auth_basic,mod_authz_hostandmod_access_compathtpasswdAuthUserFile,AuthGroupFileapachectl,apache2ctlhttpd,apache2
Servidor web Apache
El servidor Web Apache es el más conocido y el más extendido en Internet debido a su:
- Gran estabilidad.
- Buena tolerancia a la carga.
- Estructura modular (facilidad en activar/desactivar módulos para ciertas funcionalidades).
Instalación
Dependiendo de la distribución:
Debian:
apt-get install apache2
Red Hat:
yum install httpd
Archivos de configuración
El servidor Apache se basa en:
- Un daemon llamado
httpd(Centos) /apache2(Debian). - El nombre del fichero de configuración principal depende de la distribución utilizada:
- RedHat:
/etc/httpd/conf/httpd.conf - Debian:
/etc/apache2/apache2.conf
El archivo de configuración principal referencia a otros ficheros importantes por medio de “includes”:
ports.conf: define los puertos a través de los que el servidor apache trabaja (por defecto 80 y 443).envvars: define variables de entorno fundamentales para el servidor. Las más importantes sonAPACHE_RUN_USERyAPACHE_RUN_GROUP, especifica quién usará el servidor web Apache.mod-available/*.conf: configuraciones de módulos disponibles (los que se pueden cargar dinámicamente).sites-available/*.conf: configuraciones de hosts virtuales (correspondientes a sitios web).conf-availble/*.conf: archivos de configuración extra.conf.d/: ficheros de configuración de los virtual hosts.
Estructura ficheros de configuración
La estructura del archivo de configuración se basa en directivas de dos tipos:
- Básicas: tienen un valor asociado al nombre de la directiva. Ejemplo:
AuthType Basic.AuthTypesería el nombre de la directiva yBasicsu valor. - De contenedor: existen unas etiquetas de inicio y cierre con el nombre de la directiva que definen un contenedor que agrupa varias directivas para un ámbito concreto:
<directiva_de_contenedor valor>
directiva3 valor3
directiva4 valor4
<directiva_de_contenedor>
Directivas fundamentales
De entre todas las innumerables directivas de Apache, algunas son fundamentales y deberán encontrarse en cualquier configuración de Apache:
| Directiva | Descripción |
|---|---|
ServerRoot | Indica el directorio raíz de los archivos de configuración. |
User | Determina la cuenta de usuario del proceso Apache (ver fichero con variables de entorno) |
Group | Determina el grupo de servicio propietario de los procesos Apache. (ver fichero con variables de entorno) |
ErrorLog | Archivo de registro de errores. |
CustomLog | Archivo de registro de accesos. |
Include | Indica un archivo de configuración anexo que se integrará en el archivo apache2.conf |
Listen | Indica el puerto en el que escucha el servidor. |
DocumentRoot | Indica el directorio que contiene los archivos html. |
Ejemplo de directivas básicas de un fichero /etc/apache2/apache2.conf:
ServerRoot /etc/apache2 User www-data Group www-data ErrorLog /var/log/apache2/error.log Listen 80 DocumentRoot /var/www
Directivas de Optimización
| Directiva | Descripción |
|---|---|
MaxKeepAliveRequests | Indica el número máximo de solicitudes permitidas para conexiones persistente. (0 = Ilimitadas) |
MinSpareServers | Establece el número mínimo de procesos hijos en espera. |
MaxSpareServers | Establece el número máximo de procesos hijos en espera. |
StartServers | Establece el número de procesos hijos en el arranque. |
MaxClients | Establece el número máximo de peticiones que servirán simultáneamente. |
Directivas de contenedor
Ya se ha mostrado que las directivas sirven para aplicar un elemento de configuración al servidor. Por ejemplo, la línea de configuración Listen 80 en el archivo de configuración se compone de la directiva Listen, que indica en qué puerto el servidor debe esperar peticiones, y del valor 80, que es el puerto HTTP estándar. Ubicada directamente en el archivo de configuración, esta directiva se aplicará en todo el servidor.
Sin embargo, hay elementos de configuración que solo afectan a un aspecto funcional del servidor. Por ejemplo, hay directivas que solo deberían aplicarse a una parte limitada de un sitio web, como páginas web protegidas que estén situadas en una estructura de carpetas específica del sistema de archivos. Para este tipo de usos, Apache utiliza las directivas de contenedor.
Tienen 2 objetivos:
- Agrupar un conjunto de directivas.
- Aplicarlas a una parte limitada del servidor.
<directiva_de_contenedor valor>
directiva3 valor3
directiva4 valor4
<directiva_de_contenedor>
<Directory /var/www/especial>
Options FollowSymLinks
</Directory>
Ejemplo:
<Directory /> Options FollowSymLinks AllowOverride None Require all denied </Directory> <Directory /usr/share/ AllowOverride None Require all granted </Directory> <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
Definimos los directorios a los que tendrá acceso Apache. Como se puede ver, al directorio raíz (/) no podrá acceder (Require all denied).
Inicio y Parada del Servicio
El inicio y la parada del servidor se pueden realizar mediante 2 métodos:
- Comandos de gestión de servicios:
service httpd start/stopsystemctl start/stop apache2.service
- El ejecutable del servicio:
httpd -t: Validación de sintaxis.httpd -k stop: Parada del servicio.httpd -k start: Arranque del servicioapachectl -t: Validación de sintaxisapachectl -k stop: Parada del servicio.apachectl -k start: Arranque del servicioapache2 -t: Validación de sintaxis.apache2 -k stop: Parada del servicioapache2 -k start: Arranque del servicioapache2ctl -t: Validación de sintaxis.apache2ctl -k start: Arranque del servicioapache2ctl -k stop: Parada del servicio
Módulos Apache
El servidor web Apache tiene una estructura modular que permite añadir módulos bajo demanda.
Formato estándar de carga de directivas en apache2.conf:
LoadModule id_modulo archivo_modulo
| Directiva | Descripción |
|---|---|
LoadModule | Directiva de carga de módulos. |
id_modulo | Identificador del módulo. Valor estándar asociado a cada módulo. |
archivo_modulo | La ruta absoluta del archivo de módulo proporcionado con Apache. |
LoadModule dir_module /usr/lib/apache2/modules/mod_dir.so DirectoryIndex index.html
En este ejemplo, el módulo cargado es dir_module cuya función es simplificar la escritura de las URL por los usuarios y mostrar un archivo html (en general index.html). Una vez que se ha cargado el módulo, se puede llamar a la directiva DirectoryIndex que solicita la carga de index.html si no hay ningún archivo en la URL.
Hay que recargar la configuración del servidor web Apache para que los cambios sobre los módulos se apliquen
Los siguientes comandos nos permiten trabajar con módulos:
httpd -l: Visualización de módulos compilados.httpd -M: Visualización de módulos cargados.apachectl -l: Visualización de módulos compilados.apachectl -M: Visualización de módulos cargados.apache2 -lVisualización de módulos compilados.apache2 -MVisualización de módulos cargados.apache2ctl -l: Visualización de módulos compilados.apache2ctl -M: Visualización de módulos cargados.
Ejemplo de módulos cargados:
# apache2ctl -M Loaded Modules: core_module (static) so_module (static) watchdog_module (static) http_module (static) log_config_module (static) logio_module (static) version_module (static) unixd_module (static) access_compat_module (shared) alias_module (shared) auth_basic_module (shared) authn_core_module (shared) authn_file_module (shared) authz_core_module (shared) authz_host_module (shared) authz_user_module (shared) autoindex_module (shared) deflate_module (shared) dir_module (shared) env_module (shared) filter_module (shared) mime_module (shared) mpm_event_module (shared) negotiation_module (shared) reqtimeout_module (shared) setenvif_module (shared) status_module (shared)
Activar módulos
Si nos queremos ahorrar crear las directivas para cargar los módulos, podemos utilizar el comando a2enmod:
a2enmod nombre_modulo
Esto es válido para los módulos que aparezcan en la carpeta mods-available
Y luego hay que reiniciar Apache para aplicar la configuración: service apache2 restart
Desactivar módulos
a2dismod nombre_modulo
Y luego hay que reiniciar Apache para aplicar la configuración: service apache2 restart
También existen comandos para cargar/eliminar configuración existente en la carpeta conf-available:
- Activar:
a2enconf <nombre_archivo> - Desactivar:
a2disconf <nombre_archivo>
Hosts Virtuales
Tras la instalación de Apache, servirá toda la información que esté definida en DocumentRoot, aunque es frecuente que un servidor Apache físico albergue varios sitios web distintos.
Permite a las empresas de alojamiento gestionar sitios web de decenas de clientes en un solo servidor. Cada uno con su directorio particular y asociado a un determinado nombre de dominio.
Esta tecnología se conoce en el mundo Apache con el nombre de Virtual Host (host virtual).
Cada “host virtual” lee sus directivas de configuración especificas declaradas mediantes la directiva VirtualHost.
Hay dos técnicas de implementación de hosts virtuales:
- VirtualHost por dirección IP.
- VirtualHost por nombre de host.
VirtualHost por dirección IP
El servidor dispone de varias IPs y responde de diferente forma según la interfaz a la que llegue cada petición HTTP.
<VirtualHost direccion_1:80>
ServerName nombre1
DocumentRoot dir1
</VirtualHost>
<VirtualHost direccion_2:80>
ServerName nombre2
DocumentRoot dir2
</VirtualHost>
| Parámetro | Descripción |
|---|---|
VirtualHost | Declaración de un host virtual: todas las directivas que contiene afectarán al host virtual. |
dirección_x:80 | El host virtual se elegirá si la petición que se recibe tiene como dirección IP de destino esta dirección del servidor configurada en el puerto 80. |
ServerName nombre | (Opcional) si existe una resolución de nombres inversa. Si no, puede devolver un mensaje de error no bloqueante. |
DocumentRoot dir | Las páginas web de este host virtual están en el directorio dir. |
El problema de esto es que necesitamos tener varias IPs públicas, una diferente por cada sitio web.
VirtualHost VirtualHost por nombre de host
Existen tantos sitios virtuales como VirtualHost haya definidos. Suele ser el modo más habitual.
Ejemplo en apache2.conf:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName nombre1
DocumentRoot dir1
</VirtualHost>
<VirtualHost *:80>
ServerName nombre2
DocumentRoot dir2
</VirtualHost>
| Parámetro | Descripción |
|---|---|
NameVirtualHost *:80 | Se gestionan los hosts virtuales por nombre. La escucha de las peticiones se realiza a través del puerto 80. |
VirtualHost | Declaración de un host virtual: todo lo que se encuentre en el contenedor afectará al host virtual. |
*:80 | El host virtual se elegirá para las peticiones que se reciban en cualquier dirección IP del servidor por el puerto 80. |
ServerName nombre | Este host virtual se elegirá para las peticiones que tengan el nombre de servidor nombre. Es decir, se activará para las peticiones a http://nombre. |
DocumentRoot dir | Las páginas web de este host virtual se almacenarán en el directorio dir. |
Configuración
Dentro de cada Virtual Host hay varios parámetros de configuración que son importantes:
ServerName: especifica el dominio correspondiente.DocumentRoot: especifica la ubicación de los archivos de dicho sitio web.ServerAlias: permite especificar otros dominios redirigidos a este.ServerAdmin: email del administrador del sitio de cara a notificaciones.Redirect: nos permite redirigir una url a otra dentro del servidor.
Estos VirtualHost los podemos añadir directamente en los archivos de configuración de Apache o utilizar la ruta sites-available y sites-enabled para hacerlo más modular.
Ejemplo de sites-available/000-default.conf:
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com SeverAdmin webmaster@localhost DocumentRoot /var/www/example ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Una vez hechos los cambios en sites-available, lo habilitamos con el comando a2ensite:
a2ensite 000-default
Para deshabilitarlo:
a2dissite 000-default
Es necesario recargar la configuración del servicio Apache: service apache reload
Restricción de acceso a usuarios
Apache ofrece múltiples posibilidades de restricción de acceso a usuarios y existen muchos medios para gestionar el acceso a datos.
Podremos definir estas directivas de acceso a nivel global o en cada directorio con ficheros .htaccess
Los 2 métodos más comunes son:
- Autenticación local
- Autenticación mediante LDAP
Autenticación Global
Apache recomienda utilizar una directiva Directory en el fichero de configuración general cada vez que una configuración específica debe aplicarse al contenido de un directorio:
... <Directory /var/www/protegido> AllowOverride all authType basic AuthName "Se necesita comprobar sus credenciales" Require valid-user AuthUserFile /root/htpasswd </Directory> ...
En AuthUserFile se define el archivo con la base de datos de usuarios que podrán acceder a dicho directorio.
Autenticación simple mediante archivo .htaccess
Un método alternativo a la configuración global (basada en la directiva de contenedor Directory) es crear el archivo .htaccess en el directorio en cuestión e incluir en él las directivas que se deben aplicar al directorio:
# Ejemplo de /var/www/protegido/.htaccess authType basic AuthName "Se necesita comprobar sus credenciales" Require valid-user AuthUserFile /root/htpasswd
A veces las 2 configuraciones entran en conflicto, entonces la directiva AllowOverride establece la configuración que se utilizará:
all(Por defecto): Cualquier directiva se autoriza en el fichero.htaccessnone: Los archivos .htaccess son ignoradosAuthConfig: Solo se autoriza las directivas de autenticación.
Autenticación local
Conviene usar este método en un entorno con un número limitados de usuarios. El primer paso es crear los usuarios:
htpasswd: comando que permite crear la base de datos de cuentas y trabajar con ella.
htpasswd <opciones> archivo nombre_usuario
Opciones:
-c: crea el fichero de cuentas de usuario si no existe.-D: eliminar una cuenta de usuario
Ejemplo:
htpasswd -c htpasswd jesus
El archivo donde se almacenen estas contraseñas no debería estar en las rutas del servidor Apache por si alguien lo compromete, que no pueda acceder a esa información. Por ejemplo en /root.
Ejemplo de fichero htpasswd:
linux:~# cat htpasswd usuario:x4OpUoo9KBR1o pepito:o9zeMsxnhS45M fulanito:hQcfUWksuIAmk
Habrá que cargar como mínimo el módulo auth_basic para permitir la autentificación mediante un archivo local, el módulo authn_file para gestionar esta autentificación y finalmente el módulo authz_user, que gestiona la autorización de acceso a las páginas protegidas:
LoadModule auth_basic_module /ruta/mod_auth_basic.so LoadModule authn_file_module /ruta/mod_authn_file.so LoadModule authz_user_module /ruta/mod_authz_user.so
Por último debemos añadir las directivas para la autenticación local:
AuthType basic AuthUserFile /root/htpasswd AuthName "Se necesita comprobar sus credenciales" Require valid-user
Ejemplo completo de autenticación local (apache2.conf):
ServerRoot /etc/apache2 User www-data Group www-data ErrorLog /var/log/apache2/error.log Listen 80 DocumentRoot /var/www LoadModule dir_module /usr/lib/apache2/modules/mod_dir.so DirectoryIndex index.html LoadModule auth_basic_module /usr/lib/apache2/modules/mod_auth_basic.so LoadModule authn_file_module /usr/lib/apache2/modules/mod_authn_file.so LoadModule authz_user_module /usr/lib/apache2/modules/mod_authz_user.so <Directory /var/www> AuthType basic AuthUserFile /root/htpasswd AuthName "Se necesita comprobar sus credenciales" Require valid-user </Directory>
Autenticación mediante LDAP
Supongamos que se dispone de un directorio LDAP con las siguientes características:
- Dirección IP:
192.168.1.11 - Contexto de cuentas de usuarios:
ou=users,dc=direc,dc=es - DN del administrador:
cn=admin,dc=direc,dc=es
Se recomienda sobremanera comprobar que el directorio está adecuadamente en línea y accesible con los datos correctos (dirección IP y contexto LDAP) antes de configurar la autentificación LDAP para cualquier aplicación:
usuario@servidor# ldapsearch -x -D cn=admin,dc=direc,dc=es -W -h 192.168.1.11 -b ou=users,dc=direc,dc=es -s sub ObjectClass=*
En primer lugar, debemos cargar los módulos necesarios para la autenticación mediante LDAP:
auth_basicauthn_fileauthz_userauthnz_ldap
Ahora debemos utilizar las directivas de autenticación en una sección de directorio. La diferencia con la configuración de la autenticación local es la declaración de la directiva AuthLDAPUrl:
AuthName "Texto" AuthType Basic Require valid-user AuthLDAPUrl ldap://192.168.1.11/ou=users,dc=direc,dc=es?sub?objectclass=*
Aunque la sintaxis pueda parecer impresionante, no se debe al azar o a la imaginación de los desarrolladores. El formato URL LDAP se define en la RFC2255 y se utiliza en algunas aplicaciones.
