Una medida básica para mejorar la seguridad de WordPress es cambiar la URL de acceso al panel de administración. Por defecto es la misma para todas las instalaciones y por tanto el objetivo de principal de la mayoría de ataques a nuestra web.
Veamos como llevar a cabo esta tarea
Consideraciones previas
A primera vista, cambiar la url de acceso parece una tarea sencilla. Para acceder mediante una url de nuestra elección, solo tenemos que crear la redirección adecuada. Pero eso no resuelve el problema. Todavía nos falta bloquear el acceso mediante /wp-admin y wp-login.php, o no habremos hecho nada, excepto complicarnos la vida.
Se trata de alterar una funcionalidad básica, sin tocar el núcleo de WordPress. Si lo hacemos, en el mejor de los casos las actualizaciones serán complicadas, y podemos tener problemas con el funcionamiento de nuestro sitio.
No es fácil, pero es posible hacerlo.
Ocultar wp-admin con un plugin
Aunque evito utilizar plugins en la medida de lo posible, creo que estamos ante una excepción que confirma la regla. En esta ocasión recomiendo usar un plugin con eficacia demostrada.
Si disponemos de alguna solución de seguridad como por ejemplo AIO WP Security, solo tenemos que ir a la opción correspondiente en el apartado de fuerza bruta y escribir el slug deseado por ejemplo solo-para-mi, activarlo y guardar la configuración.
AIO se encargará de todo por nosotros. A partir de ese momento entraremos a través de la nueva URL y /wp-admin y wp-login.php no serán accesibles desde Internet
Si nuestra solución de seguridad para WordPress no incorpora esta funcionalidad, odemos utilizar un plugin específico como WPS Hide Login.
No lo he probado, pero he visto varios análisis que lo recomiendan. Teniendo en cuenta las instalaciones activas y las valoraciones, parece un buen candidato.
Ocultar wp-admin mediante codigo
Esta es una opción que nos dará el mismo resultado, sin necesidad de instalar un plugin. Estos son los pasos a seguir
1. Añadimos el slug de administracion a wp-config.php
define('WP_ADMIN_DIR', 'solo-para-mi');
define( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH . WP_ADMIN_DIR);
2. En el functions. php de nuestro tema hijo añadiremos las siguientes funciones:
//sustituye wp-admin por el nuevo slug
add_filter('site_url', 'wpadmin_filter', 10, 3);
function wpadmin_filter( $url, $path, $orig_scheme ) {
$old = array( "/(wp-admin)/");
$admin_dir = WP_ADMIN_DIR;
$new = array($admin_dir);
return preg_replace( $old, $new, $url, 1);
}
//bloqueamos acceso a wp-admin con 404
add_action('login_form','redirect_wp_admin');
function redirect_wp_admin(){
$redirect_to = $_SERVER['REQUEST_URI'];
if(count($_REQUEST)> 0 && array_key_exists('redirect_to', $_REQUEST)){
$redirect_to = $_REQUEST['redirect_to'];
$check_wp_admin = stristr($redirect_to, 'wp-admin');
if($check_wp_admin){wp_safe_redirect( '404.php' );}
}
}
//bloqueamos wp-login.php con 404
add_action( 'init', 'force_404', 1 );
function force_404() {
$requested_uri = $_SERVER["REQUEST_URI"];
if (strpos( $requested_uri, '/wp-login.php') !== false ) {
status_header( 404 );
nocache_headers();
include( get_query_template( '404' ) );
die();
}
}
3. Modificaremos nuestro .htaccess añadiendo las líneas
<IfModule mod_rewrite.c>
RewriteRule ^solo-para-mi/(.*) wp-admin/$1?%{QUERY_STRING} [L]
</IfModule>
Siguiendo estos pasos solo tenemos que sustituir solo-para-mi por el slug que deseemos y con ello habremos cambiado las url de acceso a nuestro panel de administración.
La solución no es mía, pero cumple con los requisitos y es la que más me ha gustado de las que he visto.
Ocultar wp-admin mediante contraseña
Esta solución no utiliza código PHP y aunque no bloquea el acceso al área de administración, solicita una contraseña adicional con lo cual tenemos una capa extra de seguridad en WordPress.
Haremos lo siguiente:
1. Nos conectamos a la consola del servidor y creamos un archivo de contraseñas
sudo apt-get install apache2-utils
sudo htpasswd -c /ruta/hasta/archivo/.htpasswd nombre-de-usuario
2. Crearemos un archivo .htaccess con el siguiente contenido y lo subimos a la carpeta /wp-admin
AuthName "Acceso Restringido"
AuthType Basic
AuthUserFile /ruta/hasta/archivo/.htpasswd
require valid-user
<FilesMatch “\.(css|js|jpg|jpeg|gif|png)$”>
Order Allow,Deny
Allow from All
Satisfy Any
</FilesMatch>
<Files admin-ajax.php>
Order Allow,Deny
Allow from All
Satisfy Any
</Files>
A partir de ese momento el acceso a la carpeta wp-admin exigirá autentificacion con el usuario y la contraseña definidos en el punto 1. Se permite el acceso libre a los archivos auxiliares: css, js e imágenes. También se permite el acceso libre al archivo admin-ajax.php necesario para la funcionalidad AJAX en WordPress.
No hemos ocultado la url por defecto, pero se lo ponemos más dificil a quien intente saltarse nuestra seguridad de WordPress
Ajustes de cache
Solo nos queda impedir que se guarde en cache la nueva página de acceso. Si hemos utilizado un plugin, posiblemente hayamos visto el aviso.
Como hacerlo depende de nuestro plugin de cache. Si usais Cache Enabler, esta funcionalidad ya está soportada.
La expresion regular /.*\/solo-para-mi/ evitará que se guarden en cache las url que termien en el nuevo slug. Podemos aprender más sobre las expresiones regulares y probar otras variantes aquí
Conclusión
Podemos estar seguros de que la mayoria de las visitas a wp-admin serán malintencionadas, por tanto el nivel de paranoia aceptable es reforzar todo lo posible la seguridad de WordPress.
Hemos visto varias formas de ponérselo un poco más difícil a los hackers. Mi recomendación es hacerlo mediante un plugin, sobre todo si nuestra solución de seguridad lo incorpora.
Sin embargo, sea cual sea la implementacion que elijamos, no nos limitemos a ella. Debemos complementarla con otras medidas de seguridad y sobre todo hacer regularmente copias de seguridad.