Seguridad en WordPress
Índice de contenidos
Introducción
En este articulo voy a explicar de la seguridad en WordPress y las medidas de seguridad que podemos aplicar, utilizando diferentes plugins, ademas explicaré algunas configuraciones del servidor web, incluso programas que podemos instalar en el Servidor Linux, hasta personalizar el panel de administración del WordPress
Plugins de seguridad
Existe varios plugins de seguridad, pero los más destacados son:
- All In One WP Security & Firewall
- iThemes Security
- Wordfence
- Sucuri Security
Existen otros plugins que nos ayudan con ciertas partes de la seguridad en WordPress como las actualizaciones automáticas u ocultar la versión del WordPress.
Configurar el plugin all in one wp security & firewall
Con este plugin podemos poner un corta fuegos (Firewall), cambiar prefijo a las tablas, cambiar los usuarios que ya son conocidos, cambiar la ruta de acceso al panel de administración, etc.
Cuentas de Usuario
Cambiar nombre de usuario
Fuerza bruta
Cambiar la Url de acceso al panel de administración (Dashboard)
Agregar capcha en el formulario de ingreso
Corta fuegos (Firewall)
Reglas básicas de cortafuegos
Reglas adicionales de cortafuegos
6G Blacklist Firewall Rules
Son reglas htaccess que protegen contra ataques que ya son conocidos.
Bots de Internet
Ingreso de Usuario
Bloque de acceso
Seguridad base de datos
Cambiar prefijo de base de datos
Escaneo de archivos
Escanea los archivo cada cierto tiempo, para detectar si algún archivo fue modificado, agregado o eliminado. Cuando ocurre uno de esos eventos te avisa enviándote un correo electrónico.
Otros
Evitar que su sitio se muestre en un marco o iframe
Prevenir la enumeración de usuarios
Configurar el plugin WP Hide & Security Enhancer
Remover el generador meta de WordPress
Remover la versión del WordPress en la ruta de los archivos CSS
Remover la versión del WordPress en la ruta de los archivos JS
Remover el X-Powered-By Header
Gestión de usuarios y perfiles
Plugin User Role Editor
Este plugin nos permite gestionar los perfiles del WordPress.
Plugin Disable Users
WordPress por defecto no permite inhabilitar usuarios, este plugin agrega esta funcionalidad.
Plugin doble factor de autenticación
- Duo Two-Factor Authentication
- Clef
- Latch
- Two Factor Auth
- Google Authenticator
Personalizar el Menu del panel de administración
Plugin Adminimize
Este plugin nos permite ocultar los menus del panel de administración del WordPress, para cada tipo de perfil.
Permisos de archivos y carpetas
Los permisos recomendados son:
- Para las carpetas 755
- Para los archivo 644
- Para el archivo wp-config.php 440
Esto funcionaria bien en un hosting que paga mensualmente y tiene un cPanel de administrador.
Si queremos ser más paranoicos y tenemos acceso al shell
del servidor, podemos hacer lo siguiente:
El usuario admin
es una cuenta de Linux, pero con permisos normales, no permisos de super administrador.
sudo chown -R apache:admin /var/www/example.com/public_html sudo find /var/www/example.com/public_html -type d -exec chmod -R 570 {} \; sudo find /var/www/example.com/public_html -type f -exec chmod -R 460 {} \; sudo find /var/www/example.com/public_html/wp-content -type d -exec chmod -R 770 {} \; sudo find /var/www/example.com/public_html/wp-content -type f -exec chmod -R 660 {} \; |
Claro que para actualizar el WordPress tendrían que cambiar primero los permisos y una vez actualizado el WordPress volver a cambiar los permisos que se indican.
Reglas adicionales en el archivo .htaccess
Además de las configuraciones que hace los plugins podemos agregar más opciones en el archivo .htaccess
Agregamos antes de # BEGIN WordPress
# BEGIN CUSTOM <Files ~ "^\.ht"> Order allow,deny Deny from all </Files> <IfModule mod_headers.c> Header set X-XSS-Protection "1; mode=block" Header set X-Content-Type-Options nosniff </IfModule> <IfModule mod_alias.c> RedirectMatch 301 ((licencia|LICENCIA)\.(txt|md|html|TXT|MD|HTML)) /no-existe/? RedirectMatch 301 ((license|LICENSE)\.(txt|md|html|TXT|MD|HTML)) /no-existe/? RedirectMatch 301 ((readme|README)\.(txt|md|html|TXT|MD|HTML)) /no-existe/? RedirectMatch 301 (wp-blog-header.php|wp-config.php|wp-config-sample.php|wp-links-opml.php) /no-existe/? RedirectMatch 301 (wp-register.php|xmlrpc.php|wp-admin/install.php) /no-existe/? RedirectMatch 301 wp-includes/.*\.(txt|md|php|TXT|MD|PHP) /no-existe/? RedirectMatch 301 wp-content/.*\.(txt|md|php|TXT|MD|PHP) /no-existe/? RedirectMatch 301 author/.* /no-existe/? </IfModule> <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} ^/$ RewriteCond %{QUERY_STRING} author=([0-9]+) [NC] RewriteRule ^(.*)$ /no-existe/? [L,R=301,NC] </IfModule> # END CUSTOM |
Estas reglas lo que hacen es evitar que se muestren los archivos donde se muestra la versión de los plugins, a demás evita que se enumere los usuarios del WordPress.
Bloquear el acceso de la carpeta wp-admin
Podemos bloquear el acceso a la carpeta wp-admin permitiendo solo el acceso a una IP o rango de IP, para esto creamos un archivo .htaccess en la carpeta wp-admin y agregamos:
# Block access to wp-admin.
order deny,allow
allow from x.x.x.x
deny from all |
La IP sería x.x.x.x
o rango de IP x.x.x.*
Habilitar el uso de Ajax
Si nuestro tema o plugins usan Ajax, necesitamos habilitar el acceso.
# Allow access to wp-admin/admin-ajax.php <Files admin-ajax.php> Order allow,deny Allow from all Satisfy any </Files> |
Configurar el Apache
Para que no muestre la versión del Sistema Operativo y la versión del Apache agregamos en el archivo /etc/httpd/conf/httpd.conf
ServerSignature Off ServerTokens Prod TraceEnable off |
Luego reiniciamos el servicio httpd
systemctl restart httpd |
Configurar PHP
Desde PHP también tenemos que configurar para que no muestre las versiones, editamos /etc/php.ini
Si usan el parámetro disable_functions
tener en cuenta que algunos plugins podrían no funcionar.
expose_php = Off html_errors = Off display_errors = Off error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT display_startup_errors = Off file_uploads = On upload_max_filesize = 100M post_max_size = 100M memory_limit = 512M //(Este valor deberá ser mayor que post_max_size) allow_url_fopen=off allow_url_include=off enable_dl = Off disable_functions = apache_child_terminate, apache_get_modules, apache_get_version, apache_getenv, apache_note, apache_setenv, virtual, syslog, openlog, proc_open, leak, tmpfile, phpinfo, show_source, disk_free_space, diskfreespace, exec, system, proc_nice, shell_exec, passthru, dl,ini_restore,chgrp,chmod,chown,fputs,lchgrp,touch,link,symlink,popen ,curl_exec,curl_multi_exec,parse_ini_file session.cookie_httponly = 1 session.cookie_secure = 1 session.use_only_cookies = 1 |
Si habilitamos open_basedir
el PHP solo se ejecutará en las carpetas que le indiquemos.
open_basedir = /var/www/html/:/tmp/ |
Luego reiniciamos el servicio httpd
systemctl restart httpd |
Configurar la base de datos MySQL
Si tienes acceso a la configuración del MySQL, sigue estas recomendaciones en un entorno de producción:
- No se debe usar el usuario root para el WordPress.
- El servidor no debe permitir acceso remoto.
- El WordPress debe tener un usuario y base de datos independiente, con una contraseña fuerte.
- Los permisos mínimos que debe tener el usuario de la base de datos deben ser: SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP.
Configurar phpMyAdmin
Si usas phpMyAdmin a nivel público es mejor cambiar la ruta de acceso y evitamos ataques de fuerza bruta.
sudo vim /etc/httpd/conf.d/phpMyAdmin.conf |
Agregamos una nueva ruta phpadminis78
#Alias /phpMyAdmin /usr/share/phpMyAdmin Alias /phpadminis78 /usr/share/phpMyAdmin |
Limitar el acceso a una sola IP x.x.x.x
<Directory /usr/share/phpMyAdmin/> ... <IfModule mod_authz_core.c> <RequireAny> Require ip 127.0.0.1 Require ip ::1 Require ip x.x.x.x </RequireAny> </IfModule> ... </Directory> |
Luego reiniciamos el servicio httpd
systemctl restart httpd |
Usar Fail2ban contra ataques de fuerza bruta
Los ataques de fuerza bruta es uno de los más usados para descubrir la contraseña de los usuarios del WordPress. Fail2ban nos permite bloquear o banear la IP que esta realizando este ataque.
Si tienes acceso a tu servidor puedes seguir los pasos:
Instalar Fail2Ban
yum update yum install fail2ban |
Hacemos una copia del archivo /etc/fail2ban/jail.conf.
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local |
Configurar el archivo jail.local
nano /etc/fail2ban/jail.local |
[wp-login] enabled = true port = http,https filter = wp-login action = iptables[name=WordPressLogin, port=http, protocol=tcp] logpath = /var/log/httpd/dominio.com-access_log bantime = 6000 maxretry = 5 |
[wp-xmlrpc] enabled = true port = http,https filter = wp-xmlrpc action = iptables[name=WordPressXMLRPC, port=http, protocol=tcp] logpath = /var/log/httpd/dominio.com-access_log bantime = 6000 maxretry = 5 |
Crear Filtros
Creamos los siguientes filtros para proteger el WordPress.
vim /etc/fail2ban/filter.d/wp-xmlrpc.conf |
[Definition] failregex = ^<HOST> .*POST .*xmlrpc\.php.* ignoreregex = |
vim /etc/fail2ban/filter.d/wp-login.conf |
[Definition] failregex = ^<HOST> .* "POST .*wp-login.php ignoreregex = |
Finalizar la configuración de Fail2ban
Una vez configurado Fail2Ban reiniciamos el servicio Fail2Ban
systemctl fail2ban restart |
Más Información sobre Fail2ban
Usar WPHardening
WPHardening es una herramienta para fortalecer la seguridad en WordPress, funciona en la terminal de linux y esta desarrollado en Phyton.
La caracteristica principal que me interesa en esta herramienta, es que te protege contra el fingerprinting, pueden visitar en github.
Instalar WPHardening
git clone https://github.com/elcodigok/wphardening.git cd wphardening pip install -r requirements.txt |
Remover el fingerprinting
python wphardening.py -d /home/path/to/wordpress --fingerprinting -v |
Crear archivos index
python wphardening.py -d /home/path/to/wordpress --indexes -v |
Copias de seguridad en WordPress
Para hacer copias de seguridad en WordPress podemos hacerlo de dos formas, a través de plugins o a través de script que se ejecuten en la terminal.
Plugins para hacer Backup en WordPress
- WP MyBackup
- Backup WordPress
- Complete Central Backup
- WordPress Backup to Dropbox
- BackWPup Free
- VaultPress
- WordPress Backup & Clone Master
Script para hacer Backup en WordPress
El script lo pueden encontrar en github
Como se usa el script
git clone https://github.com/jamesrascal/wordpress-backup.git cd wordpress-backup |
Editar el archivo backup.profile
backup_enabled=1 user=root wp_domain=example.com wp_root=/home/admin/example.com/public_html backup_location=/backups # Keep days is the number of backups to keep. # Add a 1 to this number and that is how many backups will be stored before rotation. keepdays=2 |
Cambiar los permisos para que sea ejecutable
chmod +x WordPressBackup.sh |
Para terminar agregamos una tarea.
crontab -e |
Que se ejecute todos los días.
0 0 * * * /bin/bash /home/admin/wordpress-backup/WordPressBackup.sh >/dev/null 2>&1 |
Actualizar WordPress
Constantemente WordPress lanza nuevas versiones, ya sea por corregir errores, por seguridad o por brindar nuevas funcionalidades. Siempre hay que tener las últimas versiones para evitar posibles fallos de seguridad en nuestro sitio web. Pero yo recomiendo que la actualización se realice como mínimo 7 días después de haber salido la nueva versión de WordPress, para que los plugin también actualicen su código a la nueva versión de WordPress.
Recuerda que antes de actualizar el WordPress siempre realiza un backup completo del WordPress, es posible y frecuente que al actualizar el WordPress se presenten fallos o que el sitio web deje por completo de funcionar.
Configuración del archivo wp-config.php
Desactivar la edición de temas y plugins
define( 'DISALLOW_FILE_EDIT', true ); |
Desactivar la instalación y actualización de temas y plugins
define( 'DISALLOW_FILE_MODS', true ); |
Conclusión
La seguridad en WordPress no solo va depender de los plugins que instalemos, la seguridad va depender de muchos factores y programas involucrados en ello, al aplicar todas las herramientas posibles, ya sea en el WordPress, PHP, Apache, MySQL, el sistema operativo, usar un protocolo seguro HTTPS, contraseñas fuertes, cambiar las contraseñas periódicamente, etc. va hacer más difícil que puedan vulnerar nuestro sitio web.
Actualizado .