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

seguridad en wordpress cambiar nombre de usuario

 

Fuerza bruta

Cambiar la Url de acceso al panel de administración (Dashboard)

seguridad en wordpress cambiar url pagina acceso

 

Agregar capcha en el formulario de ingreso

seguridad en wordpress login capcha

 

Corta fuegos (Firewall)

Reglas básicas de cortafuegos

seguridad en WordPress

 

Reglas adicionales de cortafuegos

seguridad en wordpress reglas adicionales de firewall

 

6G Blacklist Firewall Rules

Son reglas htaccess que protegen contra ataques que ya son conocidos.
seguridad en wordpress reglas 6g 5g

Bots de Internet

seguridad en wordpress Bots de Internet

Ingreso de Usuario

Bloque de acceso

seguridad en wordpress bloqueo de acceso

Seguridad base de datos

Cambiar prefijo de base de datos

seguridad en wordpress 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.
seguridad en wordpress escanear archivos

Otros

Evitar que su sitio se muestre en un marco o iframe

Prevenir la enumeración de usuarios

seguridad en wordpress Prevenir la enumeración de usuarios

Configurar el plugin WP Hide & Security Enhancer

Remover el generador meta de WordPress

seguridad en wordpress remover generador meta

Remover la versión del WordPress en la ruta de los archivos CSS

seguridad en wordpress remover version styles

Remover la versión del WordPress en la ruta de los archivos JS

seguridad en wordpress remover version script

Remover el X-Powered-By Header

seguridad en wordpress remover x-powerred by

Gestión de usuarios y perfiles

Plugin User Role Editor

Este plugin nos permite gestionar los perfiles del WordPress.
seguridad en wordpress user role editor

Plugin Disable Users

WordPress por defecto no permite inhabilitar usuarios, este plugin agrega esta funcionalidad.
seguridad en wordpress disabled user

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.
seguridad en WordPress

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 .

(Visited 1.057 times, 3 visits today)
Puedes saltar al final y dejar una respuesta. Hacer ping no está permitido actualmente.