Asegurar PHP en un servidor Apache es crucial para proteger tu aplicación web contra vulnerabilidades comunes, como inyecciones SQL, cross-site scripting (XSS), y ejecución remota de código. Aquí tienes una guía detallada para maximizar la seguridad de PHP en un servidor Apache:
1. Actualiza PHP y Apache
Mantén PHP y Apache actualizados: Usa siempre la última versión estable de PHP y Apache, ya que incluyen parches de seguridad.
Elimina versiones antiguas de PHP: Si tienes versiones antiguas instaladas, desinstálalas para evitar riesgos.
2. Configuración Segura de PHP (php.ini
)
El archivo php.ini
es el núcleo de la configuración de PHP. A continuación, las directivas más importantes para mejorar la seguridad:
a. Deshabilitar Funciones Peligrosas
Deshabilita funciones que pueden ser explotadas, como exec
, system
, passthru
, shell_exec
, etc.
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,eval
b. Habilitar Modo Estricto
Habilita el modo estricto para evitar advertencias y errores que puedan exponer información sensible.
display_errors = Off log_errors = On error_reporting = E_ALL
c. Limitar el Tamaño de las Entradas
Establece límites para evitar ataques de denegación de servicio (DoS) o sobrecarga del servidor.
post_max_size = 8M upload_max_filesize = 2M max_input_time = 60 max_execution_time = 30
d. Proteger contra Inyecciones SQL y XSS
Deshabilita magic_quotes_gpc
y magic_quotes_runtime
Las magic_quotes fueron una característica de PHP
diseñada para ayudar a los desarrolladores a prevenir ataques de
inyección SQL, un tipo de vulnerabilidad común en aplicaciones web. Esta
característica, introducida en versiones antiguas de PHP (desde PHP 4
hasta PHP 5.3.0), automáticamente escapaba ciertos caracteres especiales
en las entradas de usuario antes de que estos datos fueran utilizados
en consultas a bases de datos. Sin embargo, esta funcionalidad fue
ampliamente criticada y finalmente eliminada en PHP 5.4.0 debido a sus
problemas inherentes y a la disponibilidad de mejores alternativas.
¿Qué Hacían las Magic Quotes?
Las magic_quotes funcionaban de la siguiente manera:
Escapado Automático: Cuando las magic_quotes estaban habilitadas, PHP automáticamente añadía una barra invertida (
\
) antes de ciertos caracteres especiales en las entradas de usuario, como:Comillas simples (
'
)Comillas dobles (
"
)Barras invertidas (
\
)Caracteres nulos (
\0
)
Ámbito de Aplicación:
magic_quotes_gpc: Afectaba a los datos provenientes de las superglobales
$_GET
,$_POST
y$_COOKIE
.magic_quotes_runtime: Escapaba los datos generados o leídos desde archivos o bases de datos durante la ejecución del script.
magic_quotes_sybase: Cambiaba el comportamiento de las magic_quotes para usar un estilo de escapado compatible con Sybase (usando
''
en lugar de\'
).
Si te encuentras con código antiguo que depende de las magic_quotes, es importante actualizarlo para eliminar esta dependencia.
magic_quotes_gpc = Off magic_quotes_runtime = Off magic_quotes_sybase = Off
e. Restringir el Acceso a Archivos
Usa open_basedir
para limitar el acceso de PHP a directorios específicos.
open_basedir = /var/www/dominio1:/tmp
f. Deshabilitar la Ejecución Remota de Código
Evita que PHP incluya archivos remotos.
allow_url_fopen = Off allow_url_include = Off
g. Habilitar session.cookie_httponly
y session.cookie_secure
Protege las cookies de sesión contra ataques XSS y asegúrate de que solo se envíen sobre HTTPS.
session.cookie_httponly = 1 session.cookie_secure = 1
3. Configuración de Apache para PHP
Asegura la integración de PHP con Apache mediante las siguientes prácticas:
a. Usar Módulos de Seguridad
Habilita
mod_security
para proteger contra ataques comunes.Habilita
mod_evasive
para prevenir ataques DDoS.
b. Restringir el Acceso a Archivos Sensibles
Bloquea el acceso a archivos sensibles como php.ini
, .htaccess
, y archivos de configuración.
<FilesMatch "\.(ini|htaccess|log|sh|sql)$"> Require all denied </FilesMatch>
c. Deshabilitar la Lista de Directorios
Evita que Apache muestre el contenido de los directorios.
Options -Indexes
d. Configurar Headers de Seguridad
Agrega headers de seguridad para proteger contra XSS, clickjacking, y MIME sniffing.
Header set X-Content-Type-Options "nosniff" Header set X-Frame-Options "DENY" Header set X-XSS-Protection "1; mode=block" Header set Content-Security-Policy "default-src 'self'"
4. Proteger las Sesiones de PHP
Cambia el nombre de la cookie de sesión: Evita usar el nombre predeterminado
PHPSESSID
.session.name = MiSesionSegura
Usa almacenamiento seguro para sesiones: Almacena las sesiones en un directorio seguro con permisos restringidos.
session.save_path = /var/lib/php/sessions
Regenera el ID de sesión: Regenera el ID de sesión después de un inicio de sesión exitoso.
session_regenerate_id(true);
5. Validar y Sanitizar Entradas de Usuario
Usa funciones de filtrado: Valida y sanitiza todas las entradas de usuario con
filter_var
yfilter_input
.$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
Prepara consultas SQL: Usa PDO o MySQLi con consultas preparadas para evitar inyecciones SQL.
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $email]);
6. Configurar HTTPS
Usa certificados SSL/TLS: Configura Apache para servir PHP solo sobre HTTPS.
Redirige HTTP a HTTPS: Asegúrate de que todo el tráfico se redirija a HTTPS.
<VirtualHost *:80> ServerName dominio.com Redirect permanent / https://dominio.com/ </VirtualHost>
7. Monitoreo y Registro de Actividad
Habilita logs de PHP: Registra errores y actividad sospechosa.
error_log = /var/log/php_errors.log
Monitorea los logs de Apache: Usa herramientas como
fail2ban
para bloquear IPs maliciosas.
8. Usar un Firewall de Aplicación Web (WAF)
Instala un WAF: Usa herramientas como ModSecurity para proteger contra ataques comunes.
Configura reglas personalizadas: Ajusta las reglas del WAF según las necesidades de tu aplicación.
9. Aislamiento de Procesos
Usa
chroot
o Docker: Aísla PHP en un entorno restringido para limitar el acceso al sistema de archivos.Ejecuta PHP con un usuario dedicado: Usa un usuario sin privilegios para ejecutar PHP.
10. Pruebas de Seguridad
Escanea vulnerabilidades: Usa herramientas como OWASP ZAP o Nikto para identificar vulnerabilidades.
Realiza pruebas de penetración: Contrata a expertos en seguridad para evaluar tu aplicación.
Resumen de Configuraciones Clave en php.ini
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,eval display_errors = Off log_errors = On error_reporting = E_ALL post_max_size = 8M upload_max_filesize = 2M max_input_time = 60 max_execution_time = 30 open_basedir = /var/www/dominio1:/tmp allow_url_fopen = Off allow_url_include = Off session.cookie_httponly = 1 session.cookie_secure = 1
magic_quotes_gpc = Off magic_quotes_runtime = Off magic_quotes_sybase = Off
Siguiendo estas prácticas, puedes maximizar la seguridad de PHP en tu servidor Apache y proteger tu aplicación contra amenazas comunes.