¿Qué hay de nuevo nómadas?
Hoy os traemos un artículo que complementará nuestra serie de posts de instalación de WordPress y que creemos que os será de ayuda: Securizar vuestro blog WordPress.
Lo que vamos a hacer, principalmente, es aplicar una serie de cambios en nuestro blog que permitirá ponerselo más dificil a los que intenten atacarnos ¡allá vamos!
Tabla de contenidos
1) WP-ADMIN
En primer lugar, lo más interesante es cerrar el acceso a nuestro panel de administración /wp-admin/ por defecto. Para ello, podemos hacerlo de dos formas diferentes:
- Bloqueando y restringiendo el acceso a wp-admin para que solo se pueda entrar desde la VPN que hemos configurado en nuestro VPS.
- Cambiando la ruta para que no sea wp-admin y sea, por ejemplo, www.tublog.com/restringido/ con plugins como WPS Hide Login.
Nosotros, con el fin de ser más restrictivos, vamos a aplicar la primera opción con cuatro sencillos pasos.
Restringiendo el acceso a WP-ADMIN.
Sólo válido si tenemos una dirección IP estática desde donde nos vamos a conectar o concemos el rango de la red, a esto se le llama bloqueo por whitelist. Por ejemplo, vamos a acceder desde nuestra VPN (rango 10.8.0.1).
Primero, antes de nada, si no lo tenemos ya, debemos instalar en nuestro VPS:
Teniéndolo todo instalado y configurado como os hemos dicho ¡podemos continuar!
1.1) Fichero .htaccess
Conectamos por SSH a nuestro servidor VPS para modificar un fichero .htaccess del directorio /var/www/dominio.com/
vi /var/www/dominio.com/.htaccess
A continuación, añadimos las siguientes lineas:
<Files wp-login.php>
Order Deny,Allow
Deny from all
Allow from 10.8.0.0/24
</Files>
Y, el fichero .htaccess dentro de wp-admin:
vi /var/www/dominio.com/wp-admin/.htaccess
para que contenga lo siguiente:
Order Deny,Allow
Deny from all
Allow from 10.8.0.0/24
1.2) Fichero hosts
El siguiente paso, como tenemos dnsmasq instalado y configurado para escuchar en nuestra VPN, vamos a decirle en el fichero /etc/hosts que cibernomadas.es está en el 10.8.0.1 nuestra puerta de enlace por VPN:
vi /etc/hosts
si habéis seguido todos los pasos, ahora podréis hacer la prueba.
Primero, recargamos la configuración de apache:
service apache2 reload
Una vez hecho, podemos probar primero a acceder a nuestro wp-admin y comprobar que nos devuelve un error 500 Forbidden:
Después, conectamos nuestro cliente VPN y volvemos a acceder al recurso wp-admin. Ahora sí nos pide usuario y contraseña.
NOTA: Si no os funciona, no os asustéis. Limpiad la caché del navegador y DNS y volved a entrar.
2) WP-Includes
Tenemos por otro lado la necesidad de limitar el acceso a cualquier persona (o bot) a directorios donde se encuentran los scripts de WordPress: wp-includes.
Para ello, sobre el fichero .htaccess que tenemos en el directorio raíz de /var/www/dominio.es/ añadimos lo siguiente ANTES de la linea # BEGIN WordPress:
# Block the include-only files.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>
# BEGIN WordPress
...
...contenido extra que ya teniamos...
...
# END WordPress
3) WP-Content/Uploads
Ahora vamos a prohibir que ningún fichero PHP del directorio /uploads sea ejecutado. ¿Por qué? Imaginad que, por un plugin vulnerable, un atacante consigue subir o cargar una shell en PHP. El atacante tendrá el fichero en /uploads pero, con esta medida, no será capaz de ejecutarla 🙂
Para ello, creamos un fichero .htacces en el directorio:
vi /var/www/dominio.es/wp-content/uploads/.htaccess
y añadimos:
# Kill PHP Execution
<Files ~ "\.ph(?:p[345]?|t|tml)$">
deny from all
</Files>
Cuidado: Si vuestro blog se rompe tras hacer este cambio podéis simplemente revertir el cambio eliminando el fichero .htaccess que se va a crear.
4) WP-CONFIG
Aunque accediendo directamente a él no muestra ningún contenido, vamos a limitar el acceso al fichero wp-config.php mediante el fichero .htaccess de nuestro directorio raíz en /var/www/dominio.es/.htaccess
Añadimos, arriba del todo, la siguiente directiva:
<files wp-config.php>
order allow,deny
deny from all
</files>
Así, cuando alguien intente acceder le mostrará el mensaje:
You don’t have permission to access /wp-config.php on this server.
5) Permisos
Otro punto importante a revisar en nuestro blog es que todos los permisos de los ficheros y directorios sean los correctos. Para ello, lo recomendable es asignar permisos 750 (rwxr-x—) a directorios y 640 (rw-r—–) a ficheros. NUNCA debería existir ningún fichero o directorio con permisos 777.
Atención: No nos hacemos responsables de cualquier problema que os surgiera a raíz de aplicar esta medida. Es importante que comprobéis primero cuál va a ser el impacto. Si tenéis un entorno de prueba donde realizar primero el cambio y verificar que no se rompe nada.
Para forzar los permisos a todos los directorios de wordpress bastaría con ejecutar:
find /var/www/dominio.es/ -type d -exec chmod 750 {} \;
Y para corregir los permisos de los ficheros:
find /var/www/dominio.es/ -type f -exec chmod 640 {} \;
6) Cabeceras HTTP
Este apartado, que más bien serviría para securizar cualquier servidor web Apache, lo incluimos como directiva a tener en cuenta para securizar nuestro blog. Estamos hablando de limitar la información que nos devuelve el servidor en las cabeceras HTTP. Por ejemplo:
Por defecto, apache en este caso, suele devolver una cabecera con un string indicando la versión le servidor y la de PHP instalada. Vamos a indicarle que no envíe nada.
Para ello, vamos a editar:
vi /etc/apache2/conf-enabled/security.conf
Y modificamos las lineas:
ServerTokens Prod
De esta forma, el servidor enviará únicamente una cabecera Server: Apache. Sin información de qué versión estamos ejecutando. Y, por otro lado,
ServerSignature Off
Para que, de esta forma, cuando se muestre un fichero para errores 4xx o 5xx, por ejemplo, evitar que se muestre información del software. La idea es dar las mínimas pistas posibles sobre el software que estamos utilizando.
7) Escondiendo versión de WordPress.
Una parte importante de la securización de wordpress es esconder la versión que estamos utilizando. Obviamente, no implica que podáis dejar de actualizar vuestro Blog a la última versión de forma periódica. Esto es una capa más.
¿Y cómo sabría un atacante qué versión de WordPress estamos utilizando? Sencillo, cuando carga la web, se envía un tag HTML de meta información (<meta>) con los datos de la versión.
Para evitar que se muestre, tanto aquí como en el feed RSS, recomendamos añadir las siguientes lineas al fichero /var/www/dominio.es/wp-includes/functions.php:
function
wpbeginner_remove_version() {
return
''
;
}
add_filter(
'the_generator'
,
'wpbeginner_remove_version'
);