Herramientas de usuario

Herramientas del sitio


informatica:certificaciones:lpic:lpic-2:208_web_services:208.1_implementing_a_web_server

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
    • .htaccess
    • httpd.conf
    • mod_auth_basic, mod_authz_host and mod_access_compat
    • htpasswd
    • AuthUserFile, AuthGroupFile
    • apachectl, apache2ctl
    • httpd, 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 son APACHE_RUN_USER y APACHE_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. AuthType sería el nombre de la directiva y Basic su 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/stop
    • systemctl 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 servicio
    • apachectl -t: Validación de sintaxis
    • apachectl -k stop: Parada del servicio.
    • apachectl -k start: Arranque del servicio
    • apache2 -t: Validación de sintaxis.
    • apache2 -k stop: Parada del servicio
    • apache2 -k start: Arranque del servicio
    • apache2ctl -t: Validación de sintaxis.
    • apache2ctl -k start: Arranque del servicio
    • apache2ctl -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 -l Visualización de módulos compilados.
  • apache2 -M Visualizació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 .htaccess
  • none: Los archivos .htaccess son ignorados
  • AuthConfig: 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_basic
  • authn_file
  • authz_user
  • authnz_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.

informatica/certificaciones/lpic/lpic-2/208_web_services/208.1_implementing_a_web_server.txt · Última modificación: por tempwin