Servidor Apache2
Lara y Amin retomaron el viaje pero sus pensamientos no se apartaban de servidor
Necesitaban que su existencia fuera conocida, que su conocimiento sirviera de faro.
Amin, con la mirada fija en el polvo que levantaban, comprendió. "Una página web. Un lugar donde otros como nosotros puedan encontrarnos. Un repositorio de la información que aún existe, una guía para los que buscan reconstruir."
Exacto," respondió Lara, y para eso, necesitaremos a Apache2, el guardián de las páginas web del viejo mundo."
Su próxima parada sería para configurar Apache2, no solo para que el servidor hablara, sino para que lo hiciera de forma segura y robusta.
Instalación de Apache2
Llegaron a un campamento improvisado, un lugar con cierta protección contra los elementos y, crucialmente, con una fuente de energía estable. Era el momento de dar voz al servidor
No bastaba con instalarlo; necesitaban que gestionara la web de forma independiente y segura.
┌──(lara㉿kali)-[~]
└─$ ssh amin@192.168.8.101
amin@1-bytepath:~$ sudo apt update
Hit:1 http://deb.debian.org/debian bookworm InRelease
Hit:2 http://deb.debian.org/debian bookworm-updates InRelease
Hit:3 http://deb.debian.org/debian-security bookworm-security InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
amin@1-bytepath:~$ sudo apt install apache2 -y
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
apache2-bin apache2-data apache2-utils libapr1 libaprutil1 libaprutil1-dbd-sqlite3
libaprutil1-ldap liblua5.3-0 libxml2 mailcap media-types
Suggested packages:
apache2-doc apache2-suexec-pristine | apache2-suexec-custom
The following NEW packages will be installed:
apache2 apache2-bin apache2-data apache2-utils libapr1 libaprutil1
libaprutil1-dbd-sqlite3 libaprutil1-ldap liblua5.3-0 libxml2 mailcap
media-types
0 upgraded, 12 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,985 kB of archives.
.........
Created symlink /etc/systemd/system/multi-user.target.wants/apache2.service → /lib/systemd/system/apache2.service.
Processing triggers for man-db (2.11.2-1) ...
Processing triggers for libc-bin (2.36-9+deb12u3) ...
Creación de un Host Virtual
Con Apache2 instalado, el siguiente paso era configurar un Host Virtual. Aunque Apache2 viene con una configuración por defecto, Lara sabía que para su propósito de crear una guía digital y un punto de contacto, necesitarían un espacio dedicado. Un Host Virtual les permitiría alojar su propio sitio web con su propia configuración, aislado de futuras páginas que pudieran añadir. Sería el 'hogar' digital de su manifiesto.
Primero, crear el directorio para el nuevo sitio:
amin@1-bytepath:<~$ sudo mkdir /var/www/thebytepathchronicles
Luego, Lara asignaría los permisos correctos a este nuevo directorio para que Apache2 pudiera leer sus archivos y el usuario de Amin pudiera gestionarlos.
Tras asignar www-data como usuario y grupo propietario, añadió a amin al grupo www-data y asigno a este grupo permisos de escritura.
amin@1-bytepath:~$ sudo chown -R www-data:www-data /var/www/thebytepathchronicles
amin@1-bytepath:~$ sudo usermod -a -G www-data amin
amin@1-bytepath:~$ sudo chmod -R 775 /var/www/thebytepathchronicles
Ahora, Lara crearía el archivo de configuración del Host Virtual. Copiaría la plantilla por defecto para empezar.
amin@1-bytepath:~$ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/thebytepathchronicles.conf
Y, finalmente, editaría el nuevo archivo de configuración para el Host Virtual.
amin@1-bytepath:~$ sudo nano /etc/apache2/sites-available/thebytepathchronicles.conf
# CONTENIDO DEL ARCHIVO /etc/apache2/sites-available/thebytepathchronicles.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/thebytepathchronicles
# Domain Name and Aliases
# ServerName thebytepathchronicles.com # Si tuvieran un dominio
# ServerAlias www.thebytepathchronicles.com
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/thebytepathchronicles>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
Explicación de las configuraciones clave del Host Virtual:
-
- ServerAdmin webmaster@localhost: Define la dirección de correo electrónico del administrador del servidor (un placeholder por ahora).
- DocumentRoot /var/www/thebytepathchronicles: Esta es la línea más importante. Le dice a Apache dónde encontrar los archivos de la página web (la "raíz de documentos") para este host virtual.
- ErrorLog y CustomLog: Especifican dónde Apache2 debe guardar los registros de errores y accesos para este sitio.
-
: Este bloque configura opciones específicas para el directorio DocumentRoot. - Options Indexes FollowSymLinks: Indexes es importante aquí. Permite que, si no hay un index.html u otro archivo por defecto, Apache muestre una lista de los archivos en el directorio. (Más adelante lo deshabilitaremos por seguridad).
- FollowSymLinks permite seguir enlaces simbólicos.
- AllowOverride None: Impide que los archivos .htaccess sobrescriban las configuraciones del servidor. Esto es más seguro por defecto, pero limita la flexibilidad para configuraciones a nivel de directorio por parte del usuario.
- Require all granted: Permite el acceso a todos los usuarios a este directorio.
Después de guardar el archivo de configuración del Host Virtual, Lara tuvo que habilitarlo y deshabilitar el sitio por defecto de Apache para evitar conflictos.
amin@1-bytepath:~$ sudo a2ensite thebytepathchronicles.conf
Enabling site thebytepathchronicles.
To activate new configuration, you need to run:
systemctl reload apache2
amin@1-bytepath:~$ sudo a2dissite 000-default.conf
Disabling site 000-default.
To activate new configuration, you need to run:
systemctl reload apache2
amin@1-bytepath:~$ sudo systemctl reload apache2
Habilitación de Módulos Esenciales de Apache2
Para su blog, Lara y Amin sabían que necesitarían equipar su servidor con funcionalidades específicas que optimizaran el rendimiento y la seguridad. Era la ventaja de la modularidad: cargar solo lo esencial para mantener el sistema ligero y robusto.
Tenemos el esqueleto del servidor web', dijo Lara, 'pero necesitamos darle agilidad y proteger su piel.'
Amin asintió. '¿Qué módulos son clave para nuestra guía digital?'
'Hay varios', respondió Lara. 'Pero nos centraremos en tres fundamentales que nos darán un buen equilibrio: mod_headers para las cabeceras de seguridad, mod_deflate para comprimir el contenido y acelerar la carga, y mod_expires para gestionar la caché del navegador.'"
Antes de empezar, Lara decidió inspeccionar qué módulos estaban disponibles y cuáles ya activos en Apache. Era como revisar el inventario de herramientas antes de empezar a trabajar."
amin@1-bytepath:~$ pache2ctl -M
Loaded Modules:
core_module (static)
so_module (static)
watchdog_module (static)
http_module (static)
mpm_event_module (static)
authz_host_module (shared)
authz_core_module (shared)
authn_core_module (shared)
authn_file_module (shared)
access_compat_module (shared)
auth_basic_module (shared)
reqtimeout_module (shared)
filter_module (shared)
mime_module (shared)
log_config_module (shared)
env_module (shared)
setenvif_module (shared)
version_module (shared)
unixd_module (shared)
status_module (shared)
autoindex_module (shared)
dir_module (shared)
alias_module (shared)
# ... (lista de módulos disponibles y/o habilitados) ...
Módulo mod_headers: Reforzando la Seguridad
El primer módulo que Lara activaría sería mod_headers. 'Este es como añadir un sello de seguridad a cada paquete que enviamos', explicó Lara. 'Nos permite controlar la información que nuestro servidor comparte con los navegadores, y podemos usarlo para evitar que ciertos tipos de ataques ni siquiera empiecen.'
amin@1-bytepath:~$ sudo a2enmod headers
Enabling module headers.
To activate new configuration, you need to run:
systemctl reload apache2
amin@1-bytepath:~$ sudo systemctl reload apache2
Módulo mod_deflate: Acelerando la Entrega
Después de mod_headers, Lara se centró en la velocidad. 'La gente está usando terminales de todo tipo, y la conectividad no es lo que era', comentó. 'Cada byte cuenta. mod_deflate nos ayudará a comprimir el contenido como HTML, CSS y JavaScript antes de enviarlo. Menos datos, cargas más rápidas.'
amin@1-bytepath:~$ sudo a2enmod deflate
Enabling module deflate.
To activate new configuration, you need to run:
systemctl reload apache2
amin@1-bytepath:~$ sudo systemctl reload apache2
La habilitación del módulo es solo el primer paso", continuó Lara. 'Ahora necesitamos decirle a mod_deflate qué tipos de archivos debe comprimir. Crearemos un archivo de configuración específico para ello, manteniéndolo ordenado y separado.'
amin@1-bytepath:~$ sudo nano /etc/apache2/conf-available/deflate.conf
# CONTENIDO DEL ARCHIVO /etc/apache2/conf-available/deflate.conf
<IfModule mod_deflate.c>
# Comprimir archivos de texto, HTML, CSS, JavaScript, XML, JSON, etc.
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
# Nivel de compresión (1-9, siendo 9 la máxima compresión)
# DeflateCompressionLevel 9
# Excluir algunos navegadores antiguos con problemas de compresión
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>
Explicación de las configuraciones clave en deflate.conf:
-
: Esta directiva asegura que las configuraciones solo se apliquen si mod_deflate está cargado. - DEFLATE ...: Estas líneas le dicen a Apache qué tipos de contenido (MIME types) debe comprimir antes de enviarlos. Incluyen tipos comunes como HTML, CSS, JavaScript, y XML.
- DeflateCompressionLevel: (Comentado, pero importante de mencionar) Define el nivel de compresión. Un nivel más alto significa mayor compresión pero mayor uso de CPU. Lara optó por la configuración por defecto de Apache para empezar, que es un buen equilibrio.
- BrowserMatch: Estas líneas son para la compatibilidad con navegadores antiguos que podrían tener problemas con la compresión GZIP.
'Una vez configurado el módulo', dijo Lara, 'hay que decirle a Apache que lo use.'
amin@1-bytepath:~$ sudo a2enconf deflate.conf
Enabling conf deflate.
To activate new configuration, you need to run:
systemctl reload apache2
amin@1-bytepath:~$ sudo systemctl reload apache2
amin@1-bytepath:~$
Módulo mod_expires: Optimizando la Caché del Navegador
El último módulo que Lara consideró esencial para el rendimiento de su blog fue mod_expires. 'Imagina que alguien visita nuestra guía', explicó. 'No queremos que su navegador tenga que descargar las mismas imágenes o archivos CSS cada vez. mod_expires le dirá a su navegador cuánto tiempo puede guardar esos archivos en su caché local. Esto no solo hace que el sitio se sienta instantáneo para visitas repetidas, sino que también reduce la carga de nuestro servidor.'
amin@1-bytepath:~$ sudo a2enmod expires
Enabling module expires.
To activate new configuration, you need to run:
systemctl reload apache2
amin@1-bytepath:~$ sudo systemctl reload apache2
amin@1-bytepath:~$
'Y, como con mod_deflate, este módulo también necesita su propia configuración', continuó Lara. 'Crearemos expires.conf para detallar las políticas de caché.'
amin@1-bytepath:~$ sudo nano /etc/apache2/conf-available/expires.conf
# CONTENIDO DEL ARCHIVO /etc/apache2/conf-available/expires.conf
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 month"
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/webp "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
</IfModule>
Explicación de las configuraciones clave en expires.conf:
- <IfModule mod_expires.c>: Como antes, asegura que las directivas se apliquen solo si el módulo está activo.
- ExpiresActive On: Activa la funcionalidad de mod_expires.
- ExpiresDefault "access plus 1 month": Establece una política de caché predeterminada para todos los archivos no especificados: expiran después de un mes desde su último acceso.
- ExpiresByType ...: Estas líneas personalizan las políticas de caché para tipos de archivos específicos:
- text/html "access plus 0 seconds": Los archivos HTML (la página principal del blog) no se cachean o se consideran "frescos" solo por un instante, forzando al navegador a verificar si hay una nueva versión cada vez. Esto es bueno para contenido dinámico o que cambia a menudo.
- text/css, application/javascript: Archivos CSS y JavaScript se cachean durante una semana, ya que no suelen cambiar tan a menudo.
- image/jpeg, image/png, image/gif, image/webp, image/x-icon: Las imágenes y los iconos se cachean durante un mes, dado que suelen ser estáticas y no cambian frecuentemente.
'Con las políticas de caché definidas, el último paso es activarlas,' dijo Lara.
amin@1-bytepath:~$ sudo a2enconf expires.conf
Enabling conf expires.
To activate new configuration, you need to run:
systemctl reload apache2
amin@1-bytepath:~$ sudo apache2ctl configtest
Syntax OK
amin@1-bytepath:~$ sudo systemctl reload apache2
Antes de recargar, Lara ejecutó una prueba de sintaxis para asegurarse de que no hubiera errores en la configuración de Apache, obteniendo un tranquilizador Syntax OK. Este es un paso de seguridad vital antes de aplicar cambios importantes.
El servidor ahora no solo estaba protegido por UFW y Fail2ban, sino que Apache2 estaba listo para servir su contenido de manera eficiente y con las bases de seguridad necesarias.