Seguridad

Qué entendemos por seguridad

¿WordPress es seguro? Sí, pero con condiciones. La primera y mayor es que mantengas todo al día. Esto significa que todas aquellas partes en las que WordPress e ve afectado ha de mantenerse, en la medida que corresponda, de forma segura.

En este sentido tenemos tres partes en las que la seguridad es importante: el alojamiento web, el software (WordPress y complementos) y los usuarios. Sin duda, si no puedes gestionar la parte de alojamiento, lo que sí que has de tener es tu WordPress, plugins y themes actualizados a la última versión, siempre.

Aquí vamos a hacer foco en la parte de alojamiento web, aunque también se darán pistas y trucos para el resto de elementos. Y recuerda: la seguridad es un elemento continuo y que ha de revisarse con bastante frecuencia.

Cuando hablamos de seguridad hay que hacer hincapié en que principalmente se habla de medidas de prevención que permitan reducir el riesgo y la planificación en caso de necesitar una recuperación. Esto significa que el objetivo es reducir las posibilidades de accesos no autorizados, aunque teniendo en cuenta que no existe un riesgo cero. Es por esto que está la segunda parte, la planificación de recuperación para que, en caso de ser necesario, la recuperación del sitio web sea lo más simple y el restablecimiento lo más inmediato posible.

Actualizaciones automáticas

WordPress, por defecto, incorpora un sistema de actualizaciones automáticas, pero es un mínimo para evitar grandes desastres y que con el paso del tiempo deja de ser efectivo.

Núcleo de WordPress

Existen 3 opciones ala hora de actualizar automáticamente o no el núcleo de WordPress: no actualizar, actualizar solo versiones menores, o actualizar todo, incluso versiones mayores. Lo más recomendado es, al menos, actualizar as versiones menores, que en principio es lo que el sistema hace por defecto. Esto significa que si tienes la versión 5.0.1, automáticamente actualizará a la versión 5.0.2, y posteriormente a la 5.0.3, pero no actualizaría a la 5.1.

Para configurar estas actualizaciones automáticas, lo mejor es añadir una serie de códigos en el fichero de configuración del wp-config.php.

Actualización del núcleo 100% automática

Has de añadir en el fichero wp-config.php la siguiente línea:

define('WP_AUTO_UPDATE_CORE', true);

Actualización del núcleo solo de versiones menores (recomendado)

Has de añadir en el fichero wp-config.php la siguiente línea. Cuando haya actualizaciones mayores deberás actualizarlo a mano.

