← Volver al inicio
Apache PHP.ini Hardening security.conf Sysadmin Blue Team
Intermedio

Hardening de Apache y PHP

11/05/2022

La seguridad por defecto de un servidor web suele priorizar la compatibilidad sobre la protección. El Hardening (Endurecimiento) consiste en reducir la superficie de ataque deshabilitando módulos innecesarios, ocultando información del sistema y mitigando vectores web comunes. A continuación, exploraremos los tres pilares de configuración en un entorno LAMP (Linux, Apache, MySQL, PHP).

1. apache2.conf — El Núcleo de Apache (/etc/apache2/apache2.conf)

Define el comportamiento general del servidor, el control de conexiones y los permisos de los directorios raíz.

Control de Conexiones (Mitigación DoS)

Timeout 60
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

Restricción de Directorios (Prevenir Path Traversal)

Por defecto, Apache debe denegar el acceso a la raíz del sistema de archivos (/) y solo permitir el acceso a /var/www/html.

# Bloquear el acceso a todo el disco duro del servidor
<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>

# Configuración segura para la carpeta pública
<Directory /var/www/html>
    # El símbolo MENOS (-) desactiva el listado de archivos si no hay index.html
    Options -Indexes +FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

2. security.conf — Cabeceras y Firmas (/etc/apache2/conf-available/security.conf)

Aquí controlamos qué le cuenta Apache al mundo exterior. Ocultar información dificulta el trabajo a herramientas como Nmap o Nikto.

Ocultación de Versiones

# MAL: Muestra "Apache/2.4.41 (Ubuntu)"
ServerTokens OS
ServerSignature On

# BIEN: Solo muestra "Apache" y desactiva el pie de página
ServerTokens Prod
ServerSignature Off

# Evitar ataques de Cross-Site Tracing (XST)
TraceEnable Off

🔴 Simulador de Hardening (Sysadmin)

Un escáner de vulnerabilidades acaba de destrozar nuestro entorno de Staging. El reporte indica listado de directorios activo, fuga de versión del SO y ejecución de comandos PHP habilitada. Como Sysadmin, audita y parchea los archivos de configuración para asegurar el despliegue a Producción.

>_ INICIAR RETO CTF 23

Inyección de Cabeceras de Seguridad HTTP

Se requiere activar el módulo headers (a2enmod headers) para proteger a los usuarios de ataques en el lado del cliente (Client-Side).

# Prevenir Clickjacking (Cargar la web en un iframe invisible)
Header set X-Frame-Options: "SAMEORIGIN"

# Prevenir MIME Sniffing
Header set X-Content-Type-Options: "nosniff"

# HSTS: Obligar a los navegadores a usar siempre HTTPS
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"

3. php.ini — Fortificando el Intérprete (/etc/php/8.1/apache2/php.ini)

PHP es un lenguaje muy permisivo. Debemos bloquear funciones que permitan a un atacante ejecutar comandos del sistema (RCE) si consiguen subir una webshell.

Fugas de Información y Errores

# Oculta la cabecera HTTP "X-Powered-By: PHP/8.1.2"
expose_php = Off

# Los errores detallados (stack traces) JAMÁS deben verse en Producción
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php_errors.log

Deshabilitar Funciones Peligrosas (RCE Prevention)

Si la aplicación no necesita interactuar con el sistema operativo, estas funciones deben morir.

disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source

Seguridad de Sesiones y Cookies

Evitar el secuestro de sesiones (Session Hijacking) y la fijación de sesiones.

; Usar modo estricto y evitar paso de ID por URL
session.use_strict_mode = 1
session.use_only_cookies = 1

; Proteger la cookie del acceso mediante JavaScript (Mitiga XSS)
session.cookie_httponly = 1

; Enviar la cookie SOLO si la conexión es HTTPS
session.cookie_secure = 1