// Índice de contenidos
Un servidor expuesto a Internet recibe ataques constantes. Bots automatizados escanean puertos, intentan fuerza bruta contra SSH y paneles de control, y buscan vulnerabilidades en aplicaciones web. Sin medidas de seguridad adecuadas, es cuestión de tiempo hasta que un atacante encuentre una entrada.
HestiaCP incluye herramientas de seguridad integradas: firewall basado en iptables, Fail2ban para bloquear intentos de intrusión, y soporte para autenticación de dos factores. Pero la configuración por defecto no es suficiente para un servidor de producción.
En esta guía te muestro cómo fortificar tu servidor HestiaCP con las mejores prácticas de seguridad. Desde cambiar el puerto SSH hasta configurar reglas de firewall personalizadas, cada paso reduce significativamente la superficie de ataque.
Estado de seguridad actual
Antes de hacer cambios, evalúa la seguridad actual de tu servidor.
Verificar servicios instalados
# Ver qué servicios de seguridad están activos
v-list-sys-services | grep -E "iptables|fail2ban"
Deberías ver ambos como “running”.
Ver puertos abiertos
# Puertos escuchando
ss -tlnp
# O con netstat
netstat -tlnp
Puertos típicos de HestiaCP:
| Puerto | Servicio | Necesario |
|---|---|---|
| 22 | SSH | Sí (cambiar) |
| 80 | HTTP | Sí |
| 443 | HTTPS | Sí |
| 8083 | Panel HestiaCP | Sí (cambiar) |
| 3306 | MySQL | Solo local |
| 25, 465, 587 | SMTP | Si usas email |
| 110, 143, 993, 995 | POP3/IMAP | Si usas email |
| 53 | DNS | Si usas DNS |
Ver IPs baneadas actualmente
# Listar IPs bloqueadas por Fail2ban
fail2ban-client status
# Ver detalles de un jail específico
fail2ban-client status hestia-iptables
Configurar el firewall
HestiaCP usa iptables con una interfaz gráfica para gestionar reglas.
Ver reglas actuales
Desde el panel como admin:
- Ve a Server → Firewall
- Verás las reglas activas organizadas por acción (ACCEPT, DROP)
Por CLI:
# Listar reglas de HestiaCP
v-list-firewall
# Ver iptables directamente
iptables -L -n -v
Añadir regla para permitir IP
Si necesitas whitelist para una IP específica (oficina, casa, etc.):
Desde el panel:
- Server → Firewall → Add Rule
- Action: ACCEPT
- Protocol: TCP (o UDP según necesites)
- Port: El puerto a permitir (o rango como 1:65535 para todo)
- IP: La IP a permitir
- Comment: Descripción (ej: “Oficina Madrid”)
- Save
Por CLI:
# Permitir IP específica a todo
v-add-firewall-rule ACCEPT 0 tcp 1.2.3.4
# Permitir IP a puerto específico
v-add-firewall-rule ACCEPT 22 tcp 1.2.3.4 "SSH desde oficina"
Bloquear IP manualmente
# Bloquear IP
v-add-firewall-ban 1.2.3.4 HESTIA
# Desbloquear
v-delete-firewall-ban 1.2.3.4
Reglas recomendadas
| Acción | Puerto | Protocolo | IP | Comentario |
|---|---|---|---|---|
| ACCEPT | 80 | TCP | 0.0.0.0/0 | HTTP público |
| ACCEPT | 443 | TCP | 0.0.0.0/0 | HTTPS público |
| ACCEPT | 22 | TCP | TU_IP | SSH solo tu IP |
| ACCEPT | 8083 | TCP | TU_IP | Panel solo tu IP |
| DROP | 3306 | TCP | 0.0.0.0/0 | Bloquear MySQL externo |
Configurar reglas por defecto
Edita /usr/local/hestia/data/firewall/rules.conf para reglas persistentes.
Configurar Fail2ban
Fail2ban monitoriza logs y banea IPs que muestran comportamiento malicioso.
Jails activos por defecto
HestiaCP configura estos jails automáticamente:
| Jail | Protege | Log monitoreado |
|---|---|---|
| hestia-iptables | Panel HestiaCP | /var/log/hestia/auth.log |
| sshd | SSH | /var/log/auth.log |
| exim-iptables | SMTP | /var/log/exim4/mainlog |
| dovecot-iptables | IMAP/POP3 | /var/log/dovecot.log |
| vsftpd-iptables | FTP | /var/log/vsftpd.log |
| phpmyadmin-iptables | phpMyAdmin | /var/log/roundcube/errors |
Ver estado de Fail2ban
# Estado general
fail2ban-client status
# Estado de jail específico
fail2ban-client status sshd
# IPs baneadas en un jail
fail2ban-client get sshd banned
Configurar tiempos de baneo
Edita /etc/fail2ban/jail.local:
[DEFAULT]
# Tiempo de baneo (10 minutos por defecto, recomiendo más)
bantime = 1h
# Ventana de tiempo para contar intentos
findtime = 10m
# Intentos antes de banear
maxretry = 5
# IPs que nunca se banean (tu IP, localhost)
ignoreip = 127.0.0.1/8 ::1 TU_IP_FIJA
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 24h
[hestia-iptables]
enabled = true
filter = hestia
action = hestia[name=HESTIA]
logpath = /var/log/hestia/auth.log
maxretry = 5
bantime = 12h
[exim-iptables]
enabled = true
filter = exim
action = hestia[name=MAIL]
logpath = /var/log/exim4/mainlog
maxretry = 5
findtime = 1h
bantime = 12h
Reiniciar Fail2ban
systemctl restart fail2ban
# Verificar que funciona
fail2ban-client status
Desbanear IP
Si te baneas accidentalmente:
# Desde otro servidor o consola de emergencia
fail2ban-client unban 1.2.3.4
# O unban de todo
fail2ban-client unban --all
Añadir jail para WordPress
Crea /etc/fail2ban/filter.d/wordpress.conf:
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
^<HOST> .* "POST /xmlrpc.php
ignoreregex =
Añade a /etc/fail2ban/jail.local:
[wordpress]
enabled = true
filter = wordpress
logpath = /var/log/apache2/*access.log
/var/log/nginx/*access.log
maxretry = 5
findtime = 5m
bantime = 1h
Asegurar SSH
SSH es el objetivo principal de ataques de fuerza bruta.
Cambiar puerto SSH
Edita /etc/ssh/sshd_config:
# Cambiar de 22 a otro puerto (ej: 2222)
Port 2222
Actualiza el firewall antes de reiniciar:
# Añadir nuevo puerto
v-add-firewall-rule ACCEPT 2222 tcp 0.0.0.0/0 "SSH nuevo puerto"
# Reiniciar SSH
systemctl restart sshd
# Probar conexión en NUEVA terminal antes de cerrar la actual
ssh -p 2222 usuario@servidor
# Si funciona, eliminar regla del puerto 22
v-delete-firewall-rule [ID_REGLA_PUERTO_22]
Deshabilitar login root
# En /etc/ssh/sshd_config
PermitRootLogin no
Crea un usuario sudo primero:
# Crear usuario
adduser admin
# Añadir a sudo
usermod -aG sudo admin
# Probar acceso antes de deshabilitar root
Autenticación por clave SSH
# En tu ordenador local, generar clave
ssh-keygen -t ed25519 -C "[email protected]"
# Copiar clave al servidor
ssh-copy-id -p 2222 usuario@servidor
# Verificar que funciona con clave
ssh -p 2222 usuario@servidor
# Deshabilitar login por contraseña (en /etc/ssh/sshd_config)
PasswordAuthentication no
Configuración SSH recomendada
# /etc/ssh/sshd_config
Port 2222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers tuusuario admin
Autenticación de dos factores (2FA)
HestiaCP soporta 2FA para el panel de administración.
Activar 2FA
- Inicia sesión en HestiaCP
- Haz clic en tu nombre de usuario (arriba derecha)
- Haz clic en Edit User
- Busca la sección Two-Factor Authentication
- Haz clic en Enable 2FA
- Escanea el código QR con tu app (Google Authenticator, Authy, etc.)
- Introduce el código para verificar
- Guarda los códigos de respaldo en lugar seguro
Apps recomendadas para 2FA
| App | Plataforma | Característica |
|---|---|---|
| Authy | iOS, Android, Desktop | Backup en la nube |
| Google Authenticator | iOS, Android | Simple, sin cuenta |
| 1Password | Todas | Integrado con gestor |
| Bitwarden | Todas | Open source |
Recuperar acceso si pierdes 2FA
Si pierdes acceso al 2FA:
# Deshabilitar 2FA por CLI
v-delete-user-2fa admin
Necesitas acceso SSH al servidor.
Seguridad gestionada para ti
El VPS HestiaCP Administrado incluye configuración de seguridad optimizada, monitorización 24/7 y actualizaciones automáticas de seguridad.
Cambiar puerto del panel HestiaCP
El puerto 8083 es conocido. Cambiarlo reduce ataques automatizados.
Cambiar puerto
# Cambiar a puerto personalizado (ej: 2083)
v-change-sys-port 2083
Actualizar firewall
# Añadir nuevo puerto
v-add-firewall-rule ACCEPT 2083 tcp 0.0.0.0/0 "Panel HestiaCP"
# Opcional: eliminar regla del 8083
Acceder al nuevo puerto
https://tudominio.com:2083
O mejor, configura un subdominio con SSL:
- Crea subdominio
panel.tudominio.com - Apúntalo al servidor
- Configura proxy reverso a localhost:2083
- Accede por
https://panel.tudominio.com
Proteger servicios web
Headers de seguridad
Añade a la configuración de Nginx/Apache:
# Headers de seguridad para Nginx
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;
Ocultar versiones
# En nginx.conf
server_tokens off;
# En apache2.conf
ServerTokens Prod
ServerSignature Off
Proteger WordPress
Medidas específicas para WordPress:
- Cambiar prefijo de tablas (durante instalación)
- Limitar intentos de login (plugin Limit Login Attempts)
- Deshabilitar XML-RPC si no lo usas:
// En functions.php o plugin
add_filter('xmlrpc_enabled', '__return_false');
- Deshabilitar editor de temas/plugins:
// En wp-config.php
define('DISALLOW_FILE_EDIT', true);
- Cambiar URL de login (plugin WPS Hide Login)
Proteger directorios sensibles
En .htaccess o configuración Nginx:
# Bloquear acceso a wp-config.php
location ~ /wp-config\.php$ {
deny all;
}
# Bloquear acceso a .htaccess
location ~ /\.ht {
deny all;
}
# Bloquear acceso a archivos de backup
location ~ \.(sql|bak|old|orig)$ {
deny all;
}
Seguridad de bases de datos
MySQL no debe ser accesible externamente
Verifica que MySQL solo escucha en localhost:
# Verificar binding
grep bind-address /etc/mysql/mariadb.conf.d/50-server.cnf
Debe mostrar bind-address = 127.0.0.1.
Contraseñas seguras
HestiaCP genera contraseñas automáticamente, pero si creas manualmente:
# Generar contraseña segura
openssl rand -base64 24
Usuarios con privilegios mínimos
Cada sitio debería tener su propio usuario de base de datos con acceso solo a su base de datos.
HestiaCP hace esto automáticamente al crear bases de datos por usuario.
Actualizaciones automáticas de seguridad
Habilitar unattended-upgrades
# Instalar si no está
apt install unattended-upgrades
# Configurar
dpkg-reconfigure unattended-upgrades
Edita /etc/apt/apt.conf.d/50unattended-upgrades:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESM:${distro_codename}-infra-security";
};
// Reiniciar automáticamente si es necesario
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";
Actualizar HestiaCP
# Ver versión actual
v-list-sys-hestia-updates
# Actualizar HestiaCP
v-update-sys-hestia
Script de actualización semanal
Crea /root/scripts/weekly-update.sh:
#!/bin/bash
apt update
apt upgrade -y
apt autoremove -y
v-update-sys-hestia
Añade al cron:
# Cada domingo a las 4:00
0 4 * * 0 /root/scripts/weekly-update.sh >> /var/log/weekly-update.log 2>&1
Monitorización de seguridad
Logs importantes
| Log | Ruta | Qué buscar |
|---|---|---|
| Auth | /var/log/auth.log | Intentos SSH fallidos |
| Fail2ban | /var/log/fail2ban.log | IPs baneadas |
| HestiaCP | /var/log/hestia/ | Logins al panel |
| Nginx | /var/log/nginx/ | Errores 4xx, 5xx |
| Apache | /var/log/apache2/ | Errores y accesos |
Comandos útiles de monitorización
# Intentos de login fallidos SSH
grep "Failed password" /var/log/auth.log | tail -20
# IPs más baneadas hoy
grep "Ban" /var/log/fail2ban.log | grep $(date +%Y-%m-%d) | awk '{print $NF}' | sort | uniq -c | sort -rn | head
# Peticiones sospechosas a web
grep -E "(wp-login|xmlrpc|admin)" /var/log/nginx/access.log | tail -20
# Conexiones actuales por IP
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head
Alertas por email
Configura logwatch para reportes diarios:
apt install logwatch
# Configurar email
echo "MailTo = [email protected]" >> /etc/logwatch/conf/logwatch.conf
echo "Detail = Med" >> /etc/logwatch/conf/logwatch.conf
Monitorización incluida
El VPS HestiaCP Administrado incluye monitorización proactiva de seguridad. Detectamos y bloqueamos amenazas antes de que afecten tu sitio.
Checklist de seguridad
Configuración inicial (hacer una vez)
- Cambiar puerto SSH (de 22 a otro)
- Deshabilitar login root por SSH
- Configurar autenticación por clave SSH
- Cambiar puerto del panel HestiaCP
- Activar 2FA para usuarios admin
- Configurar Fail2ban con tiempos de baneo largos
- Whitelist de IPs de administración
- Deshabilitar MySQL remoto
Configuración por sitio
- SSL/HTTPS activo
- Headers de seguridad configurados
- WordPress hardening (si aplica)
- Permisos de archivos correctos (755 dirs, 644 files)
- Usuario de base de datos separado
Mantenimiento regular
- Actualizaciones de sistema (semanal)
- Actualizar HestiaCP cuando haya versión
- Revisar logs de Fail2ban
- Verificar backups funcionan
- Rotar contraseñas (trimestral)
Preguntas frecuentes
¿HestiaCP es seguro por defecto?
HestiaCP incluye firewall y Fail2ban, pero la configuración por defecto es conservadora. Para producción, necesitas ajustar tiempos de baneo, cambiar puertos estándar y añadir 2FA.
¿Cómo me desbaneo si me bloqueo?
Necesitas acceso alternativo: consola de emergencia del proveedor VPS, otra IP, o acceso físico. Luego ejecuta `fail2ban-client unban TU_IP`.
¿Debo bloquear todo el tráfico excepto puertos específicos?
Depende. Para un servidor web estándar, permite solo 80, 443, SSH (puerto personalizado) y panel (puerto personalizado). Bloquea todo lo demás.
¿ClamAV es necesario?
ClamAV escanea archivos en busca de malware. Consume recursos pero es útil si aceptas uploads de usuarios. Para blogs simples, puedes prescindir.
¿Cómo protejo contra DDoS?
HestiaCP no tiene protección DDoS. Para eso necesitas Cloudflare (gratis para básico) o servicios especializados. El firewall solo ayuda contra ataques de bajo volumen.
¿Es seguro usar FTP?
FTP transmite credenciales en texto plano. Usa SFTP (SSH File Transfer Protocol) que va cifrado. HestiaCP soporta ambos.
¿Qué hago si creo que me hackearon?
No entres en pánico. Desconecta el servidor, revisa logs, busca cambios recientes, restaura desde backup limpio y cambia todas las contraseñas.
¿ModSecurity vale la pena?
ModSecurity es un WAF que protege contra ataques web. Requiere configuración cuidadosa para evitar falsos positivos. Para WordPress, plugins como Wordfence son más fáciles.
Conclusión
La seguridad es un proceso continuo, no una configuración única. Los pasos más importantes son:
- Cambiar puertos por defecto (SSH, panel)
- Configurar Fail2ban agresivamente (baneos largos)
- Usar autenticación fuerte (claves SSH + 2FA)
- Mantener todo actualizado
- Monitorizar logs regularmente
Si la seguridad te parece abrumadora, el VPS HestiaCP Administrado de Avantys incluye configuración de seguridad optimizada, actualizaciones automáticas y monitorización 24/7. Nos encargamos de la seguridad para que tú te centres en tu negocio.
Guías relacionadas
- Cómo instalar HestiaCP en Ubuntu
- Configurar Backups en HestiaCP
- Configurar SSL en HestiaCP
- Configurar Email en HestiaCP
- Instalar WordPress en HestiaCP
- ¿Qué es HestiaCP?
VPS HestiaCP Administrado
Tu servidor HestiaCP con soporte técnico profesional. Nos encargamos de la administración para que tú te dediques a tus clientes.
VPS HestiaCP Administrado
La potencia de un VPS con el panel HestiaCP, montado y gestionado por nosotros.