¿Cómo mover la página de inicio de sesión wp-admin a otra ubicación?
Quiero mover la página de inicio de sesión físicamente (no virtualmente). Por favor, sugiere una forma mediante plugin que pueda alterar los códigos del núcleo al vuelo (incluso después de una actualización del código del núcleo). Puede ser una capa adicional de seguridad.

Puedes deshabilitar la página wp-login desde tus funciones enganchándote a login_head:
add_action( 'login_head', 'wp_die');
(obviamente esta es una forma muy tosca de hacerlo, pero evita que cualquiera pueda iniciar sesión a través de esa página. Podrías convertirlo en una función de redirección o un mensaje de advertencia, en lugar de simplemente terminar la ejecución).
Y copia el archivo wp-login existente a otra ubicación, asegurándote de actualizar la ruta relativa a wp-load.php
cerca de la parte superior (y cualquier otra ruta relativa que pueda haber allí, incluyendo los enlaces a sí mismo y las acciones del formulario.
(Obviamente tendrás que eliminar la acción que agregaste a login_head
aquí, de lo contrario tampoco podrás iniciar sesión desde esta página).
Luego, solo necesitarás agregar un filtro a login_url
que devuelva la dirección de tu nueva página de inicio de sesión, de lo contrario las solicitudes de archivos wp-admin serán redirigidas a la antigua página de inicio de sesión, que ahora está deshabilitada.

Esta no es una gran idea de seguridad porque la página wp-login o wp-admin en sí misma no representa una amenaza de seguridad. Aunque se podría argumentar que si alguien tuviera tu contraseña/nombre de usuario, quizás no podría encontrar dónde iniciar sesión, lo que sería seguridad a través de la oscuridad.
Como kronus mencionó, probablemente podrías hacer algunos redireccionamientos sofisticados, aunque no estoy seguro de qué tan bien escalaría esto con futuras versiones o si vale la pena el esfuerzo. Personalmente, no creo que valga la pena y yo tomo la seguridad muy en serio.
Sugeriría algunas ideas mejores para tu inicio de sesión:
Habilitar SSL para el login/admin (https).
Proteger tu página con contraseña usando .htaccess (tendrías un doble inicio de sesión).
Usar un plugin como Limit Login Attempts, que bloquea a un usuario después de varios intentos fallidos.

Gracias por tus buenas sugerencias, pero quiero mover la página de inicio de sesión a otra ubicación.

Es absolutamente una buena idea. Ocultar el hecho de que tu sitio funciona con WordPress desalienta a las personas de intentar hackear la estructura principal. Si estuviera buscando blogs de WordPress y www.site.com/wp-login.php me mostrara un error 404, seguiría adelante sin intentar vulnerabilidades conocidas de PHP. Cada medida de seguridad ayuda a que tu sitio sea más a prueba de balas.

¿Y una vulnerabilidad conocida del núcleo sería? No, no tienes ni conoces ninguna, así que estás hablando por hablar. Los profesionales de seguridad realmente protegen las aplicaciones y no ocultan cosas, eso es para niños.

Nunca mencioné exploits del núcleo. Hay hacks en abundancia para plugins de WordPress, temas, etc. Solo echa un vistazo a cualquier sitio de reporte de exploits. Al revisar los registros de solicitudes HTTP fallidas, los sitios que administro reciben ataques de fuerza bruta y XSS dirigidos específicamente a WordPress todo el día, cada día. Según tu lógica, tampoco deberías mover wp-content
fuera de la carpeta raíz de instalación, wp-config.php
por encima de la carpeta raíz, eliminar el "powered by wordpress" en el pie de página, cambiar el prefijo predeterminado wp_
de las tablas o borrar la cuenta de administrador por defecto. Modificar los valores predeterminados sí es una forma de seguridad, y la página de login no es diferente.

Ninguna de estas respuestas fue especialmente útil. Pongo en duda los motivos del OP, pero aquí está cómo hacerlo. Agrega esto a tu functions.php, pero asegúrate de reemplazar "$login_page_id":
// Esto redirigirá la página de inicio de sesión real a tu nueva página
add_action( 'login_redirect', 'custom_login_redirect' );
function custom_login_redirect()
{
if ( 'wp-login.php' == $GLOBALS['pagenow'] )
{
// Establece tu $login_page_id
wp_redirect( get_permalink($login_page_id) );
die;
}
}
// Esto reemplazará la URL de inicio de sesión utilizada por Wordpress
add_filter( 'login_url', 'custom_login_url', 10, 2 );
public function custom_login_url( $login_url='', $redirect='' )
{
// Establece tu $login_page_id
return get_permalink($login_page_id);
}
En tu nueva página de inicio de sesión, simplemente puedes agregar esta función para mostrar un formulario de inicio de sesión:
<?php wp_login_form(); ?>

Terminé creando un plugin que maneja esto. https://wordpress.org/plugins/sewn-in-template-log-in/

OP, lo mejor que podrías hacer en este caso es filtrar por IP y permitir solo aquellas redes que tienen acceso al área de WP-Admin (ej. la IP de tu oficina, IPs de desarrolladores, etc.).
## .htaccess dentro de la carpeta wp-admin
order deny,allow
deny from all
allow from xxx.xxx.xxx
allow from xxx.xxx.xxx
allow from xxx.xxx.xxx

En los cinco años que esta pregunta ha estado aquí, nadie ha abordado el problema central: La seguridad por oscuridad es una técnica válida para evitar bots automatizados y mantener los registros limpios. El objetivo de mover/ocultar wp-admin
es hacer parecer a un bot que esto no es un sitio WordPress.
La forma en que yo oculto (pero no muevo) wp-admin
es mostrar a los bots la página 404 estándar cuando intentan acceder a esa URL. Solo el acceso desde mi IP de casa permite que la página wp-admin
se muestre correctamente. Este método hace parecer a un atacante/bot que wp-admin
no existe, sin embargo, no rompe el código principal de WP ni los plugins que codifican directamente la ruta wp-admin
. Este código en .htaccess
lo hace posible:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^12\.34\.56\.78$
RewriteRule ^/?wp-admin - [R=404,L]
Por supuesto, al usar el código reemplaza 12.34.56.78
con tu propia dirección IP. No olvides escapar los caracteres .
ya que la dirección IP se interpreta como una expresión regular.

Esta no es una solución ya que la gran mayoría de las personas tienen IP dinámica y también podría querer acceder al panel de administración desde mi teléfono

@TheGodfather: Entonces actualiza la RewriteCond según corresponda

Se me ocurrió una solución para mover el inicio de sesión de WordPress desde /login/
, /wp-admin/
o /wp-login.php
a /cms
usando solo reglas de reescritura en .htaccess
.
¡No se necesita ningún plugin!
Pega esto en el archivo .htaccess en la raíz del proyecto:
<IfModule mod_rewrite.c>
# Mover el inicio de sesión a /cms.
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$
RewriteCond %{HTTP_REFERER} !/cms(.*)$
RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^(.*) ./cms?message=wrong_login_path [R=302,L]
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$
RewriteCond %{QUERY_STRING} !^cms=unlocked
RewriteCond %{REQUEST_METHOD} !POST
RewriteRule ^(.*) ./cms?message=redirect_to_custom_login_path [R=302,L]
RewriteRule ^cms wp-login.php?cms=unlocked [L]
</IfModule>
¡Saludos!
Actualización:
He mejorado algunas reglas para que incluso las solicitudes POST
a /wp-login.php generen un error 403 prohibido
. Esto ayudará contra los bots que intentan iniciar sesión en el panel de control usando métodos de fuerza bruta. Siéntete libre de comentar en esta publicación si tienes alguna mejora para estas reglas.

Crea nuevas páginas de inicio de sesión en subdirectorios. Copia la página existente de wp-login en un nuevo directorio dentro de tu raíz web (por ejemplo "/login"), renómbrala como index.php, agrega el bootstrap de WordPress al inicio de la página y haz los cambios que desees (temas, etc.).
Necesitarás ajustar un poco el código predeterminado de la página de inicio de sesión, principalmente para buscar/reemplazar enlaces codificados y redirecciones a "wp-login.php". Pero siempre y cuando dejes todos los hooks y filters en su lugar, este enfoque no afectará la integración con plugins. Las actualizaciones del núcleo de WordPress no serán un problema, a menos que la actualización incluya cambios en la página wp-login en sí (lo que rara vez ocurre en versiones menores).
También puedes crear páginas de cuenta de usuario de esta manera (yo las coloco en el directorio "/profile"). Una vez hecho esto, los usuarios con nivel de suscriptor nunca deberían necesitar acceder a wp-admin, por lo que puedes protegerlo con un archivo htaccess. Esta es la parte que realmente te brinda la seguridad adicional que buscabas. Solo asegúrate de hacer una excepción en tu htaccess para el archivo admin-ajax, ya que algunos plugins lo utilizan en el frontend.
Estoy bastante seguro de que no vas a encontrar una solución basada únicamente en plugins. Pero si lo haces, ¡avísanos!

Podrías usar este plugin:
http://wordpress.org/extend/plugins/wp-login/
Puedes simplemente crear una página y decirle al plugin que ahí es donde está el inicio de sesión. Pero básicamente lo que hace es redirigir wp-login.php a tu "página". Así que cualquier bot que busque wp-login.php simplemente será redirigido a tu "página".
Para proteger tu página de inicio de sesión de bots, deberías usar una combinación de una cookie y .htaccess, ya que la mayoría de los bots no usan cookies. Algo como esto:
RewriteCond %{HTTP_COOKIE} !^PHPSESSID=\w+ [OR]
RewriteCond %{HTTP_REFERER} !^https?://([^.]+\.)?example\.com/ [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule ^wp-(comments-post|login|register)\.php http://example\.com [R=301,L,NS]
En el ejemplo anterior estoy usando una Cookie de Sesión PHP, ya que es la más fácil de implementar.

Esta respuesta es un complemento a dotancohen porque está incompleta. La respuesta de dotancohen no tiene en cuenta wp-login.php
, lo cual deberías considerar si estás intentando ocultar WordPress.
Aquí te mostramos cómo devolver un error 404 tanto para wp-admin
como para wp-login.php
:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^12\.34\.56\.78$
RewriteCond %{THE_REQUEST} \ /+wp-(admin|login)

¿Estás hablando de reescritura de URL usando .htaccess? ¿No romperá las funciones internas del núcleo?

Bueno... si lo haces correctamente no debería romper nada. Leyendo tu actualización, te sugiero renombrar (o mover) tus elementos de inicio de sesión a otro directorio/ruta. ¿Qué tienes en mente? ¿Otro subdominio? ¿O simplemente otra ruta?

Entonces puedes hacer un Buscar y Reemplazar en todos los archivos de WordPress, luego renombrar los archivos que tengan el mismo patrón, y después renombrar la carpeta wp-admin
. Es un poco complicado y quedarás atado a esa versión (cualquier actualización romperá estos cambios)

Resolví este problema eliminando tres de mis blogs y cambiando los parámetros de limit-login a los máximos posibles: 9999.
Para ese despreciable spammer de la IP 208.91.199.94 que ha atacado mi página de inicio de sesión 750 veces en los últimos dos días, estoy trabajando en eliminarlo por otros medios.