define('WP_AUTO_UPDATE_CORE’, 'minor');

Deshabilitar actualizaciones automáticas

Has de añadir en el fichero wp-config.php la siguiente línea. A menos que hagas un mantenimiento muy intensivo, no es muy recomendable esta opción.

define('WP_AUTO_UPDATE_CORE', false);

Plugins, themes y traducciones

La decisión de que los plugins, themes y traducciones se realicen de forma automática no es trivial y requiere una toma de decisiones importante. El principal problema que te puedes encontrar es que, debido a estas actualizaciones automáticas, el sitio podría dejar de funcionar.

En caso de querer configurar todo de forma automática, se puede (recomienda) hacer mediante un plugin must-use. Estos plugins, a diferencia de un plugin normal, se ejecutará sí o sí en WordPress y no se podrá desactivar desde el panel de administración.

El contenido del plugin sería el siguiente:

defined('ABSPATH') or die('Bye bye!');
add_filter('auto_update_core', '__return_true');
add_filter('auto_update_plugin', '__return_true');
add_filter('auto_update_theme', '__return_true');
add_filter('auto_update_translation', '__return_true');
add_filter('auto_core_update_send_email', '__return_true');

Desactivar todas las actualizaciones

En el caso de que quieras realizar las actualizaciones de forma manual o con otros sistemas distintos, como podría ser el de WP-CLI, e incluso si tienes una instalación que por alguna razón no puedas o debas actualizar, puedes incluir en el wp-config.php una línea que impedirá las actualizaciones que no se hagan por métodos alternativos.

define('AUTOMATIC_UPDATER_DISABLED', true);

HTTP Seguro y TLS

WordPress funciona mediante el protocolo HTTP (sitios web), y lo puede hacer tanto por HTTP como HTTPS (seguro), siendo totalmente compatible.

Teniendo en cuenta que hoy en día es sencillo configurar HTTPS y que ofrece muchas ventajas si usas un servidor web moderno, conseguirás además que se active por defecto HTTP/2.0. Para ello simplemente necesitarás un certificado TLS 1.2. En caso de no saber cómo conseguir un certificado, siempre tienes la opción de utilizar Let’s Encrypt. Una vez lo tengas instalado, asegúrate que funciona haciendo un análisis.

Acceso a la Administración segura

Si por alguna razón no quieres que todo tu sitio esté sobre HTTPS, siempre puedes, al menos, hacer que la parte privada del panel de administración, requiera de un mínimo de seguridad. En este caso, puedes añadir las líneas de código en el wp-config.php de forma que al acceder a la pantalla de acceso (wp-login) o al panel de administración (wp-admin) se obligue al uso de HTTPS.

define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

Solicitudes inseguras

Si vienes de una web heredada o muy antigua en la que hay llamadas internas a HTTP, puedes intentar buscar todos los sitios tanto de themes como plugins y base de datos para actualizar el http:// por https://, o puedes utilizar una tecnología interna que permite aumentar la seguridad de todas las peticiones de forma automática.

Esta configuración se ha de hacer a nivel de servidor web, y por ejemplo, se podría añadir en el .htaccess si usas Apache HTTPD, con el siguiente contenido:

Header set Content-Security-Policy: upgrade-insecure-requests;

Sistema de ficheros

La configuración del sistema de ficheros de su cuenta de alojamiento puede tener un gran impacto en la seguridad de WordPress. Es importante establecer los permisos y la propiedad adecuados de los archivos para garantizar que los usuarios no autorizados no puedan acceder a los ficheros de WordPress ni modificarlos.

Permisos de ficheros

NOTA: Esta sección sobre permisos de ficheros se centra completamente en los permisos en servidores Linux.

Los permisos de ficheros y carpetas en Linux tienen 2 grandes elementos: el propietario y las acciones permitidas.

Cuando hablamos del propietario tenemos 3 partes, el propietario en sí, el grupo al que pertenece y el resto. Dependiendo de la configuración de tu servidor web deberás tener en cuenta y dar los permisos necesarios según corresponda. En este caso vamos a tratar por un lado el propietario (necesario para las actuaciones propias de WordPress) y el grupo y resto (necesario para que los usuarios puedan visitar el sitio web).

Cuando hablamos de las acciones permitidas estamos revisando si se puede leer, escribir o ejecutar.

Si juntamos esta combinación, por norma general, daremos permisos de lectura/escritura/ejecución a los propietarios en carpetas, de lectura/escritura a los propietarios en ficheros. Por otro lado, al resto les daremos permisos de lectura/ejecución a las carpetas y permisos de lectura en los ficheros. Esto se resumen en:

  • Carpetas: 755
  • Ficheros: 644

¿Podemos ser restrictivos en algunos elementos, por seguridad? Sí, por ejemplo, el fichero que contiene claves y más datos es wp-config.php; en este caso, este fichero solo es accesible por el propietario del sitio, pero no tiene porqué ser accesible desde fuera. Es por esto que, a este fichero en concreto, se le podría dar permisos 600.

Aún así, consulta con tu proveedor estas configuraciones, ya que pueden varias según el servidor web, sistema operativo y otros factores.

Cuentas de usuario

Los sistemas operativos permiten crear usuarios. Cada usuario tiene la posibilidad de acceder a unos u otros lugares según se le deje o no.

En el caso de WordPress, un usuario puede ser el propietario de una o muchas instalaciones, pero en caso de que haya un acceso indebido, el hecho de que un usuario tenga muchos WordPress puede poner en peligro el resto. por esto suele pasar que cuando hackean uno, suelen hackear todos.

En caso de ser posible, es muy recomendable que las instalaciones de WordPress se hagan con usuarios distintos que solo tengan acceso a un WordPress.

Permisos de escritura de núcleo y media

Para el correcto funcionamiento de WordPress, es necesario que PHP permita el acceso a los ficheros y pueda escribir, sobre todo si dispones de actualizaciones automáticas o quieres que el propio WordPress gestione todo lo posible.

Además, las instalaciones suelen tener por defecto configurada la carpeta /wp-content/uploads/ por defecto como almacenamiento de los ficheros que se suben a través de la zona de Media del sistema. Para que funcione el sistema, PHP ha de poder escribir en esta carpeta.

Permisos de ejecución de PHP

Para aumentar la seguridad, y teniendo en cuenta que por defecto en la carpeta de «uploads» no hay ficheros PHP, podemos plantear que es la carpeta que más posibilidad de ataques tiene, ya que los plugins y otros sistemas suben elementos ahí. Si por algún casual se consiguiera subir algún tipo de script ahí que pudiera ejecutarse desde el exterior, podrías bloquear su ejecución.

En este caso, por ejemplo, se puede añadir en esa carpeta /wp-content/uploads/ un fichero .htaccess con el siguiente contenido:

<Files ~ ".+\.php">
  Deny from All
</Files>

Usuarios

En general, cuando hablamos de seguridad, uno de los factores más importantes son los usuarios. Es algo que suele ser difícil de controlar, ya que no puedes obligar (por lo general) a hacer lo que a ti te gustaría (como por ejemplo poner una contraseña con mayúsculas, minúsculas, símbolos, números y de 36 caracteres). Aún así, siempre hay algunas recomendaciones ara evitar que sean el eslabón más débil de la seguridad.

Roles de usuario

En WordPress, por defecto, existen 5 roles de usuario:

  • Administrador / SuperAdministrador: como su nombre indica, tiene permisos para todo.
  • Editor: puede gestionar por completo la parte editorial del sitio.
  • Autor: puede crear, publicar y gestionar sus propios contenidos.
  • Contribuidor: puede crear y gestionar sus contenidos, pero no publicarlos.
  • Suscriptor: puede gestionar sus datos y perfil.

Los Administradores y Editores han de ser personas de confianza de la plataforma, teniendo en cuenta que un Administrador ha de tener conocimientos mínimos de todo WordPress, ya que pueden alterar configuraciones que pongan en compromiso el sistema.

Lo más recomendable es tener solo usuarios de administración que realmente lo necesiten, y por norma general, trabajar solo con usuarios de nivel Editor e inferiores.

Hay que tener en cuenta, además, que WordPress puede permitir de forma abierta el registro de usuarios, por lo que nunca deberemos permitir que estos nuevos usuarios tengan un nivel superior al de Autor.

Nombres de usuario

Los nombre de usuario son datos públicos que te identifican, pero no por ello, por ser públicos, son menos seguros. Por ejemplo, es muy sencillo que sepas mi dirección de correo, mi cuenta de Twitter o mi nombre, pero eso no hace que el acceso a mi correo o Twitter sea menos inseguro.

Por defecto, WordPress puede mostrar a través de las API los identificadores y nombres de usuario.

Contraseñas seguras

WordPress por defecto genera contraseñas seguras a los usuarios tanto cuando las genera automáticamente como cuando las sugiere a los usuarios.

En caso de que una contraseña no sea muy segura, automáticamente lo informará y te indicará que has de marcar un campo para que confirmes que estás de acuerdo en ello, bajo tu riesgo.

Segundo factor de autenticación (2FA)

En cualquier caso, para evitar posible fugas de datos o el uso de contraseñas básicas, es muy recomendable el uso y obligación de un segundo factor de autenticación.

En este caso, tras introducir el usuario y contraseña en la pantalla de acceso, te pedirá un segundo código que se genere de una forma puntual.

Te puede interesar el plugin Two Factor para la gestión de la autenticación por correo, OTP y otros sistemas.

Seguridad en la caché

Mientras que el almacenamiento en caché puede mejorar significativamente el rendimiento de los sitios web de WordPress, el almacenamiento en caché puede dejar expuesto los sitios a vulnerabilidades si los proveedores de almacenamiento en caché no están configurados correctamente. Algunas vulnerabilidades comunes incluyen, pero no se limitan, a los sitios web que acceden a los datos en caché para otros sitios web o aplicaciones de almacenamiento en caché que sirven datos o archivos en caché erróneos. Cada aplicación suele tener ajustes para proporcionar un entorno seguro y disfrutar de las ventajas de rendimiento del almacenamiento en caché.

Seguridad OpCache

El PHP opcode puede mejorar significativamente el rendimiento del procesamiento PHP, sin embargo, cuando está mal configurado puede permitir a los usuarios acceder a los archivos PHP de otros usuarios sin autorización. Existen importantes opciones de configuración PHP para el almacenamiento en caché de opcode que mitigan vulnerabilidades como el acceso a archivos sin autorización.

Validar el permiso

La siguiente configuración hace que PHP compruebe que el usuario actual tiene los permisos necesarios para acceder al archivo caché. Debe estar habilitado en el nivel de configuración raíz de php.ini para evitar que los usuarios accedan a los archivos cacheados de otros usuarios.

opcache.validate_permission = on

Esta configuración no está activada de forma predeterminada. Disponible a partir de PHP 7.0.14.

Validar root

La siguiente configuración evita que los usuarios de PHP accedan a archivos fuera del directorio chroot al que normalmente no tendrían acceso. También debe agregarse al nivel de configuración raíz de php.ini para evitar el acceso no autorizado a los archivos.

opcache.validate_root = on

Esta configuración no está activada de forma predeterminada. Disponible a partir de PHP 7.0.14.

Restricción de API

Normalmente cualquier usuario de PHP puede acceder a la API de opcache para ver los archivos actualmente almacenados en caché y para gestionar la caché de opcode PHP. Sin embargo, con algunas configuraciones PHP, la caché PHP opcode comparte la misma memoria entre todos los usuarios del servidor.

Restringir la API de opcache evita que los scripts PHP se ejecuten en directorios no autorizados para ver archivos en caché e interactuar con la caché de opcode PHP manualmente desde dentro de los scripts PHP. La siguiente configuración define la ruta de directorio con la que deben empezar los scripts PHP para poder acceder a la API de Opcache.

opcache.restrict_api = '/some/folder/path'

El valor por defecto para la configuración es », lo que significa que no hay restricciones sobre qué scripts PHP pueden acceder a la API de Opcache. Esta configuración debe estar definida en la raíz php.ini de su configuración PHP para evitar que los usuarios la anulen.

Seguridad en caché de objetos

Redis

En su configuración por defecto Redis utiliza una sola base de datos y no requiere un nombre de usuario y contraseña para acceder a la base de datos. Redis debería ser accesibles únicamente desde hosts de red autorizados.

Bases de datos

Redis proporciona 16 bases de datos, (número 0 a 15 por defecto). Los clientes de Redis deben estar configurados para usar bases de datos diferentes en lugar de la base de datos predeterminada (número 0).

Credenciales

Si se va a utilizar Redis para el almacenamiento en caché de objetos de la base de datos, el servidor Redis debe estar configurado para requerir credenciales de acceso.

Puerto

El servidor Redis en su configuración por defecto escucha en el puerto 6379. El puerto se puede cambiar en la configuración de Redis, pero cualquier puerto que se utilice debe estar protegido por un cortafuegos para evitar el acceso no autorizado.

Clave aleatoria

Si utilizas Redis para el almacenamiento en caché de objetos de la base de datos, el uso de una única clave de caché Redis ayudará a evitar colisiones de caché cuando dos sitios web intenten almacenar contenido en caché utilizando la misma clave. Las colisiones de caché pueden dar lugar a que los sitios web accedan a los datos almacenados en caché de otros sitios web y pueden provocar otros comportamientos inesperados.

La clave aleatoria se configura normalmente a través del plugin de caché de Redis utilizado para habilitar el almacenamiento en caché de objetos.

Memcached

Memcached es una solución de almacenamiento en caché de objetos de memoria.

Una de las preocupaciones de configuración más importantes para memcached es evitar que se acceda a memcached a través de la Internet pública. Poner servidores memcached detrás de un firewall es una de las partes más importantes de usar memcached de forma segura para el almacenamiento en caché de objetos de la base de datos WordPress.

Más información

Si quieres ampliar tus conocimientos sobre seguridad en WordPress también tienes disponible la documentación de WPdanger Code, complementaria a esta documentación.