¿Es realmente beneficioso mover wp-config fuera del directorio raíz web?
Una de las prácticas de seguridad más comunes en estos días parece ser mover wp-config.php
un directorio más arriba que el directorio raíz del vhost. Nunca he encontrado una buena explicación para esto, pero supongo que es para minimizar el riesgo de que un script malicioso o infectado dentro del directorio web pueda leer la contraseña de la base de datos.
Sin embargo, aún debes permitir que WordPress acceda a él, por lo que necesitas expandir open_basedir
para incluir el directorio superior al directorio raíz. ¿No anula esto todo el propósito y además potencialmente expone los logs del servidor, copias de seguridad, etc. a los atacantes?
¿O la técnica solo intenta prevenir una situación donde wp-config.php
se mostraría como texto plano a cualquiera que solicite http://example.com/wp-config.php
, en lugar de ser procesado por el motor PHP? Esto parece ser una ocurrencia muy rara, y no compensaría las desventajas de exponer logs/backups/etc a peticiones HTTP.
¿Quizás es posible moverlo fuera del directorio raíz en algunas configuraciones de hosting sin exponer otros archivos, pero no en otras configuraciones?
Conclusión: Después de mucho debate sobre este tema, han surgido dos respuestas que creo que deberían considerarse las autorizadas. Aaron Adams presenta un buen argumento a favor de mover wp-config, y chrisguitarguy presenta un buen argumento en contra. Estas son las dos respuestas que deberías leer si eres nuevo en el hilo y no quieres leer todo el contenido. Las otras respuestas son redundantes o inexactas.

Respuesta corta: sí
La respuesta a esta pregunta es sí y decir lo contrario es probablemente irresponsable.
Respuesta larga: un ejemplo del mundo real
Permíteme proporcionar un ejemplo muy real, de mi servidor real, donde mover wp-config.php
fuera del directorio web evitó específicamente que su contenido fuera capturado.
El error:
Observa esta descripción de un error en Plesk (corregido en 11.0.9 MU#27):
¿Suena inofensivo, verdad?
Bueno, esto es lo que hice para desencadenar este error:
- Configuré un subdominio para redirigir a otra URL (por ejemplo,
site.staging.server.com
asite-staging.ssl.server.com
). - Cambié el plan de servicio de la suscripción (por ejemplo, su configuración de PHP).
Cuando hice esto, Plesk restableció el subdominio a los valores predeterminados: sirviendo el contenido de ~/httpdocs/
, sin intérpretes (por ejemplo, PHP) activos.
Y no me di cuenta. Durante semanas.
El resultado:
- Con
wp-config.php
en la raíz web, una solicitud a/wp-config.php
habría descargado el archivo de configuración de WordPress. - Con
wp-config.php
fuera de la raíz web, una solicitud a/wp-config.php
descargó un archivo completamente inofensivo. El archivo realwp-config.php
no pudo ser descargado.
Por lo tanto, es obvio que mover wp-config.php
fuera del directorio web puede tener beneficios de seguridad genuinos en el mundo real.
Cómo mover wp-config.php
a cualquier ubicación en tu servidor
WordPress buscará automáticamente un directorio por encima de tu instalación de WordPress para encontrar tu archivo wp-config.php
, así que si lo has movido allí, ¡has terminado!
¿Pero qué pasa si lo has movido a otro lugar? Fácil. Crea un nuevo wp-config.php
en el directorio de WordPress con el siguiente código:
<?php
/** Ruta absoluta al directorio de WordPress. */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
/** Ubicación de tu configuración de WordPress. */
require_once(ABSPATH . '../phpdocs/wp-config.php');
(Asegúrate de cambiar la ruta anterior a la ruta real de tu archivo wp-config.php
reubicado).
Si tienes un problema con open_basedir
, simplemente agrega la nueva ruta a la directiva open_basedir
en tu configuración de PHP:
open_basedir = "/var/www/vhosts/example.com/httpdocs/;/var/www/vhosts/example.com/phpdocs/;/tmp/"
¡Eso es todo!
Refutando argumentos en contra
Cada argumento en contra de mover wp-config.php
fuera del directorio web parece basarse en suposiciones falsas.
Argumento 1: Si PHP está deshabilitado, ya están dentro
La única forma en que alguien verá el contenido de [
wp-config.php
] es si eluden el intérprete PHP de tu servidor… Si eso sucede, ya estás en problemas: tienen acceso directo a tu servidor.
FALSO: El escenario que describo arriba es el resultado de una mala configuración, no de una intrusión.
Argumento 2: Deshabilitar PHP accidentalmente es raro y, por lo tanto, insignificante
Si un atacante tiene suficiente acceso para cambiar el manejador de PHP, ya estás en problemas. Los cambios accidentales son muy raros en mi experiencia, y en ese caso sería fácil cambiar la contraseña.
FALSO: El escenario que describo es el resultado de un error en un software de servidor común, que afecta una configuración de servidor común. Esto difícilmente es "raro" (y además, la seguridad implica preocuparse por el escenario raro).
Cambiar la contraseña después de una intrusión no ayuda mucho si se recopiló información sensible durante la intrusion. Realmente, ¿todavía pensamos que WordPress solo se usa para blogs casuales y que los atacantes solo están interesados en la desfiguración? Preocupémonos por proteger nuestro servidor, no solo restaurarlo después de que alguien entre.
Argumento 3: Denegar el acceso a wp-config.php
es suficiente
Puedes restringir el acceso al archivo a través de la configuración de tu host virtual o
.htaccess
– limitando efectivamente el acceso externo al archivo de la misma manera que moverlo fuera del directorio raíz.
FALSO: Imagina que los valores predeterminados de tu servidor para un host virtual son: sin PHP, sin .htaccess
, allow from all
(nada inusual en un entorno de producción). Si tu configuración se restablece durante una operación rutinaria – como, digamos, una actualización del panel – todo volverá a su estado predeterminado, y estás expuesto.
Si tu modelo de seguridad falla cuando los ajustes se restablecen accidentalmente a los valores predeterminados, probablemente necesitas más seguridad.
¿Por qué alguien específicamente recomendaría menos capas de seguridad? Los autos caros no solo tienen cerraduras; también tienen alarmas, inmovilizadores y rastreadores GPS. Si algo vale la pena proteger, hazlo bien.
Argumento 4: El acceso no autorizado a wp-config.php
no es gran cosa
La información de la base de datos es realmente lo único sensible en [
wp-config.php
].
FALSO: Las claves y sales de autenticación pueden usarse en cualquier cantidad de posibles ataques de secuestro.
Incluso si las credenciales de la base de datos fueran lo único en wp-config.php
, deberías estar aterrado de que un atacante las consiga.
Argumento 5: Mover wp-config.php
fuera del directorio web en realidad hace que un servidor sea menos seguro
Todavía tienes que permitir que WordPress acceda a [
wp-config.php
], así que necesitas expandiropen_basedir
para incluir el directorio por encima del directorio raíz del documento.
FALSO: Asumiendo que wp-config.php
está en httpdocs/
, simplemente muévelo a ../phpdocs/
, y configura open_basedir
para incluir solo httpdocs/
y phpdocs/
. Por ejemplo:
open_basedir = "/var/www/vhosts/example.com/httpdocs/;/var/www/vhosts/example.com/phpdocs/;/tmp/"
(Recuerda incluir siempre /tmp/
, o tu directorio tmp/
de usuario, si tienes uno).
Conclusión: los archivos de configuración siempre siempre siempre deben estar ubicados fuera del directorio web
Si te importa la seguridad, deberías mover wp-config.php
fuera de tu directorio web.

Si tienes un error en Apache, Linux o en el cerebro del administrador, estás perdido de cualquier manera. En tu escenario no logras explicar por qué es más probable que ocurra una mala configuración en la raíz del sitio web que en cualquier otro lugar del servidor. Un Apache mal configurado probablemente podría acceder a /../config.php tan fácilmente como a /config.php

No estás "perdido de cualquier manera". Es muy probable, e incluso demostrable, que un error resultaría en que la raíz web se restablezca a su valor predeterminado, en cuyo caso no estás "perdido" – tu wp-config.php
permanece seguro. Y es extremadamente improbable – tanto que esencialmente es imposible – que un error resulte en que la raíz web se restablezca arbitrariamente exactamente al directorio donde colocaste tu wp-config.php
.

¿Qué tan probable es este tipo de error? No soy un experto en seguridad, pero nunca he escuchado que este vector de ataque se utilice en la práctica. Estoy en contra de recomendar este método porque cuando necesites mantener tu sitio, no sabrás dónde está tu wp-config y probablemente invalidará la mayoría de los tutoriales que tocan ese archivo de alguna manera. Tú, yo y el resto de los comentaristas aquí descubriremos qué pasó, pero para personas con menos experiencia será un gran y prolongado momento de WTF.

@MarkKaplun "La gente que no lee Stack Exchange podría confundirse" es un argumento bastante pobre en contra de recomendar una práctica de seguridad en Stack Exchange. Cuando más personas comprendan los peligros reales de dejar archivos de configuración sensibles dentro del directorio raíz web, más personas moverán esos archivos fuera del directorio raíz, y más tutoriales de WordPress se escribirán para ayudar al usuario a ubicar el archivo wp-config.php
. Si crees que la conveniencia es más importante que la seguridad, esa es tu opinión; solo deja claro, entonces, que estás recomendando que los usuarios prioricen la conveniencia sobre la seguridad.

Hola Aaron, gracias por tu respuesta reflexiva y detallada. Tienes razón en que simplemente cambiar la contraseña después de una intrusión no es suficiente. Sin embargo, todavía no me convence tu anécdota sobre Plesk. Definitivamente es un problema, pero no creo que mover wp-config sea la solución adecuada para ese problema. Lo mismo aplica para la configuración de vhost que se reinicia, etc. Si tu aplicación necesita suficiente seguridad como para preocuparte por ese tipo de vulnerabilidades, entonces realmente necesitas abordarlas de una manera más directa. Por ejemplo, no uses Plesk, porque siempre será vulnerable; asegúrate de que tu configuración de vhost sea segura por defecto...

...usa gestión de configuración para documentar y hacer cumplir automáticamente todos los aspectos del sistema, etc. Se podría argumentar que mover wp-config es una alternativa pobre a técnicas más profesionales, y eso está bien, pero no creo que deba presentarse como una solución adecuada. En respuesta a moverlo a httpdocs/../phpdocs, que yo sepa, WordPress solo lo buscará un directorio por encima de ABSPATH, así que eso no es posible.

@IanDunn En realidad, es fácil mover wp-config.php
a una ubicación arbitraria. He agregado instrucciones a mi respuesta; solo implica crear un wp-config.php
simulado en el directorio de WordPress que haga referencia a la ubicación del archivo real.

Esta respuesta es acertada. Mi empresa de alojamiento web tuvo una falla en el arreglo de discos. Cuando todo terminó, restauraron el sistema PARCIALMENTE. Resulta que usaron una serie de scripts de cPanel/WHM para reconstruir archivos httpd.conf que lo hicieron incorrectamente. Afortunadamente ya tenía wp-config.php fuera del directorio raíz, pero si no lo hubiera tenido, el contenido estaba allí para ser tomado. Sí, es raro, pero como se señaló, los casos raros son los que deben preocuparte. Además, afirmar que "la gente simple se perdería" es una mala excusa para tener MENOS seguridad.

Ese es un buen punto, Aaron. Todavía soy un poco escéptico por las razones que he mencionado en este y otros hilos de comentarios, pero me has convencido de que tiene más mérito de lo que pensaba originalmente. Al menos, si se hace correctamente, no creo que perjudique nada. Todavía tengo un problema con el hecho de que la mayoría de las personas que lo promueven no parecen entender las razones para hacerlo, y la forma en que lo enseñan a menudo llevaría a exponer el directorio superior a httpdocs, pero has ayudado a abordar esos problemas en tu respuesta.

@IanDunn Estoy totalmente de acuerdo contigo en que la mayoría de las personas que recomiendan mover wp-config.php
un nivel arriba en el directorio en realidad no entienden la seguridad del servidor. Son las mismas personas que rápidamente recomendarían chmod 777
en .htaccess
, un archivo que podría usarse fácilmente para redirigir usuarios a sitios de phishing. Para ser honesto, esto parece representativo del estado general de la comunidad de WordPress; hay una cantidad asombrosa de código malo por ahí, y debido al tamaño de la comunidad, prolifera. Todo lo que podemos hacer es tratar de educar mejor a las personas sobre los riesgos.

@CharlestonSoftwareAssociates ¡Me alegra saber que estabas bien preparado! Para protegerme aún más contra problemas como este, ya no permito que los archivos permanezcan en sus directorios predeterminados; esos mismos archivos web que fueron expuestos hace unos días en ~/httpdocs/
ahora residen en ~/sites/example.com/www/
. La próxima vez que algo se restablezca a los valores predeterminados, los dominios mostrarán errores 500, en lugar de servir mis archivos PHP sin procesar.

@AaronAdams - esa es una buena idea, pero en mi caso no habría ayudado. Restauraron SUFICIENTE de la configuración para apuntar a mi raíz de documentos no predeterminada, pero no lo suficiente para que funcionara correctamente. Realmente el peor escenario posible. De hecho, PARTE del sitio funcionó después del segundo intento de arreglarlo, pero todavía no estaba bien. Verdaderamente una situación horrible cortesía de una reparación de servidor mal gestionada por mi empresa de hosting, lo que creo que refuerza tu punto. Cuanto más puedas hacer para proteger datos sensibles incluso para esos eventos "uno en un millón", mejor.

¿Puedo escribir ../../wp-config.php o incluso un nombre diferente? Lo probé en un sistema automator con la configuración constante estando un nivel arriba. Hice que el blog estuviera en una subcarpeta, por lo que quería colocar wp-config.php 2 niveles arriba pero el sitio web no funcionó al usar ../../, mientras que ..// funciona cuando WP no está en una subcarpeta.

Respuesta muy clara con una conclusión muy clara. He estado practicando esto y otras medidas de seguridad durante años y no he tenido incidentes de seguridad en tres instancias de WordPress alojadas por separado. Creo que la mera suposición de que porque algo no es tan efectivo por sí solo como lo es en combinación con otras medidas. Sin embargo, la gente sigue perpetuando este consejo incómodo de hacer que SSH escuche en puertos no privilegiados ("altos") por algún falso sentido de seguridad, por ejemplo. O consideramos que la seguridad es el resultado de una combinación de medidas que apuntan a ella, o la dejamos por completo.

Equivoqué alguna configuración en nginx y comenzó a descargar archivos con toda la información sensible. Así que definitivamente es mejor colocar wp-conf en un directorio arriba. El famoso framework PHP "Laravel" utiliza este mismo enfoque por defecto también.

Lo más importante es que el archivo wp-config.php
contiene información sensible: tu nombre de usuario/contraseña de la base de datos, etc.
Así que la idea es: moverlo fuera del directorio raíz del documento, y no tendrás que preocuparte por nada. Un atacante nunca podrá acceder a ese archivo desde una fuente externa.
Sin embargo, aquí está el problema: wp-config.php
nunca imprime nada en pantalla. Solo define varias constantes que se utilizan en toda tu instalación de WordPress. Por lo tanto, la única forma en que alguien podrá ver el contenido de ese archivo es si eluden el intérprete de PHP de tu servidor, es decir, si logran que un archivo .php
se muestre como texto plano. Si eso sucede, ya estás en problemas: tienen acceso directo a tu servidor (y probablemente permisos de root) y pueden hacer lo que quieran.
Voy a adelantarme y decir no hay ningún beneficio en mover wp-config
fuera del directorio raíz desde una perspectiva de seguridad—por las razones anteriores y estas:
- Puedes restringir el acceso al archivo mediante la configuración de tu host virtual o .htaccess, limitando efectivamente el acceso externo al archivo de la misma manera que lo haría moverlo fuera del directorio raíz.
- Puedes asegurarte de que los permisos del archivo sean estrictos en
wp-config
para evitar que cualquier usuario sin privilegios suficientes pueda leer el archivo, incluso si obtienen acceso (limitado) a tu servidor mediante SSH. - Tu información sensible, como los ajustes de la base de datos, solo se utiliza en un único sitio. Así que, incluso si un atacante obtuviera acceso a esa información, el único sitio afectado sería la instalación de WordPress a la que pertenece el archivo
wp-config.php
. Más importante aún, ese usuario de la base de datos solo tiene permisos para leer y escribir en la base de datos de esa instalación de WordPress y nada más—sin acceso para otorgar permisos a otros usuarios. En otras palabras, si un atacante obtiene acceso a tu base de datos, simplemente es cuestión de restaurar desde una copia de seguridad (ver punto 4) y cambiar el usuario de la base de datos. - Haces copias de seguridad con frecuencia. "Con frecuencia" es un término relativo: si publicas 20 artículos al día, es mejor hacer copias de seguridad diarias o cada pocos días. Si publicas una vez a la semana, hacer una copia de seguridad semanal probablemente sea suficiente.
- Tienes tu sitio bajo control de versiones (como este), lo que significa que incluso si un atacante obtiene acceso, puedes detectar fácilmente los cambios en el código y revertirlos. Si un atacante tiene acceso a
wp-config
, probablemente también haya alterado algo más. - La información de la base de datos es realmente lo único sensible en
wp-config
, y como eres cuidadoso con ella (ver puntos 3 y 4), no es un gran problema. Las sales y similares pueden cambiarse en cualquier momento. Lo único que ocurre es que se invalidan las cookies de los usuarios que hayan iniciado sesión.
Para mí, mover wp-config
fuera del directorio raíz huele a seguridad por oscuridad—lo cual es básicamente un hombre de paja.

Sí, eso es básicamente lo que he estado pensando. Me alegra saber que no soy el único :) Me gustaría dejar la pregunta abierta uno o dos días más por si alguien tiene un contraargumento convincente, pero hasta ahora esta parece ser la respuesta correcta para mí.

Pequeña corrección: No hay ningún beneficio de seguridad al mover el archivo wp-config.php fuera del directorio raíz del documento. Hay otros beneficios, que no están relacionados con la seguridad, y que solo aplican en configuraciones inusuales.

Solo para desmentir un posible mito - ¿no es posible que algo salga mal del lado del servidor, en cuyo caso el código php se imprima en la pantalla?

Claro. Si mod_php no está funcionando o los archivos PHP no se pasan al intérprete de PHP, es posible. Si estás ejecutando una configuración FCGI, puede ocurrir lo mismo si los archivos PHP no se pasan al proceso fcgi para su interpretación. Ambos casos apuntan a problemas bastante grandes que no son probables que ocurran, sin embargo.

Creo que la pregunta central aquí no es si hay algún beneficio al moverlo, sino si esos beneficios superan el riesgo de expandir el alcance de openbase_dir para incluir el directorio padre, que a menudo contiene archivos de registro, copias de seguridad, un directorio de almacenamiento de archivos privados, etc. Sigo preguntando sobre eso, y ninguno de los proponentes de mover wp-config me ha dado una respuesta. Así que, en este punto, interpreto su silencio como que los beneficios no valen el riesgo.

@IanDunn Pero las mejores respuestas abogan por sacarlo completamente de esa jerarquía hacia una separada, lo que sí aborda tu preocupación sobre los registros, etc. Esta respuesta no responde a tu pregunta del título "¿realmente es beneficioso mover...?", solo dice que otras medidas de seguridad son beneficiosas e intenta tranquilizarte para que no te preocupes por la seguridad. Todos piensan que su casa está segura hasta que les roban. Después de eso, hacen un mejor trabajo. Algunas personas nunca son robadas, aunque su seguridad sea baja, pero eso no significa que sea un buen consejo tener menor seguridad.

Por lo que sé, no es posible moverlo a ningún lugar excepto un directorio por encima de ABSPATH, porque ese es el único lugar donde WP lo buscará.

No importa, Aaron actualizó su respuesta con una solución alternativa para eso, usando un archivo wp-config.php ficticio para incluir() el real.

Estos son buenos puntos, pero mi mayor problema con ellos es que son argumentos remediales, no preventivos. La mayoría de estos hablan sobre cómo no es gran cosa porque A) asumes que alguien manejó correctamente el usuario de la base de datos y B) tienes copias de seguridad. ¿Qué pasa cuando usas algo como WooCommerce o almacenas información sensible en tu base de datos? Entonces estás en problemas.

Metí la pata con alguna configuración en nginx y empezó a descargar archivos que contenían toda la información sensible. Así que definitivamente es mejor colocar el wp-conf en un directorio superior. El famoso framework PHP "Laravel" usa el mismo enfoque por defecto también.

Qué perspectiva tan ignorante sobre seguridad. Como si no hubiera diferencia en el alcance entre (accidentalmente) configurar mal PHP y filtrar credenciales al servidor de bases de datos junto con las sales para los hashes de contraseñas contenidos allí. Si bien el punto de quiebre final de las medidas de seguridad es binario, su implementación no lo es. Siguiendo tu lógica, podrías eliminar cualquier componente básico, como SELinux/AppArmor, sin afectar la seguridad general del sistema. Debería ser obvio lo equivocado que es esto. Típicamente, las medidas de seguridad preventivas intentan protegerse incluso contra casos improbables.

Creo que la respuesta de Max es acertada, y esa es una parte de la historia. El WordPress Codex ofrece más consejos:
Además, asegúrate de que solo tú (y el servidor web) puedan leer este archivo (generalmente significa un permiso 400 o 440).
Si usas un servidor con .htaccess, puedes agregar esto en ese archivo (al principio) para denegar el acceso a cualquiera que intente acceder:
<files wp-config.php> order allow,deny deny from all </files>
Ten en cuenta que establecer permisos 400 o 440 en wp-config.php puede evitar que los plugins escriban o lo modifiquen. Un caso real sería, por ejemplo, los plugins de caché (W3 Total Cache, WP Super Cache, etc.). En ese caso, recomendaría usar permisos 600 (el permiso predeterminado para archivos en el directorio /home/usuario
).

Max tiene la respuesta. +1 para él. Simplemente estoy tratando de ampliarla.

Entonces, si usas htaccess para denegar solicitudes HTTP a wp-config.php, ¿no se logra el mismo resultado que moverlo fuera del directorio raíz del documento, pero sin exponer logs/backups/etc?

@IanDunn Depende de cuál sea la raíz del documento— (1) Si WordPress está alojado en un directorio dentro de public_html
, mover wp-config.php
fuera del directorio significa que estará en el directorio public_html
. En este caso, tendrás que usar reglas htaccess para denegar las solicitudes HTTP a wp-config.php. (2) Si WordPress está instalado directamente bajo el directorio public_html
, un nivel arriba => lo estarás moviendo al directorio /home/usuario
. En este caso estarás bastante seguro ya que el archivo está fuera de la raíz del documento. Aún puedes establecer los permisos del archivo en 600 (o incluso más restrictivos 440 o 400).

@IanDunn Como dije, este es mi entendimiento básico, y no soy un experto en seguridad. :)

En el caso #1 no obtienes el beneficio de seguridad deseado. El objetivo principal es moverlo fuera de la raíz del documento, no solo un nivel arriba.

En el caso #2, tendrías que ampliar el alcance de open_basedir
para permitir que PHP acceda a todo en /home/user, lo que me parece un gran problema. Cualquier cosa almacenada allí (logs, backups, .bash_history, etc) sería accesible para cualquier script PHP infectado que se ejecute en /home/user/public_html. Parece que sería mejor dejar wp-config en /home/user/public_html/wp-config.php y usar reglas htaccess para bloquear solicitudes HTTP a él. Todavía obtienes el beneficio de bloquear el acceso en el (poco probable) caso de que se muestre en texto plano, pero no expones archivos por encima de public_html.

Alguien nos pidió que aclaráramos este tema, y responderé aquí.
Sí, existen beneficios de seguridad al aislar tu archivo wp-config.php del directorio raíz de tu sitio.
1- Si tu manejador de PHP se corrompe o modifica de alguna manera, tu información de la base de datos no quedará expuesta. Y sí, he visto esto suceder varias veces en hosting compartidos durante actualizaciones del servidor. Sí, el sitio estará caído durante ese período, pero tus contraseñas permanecerán intactas.
2- Las mejores prácticas siempre recomiendan aislar los archivos de configuración de los archivos de datos. Sí, es difícil hacer esto con WordPress (o cualquier aplicación web), pero moverlo hacia arriba proporciona cierto nivel de aislamiento.
3- Recuerda la vulnerabilidad de PHP-CGI, donde cualquiera podía pasar el parámetro ?-s a un archivo y ver el código fuente. http://www.kb.cert.org/vuls/id/520827
Al final, estos son pequeños detalles, pero ayudan a minimizar el riesgo. Especialmente si estás en un entorno compartido, donde cualquiera puede acceder a tu base de datos (todo lo que necesitan es un usuario/contraseña).
Pero no dejes que pequeñas distracciones (optimizaciones prematuras) se interpongan en lo que realmente es necesario para mantener un sitio adecuadamente seguro:
1- Mantén todo siempre actualizado
2- Usa contraseñas seguras
3- Restringe el acceso (mediante permisos). Tenemos un post sobre esto aquí:
http://blog.sucuri.net/2012/08/wordpress-security-cutting-through-the-bs.html
Gracias,

Hola chicos, gracias por compartir sus opiniones. Creo que ya hemos tocado la mayoría de esos puntos en las otras respuestas y sus comentarios. 1) Sí, esto es posible, pero raro; 2) Sí, esto tiene beneficios, pero son mínimos; 3) Sí, esto es posible, pero ese tipo de vulnerabilidad es poco probable que vuelva a ocurrir, y protegerte contra ella es como jugar al "whac-a-mole", o hacer que la gente se quite los zapatos en los aeropuertos porque algún idiota escondió una bomba en su zapato una vez. Es reactivo y poco probable que tenga beneficios futuros.

En las diversas discusiones, la pregunta se refinó de "¿Hay algún beneficio?" a "Ok, hay algunos beneficios, pero ¿superan los riesgos?" El principal riesgo al que me refiero es el hecho de que tienes que expandir el alcance de openbase_dir para permitir que PHP acceda a scripts fuera del directorio raíz web. Muchas configuraciones de hosting -- incluyendo aquellas que usan Plesk, que son muchas -- almacenan logs, backups, áreas FTP privadas que se supone deben estar aisladas del directorio raíz web, etc. en el directorio superior al raíz web. Por lo tanto, darle acceso a PHP a ese directorio puede ser una vulnerabilidad seria.

@IanDunn ¿desde cuándo la rareza de un evento ha sido un contraargumento válido para no tomar una medida de seguridad preventiva que aborde tal evento improbable? Tu punto sobre dónde PHP puede abrir archivos puede abordarse hoy en día mediante el endurecimiento de systemd, por cierto. Todo el punto de la seguridad en TI es que los atacantes tienen infinitas rutas de incursión a su disposición, mientras que los defensores solo pueden defenderse contra vectores de ataque conocidos. Por lo tanto, es costumbre combinar tantas medidas preventivas como sea factible para proporcionar una red de seguridad, en lugar de depender de un solo nudo.

Definitivamente SÍ.
Cuando mueves el archivo wp-config.php fuera del directorio público, lo proteges de ser leído a través del navegador en caso de que el manejador de PHP sea cambiado de forma maliciosa (¡o accidental!).
Leer tus credenciales de base de datos (usuario/contraseña) es posible cuando el servidor está gravemente infectado por culpa de un administrador negligente. Cobra una multa al administrador y consigue un servicio de hosting más confiable y mejor administrado. Aunque probablemente sea más costoso.

Si un atacante tiene suficiente acceso para cambiar el manejador de PHP, ya estás en problemas. Los cambios accidentales son muy raros en mi experiencia, y en ese caso sería fácil cambiar la contraseña. Teniendo en cuenta esto, ¿sigues pensando que vale la pena el riesgo de exponer registros/copias de seguridad/etc. debido al alcance ampliado de open_basedir
?

Nunca he tenido acceso -rwx
a directorios superiores a public_html
, así que nunca estuve familiarizado con open_basedir
. Mis registros están en un directorio separado, igual que las copias de seguridad. Creo que eso es lo que tienen todos los hosts compartidos.

Los hosts varían mucho; no hay una estructura de directorios estándar. Plesk (uno de los paneles de control más populares para hosts compartidos) coloca los registros en /var/www/vhosts/example.com/statistics/logs y la raíz del documento está en /var/www/vhosts/example.com/httpdocs. Mover wp-config.php a /var/www/vhosts/example.com/wp-config.php requeriría dar acceso a los scripts a todo el directorio example.com.

Solo por curiosidad, ¿dónde se almacenan tus registros y copias de seguridad si no están en el directorio del dominio? ¿Se accede a ellos a través de un panel de control o algo así?

Puedo estar equivocado en esto, pero si tu servidor no es seguro, un ataque de enlace simbólico podría leer tu wp-config.php sin importar dónde esté. Todo lo que un atacante necesita saber es dónde podría estar el archivo y si el enlace simbólico es posible. Tal vez esta pregunta esté fuera de tema, pero parece que si hubiera una forma de renombrar el wp-config.php, sería una manera de evitar que lo busquen.

Solo quiero aclarar, para efectos de discusión, que mover tu archivo wp_config.php no necesariamente significa que debas moverlo solo al directorio padre. Digamos que tienes una estructura como /root/html, donde html contiene la instalación de WP y todo tu contenido HTML. En lugar de mover wp_config.php a /root, podrías moverlo a algo como /root/secure ... que está tanto fuera del directorio html como también no está en el directorio raíz del servidor. Por supuesto, tendrías que asegurarte de que PHP pueda ejecutarse en esta carpeta secure también.
Dado que WP no puede configurarse para buscar wp_config.php en una carpeta hermana como /root/secure, debes dar un paso adicional. Dejé el wp_config.php en /root/html, y corté las partes sensibles (inicio de sesión a la base de datos, salt, prefijo de tabla) y las moví a un archivo separado llamado config.php. Luego agregas el comando PHP include
a tu wp_config.php, así: include('/home/content/ruta/a/root/secure/config.php');
Esto es esencialmente lo que he hecho en mi configuración. Ahora, basado en la discusión anterior, aún estoy evaluando si es necesario o incluso una buena idea. Pero solo quería agregar que la configuración anterior es posible. No expone tus respaldos y otros archivos raíz, y siempre que la carpeta secure no esté configurada con su propia URL pública, no es navegable.
Además, puedes limitar el acceso a la carpeta secure creando un archivo .htaccess allí con:
order deny,allow
deny from all
allow from 127.0.0.1

Hola Michael, gracias por compartir eso. ¿Lo has probado en un entorno real para verificar que funciona? Creo que la directiva open_basedir
toma un árbol completo, así que para acceder a /root/secure
desde /root/html
, tendrías que configurar open_basedir
como /root
.

Para que tu idea funcione, creo que necesitarías configurar la estructura de directorios como /root/httpdocs/config/accessible
, donde httpdocs
contenga logs, backups, etc; config
contenga wp-config.php
, y accessible
contenga WordPress y todo el contenido. Tendrías que modificar la configuración del vhost, etc. para reasignar el document root a accessible
. Aunque no veo ningún beneficio sobre simplemente denegar las peticiones HTTP a wp-config en la configuración predeterminada.

Según http://www.php.net/manual/en/ini.core.php#ini.open-basedir: "En Windows, separa los directorios con punto y coma. En otros sistemas, separa los directorios con dos puntos. Como módulo de Apache, las rutas open_basedir de los directorios padres ahora se heredan automáticamente." Así que puedes configurar múltiples directorios, no es necesario que estén en un único árbol.

Acabo de probarlo y parece que tienes razón. Aún no estoy seguro de qué beneficio de seguridad tiene esto sobre simplemente denegar el acceso al archivo a través de Apache.

Existen muchos temas y plugins mal escritos que permiten a los atacantes inyectar código (recuerden el problema de seguridad con Timthumb). Si yo fuera un atacante, ¿por qué buscaría el wp-config.php? Simplemente inyectaría este código:
var_dump( DB_NAME, DB_USER, DB_PASSWORD );
Puedes intentar ocultar tu wp-config.php. Mientras WordPress haga accesible globalmente toda la información sensible, no tiene beneficio ocultar el wp-config.php.
La parte mala de wp-config.php no es que contenga datos sensibles. La parte mala es definir los datos sensibles como una constante globalmente accesible.
Actualización
Quiero aclarar los problemas con define()
y por qué es una mala idea definir datos sensibles como una constante global.
Existen muchas formas de atacar un sitio web. La inyección de scripts es solo una de ellas.
Supongamos que el servidor tiene una vulnerabilidad que permite a un atacante acceder a un volcado de memoria. El atacante encontrará en el volcado de memoria todos los valores de todas las variables. Si defines una constante globalmente accesible, esta debe permanecer en memoria hasta que el script termine. Al crear una variable en lugar de una constante, hay una buena probabilidad de que el recolector de basura sobrescriba (o libere) la memoria después de que la variable ya no sea necesaria.
Una mejor forma de proteger datos sensibles es eliminarlos inmediatamente después de usarlos:
$db_con = new stdClass();
$db_con->db_user = 'usuario';
$db_con->password = 'contraseña';
$db_con->host = 'localhost';
$db_handler = new Database_Handler( $db_con );
$db_con = null;
Después de usar los datos sensibles, la asignación a null
sobrescribirá los datos en memoria. Un atacante tendría que obtener el volcado de memoria justo en el momento en que $db_con
contiene los datos sensibles. Y ese es un tiempo muy corto en el ejemplo anterior (si la clase Database_Handler no guarda una copia de ellos).

Esta respuesta no aborda directamente la pregunta. Cualquier autor de plugins puede tener un día de campo con WordPress si te convence de instalar su código y tiene intenciones maliciosas. No es diferente a instalar voluntariamente un virus en tu sistema. Este argumento para no mover wp-config.php no tiene sentido. Es como decir que instalar voluntariamente una bomba en tu auto hace que activar la alarma del auto sea inútil. Técnicamente cierto, pero ¡¿qué demonios?!

No, no carece de sentido. La pregunta es: ¿Puedo proteger la cuenta de la base de datos ocultando wp-config.php? Y la respuesta es claramente: No. Es lo mismo que preguntar: "¿Puedo proteger mi auto contra bombas con una alarma?" No hay otro beneficio al ocultar tu wp-config más allá de proteger el acceso a la base de datos o FTP. Ambos están en el ámbito global. Estoy seguro de que hay más formas para que los atacantes accedan a variables globales sin inyectar código.

No veo "¿puedo proteger la cuenta de la base de datos ocultando wp-config.php?" en la pregunta original. La pregunta original era "¿tiene sentido mover wp-config.php?". La respuesta es absolutamente sí, en mi opinión. Es como preguntar si deberías cerrar con llave la puerta de entrada cuando sales. Decir "alguien puede romper fácilmente una ventana y entrar de todos modos, así que ¿para qué molestarse?" no responde al punto fundamental de la pregunta. En mi opinión, la pregunta era: "¿Vale la pena el esfuerzo adicional de mover wp-config.php? ¿Hay ALGÚN beneficio al hacerlo?". Sí. Al menos mantiene alejados a los hackers perezosos.

Una de las mejores prácticas de seguridad más comunes... Te perdiste un punto muy (muy, muy) importante: ¿En qué está interesado un atacante? Y no es cómo hayas estilizado tu wp-config.php. Un atacante está interesado en los valores que has definido en tu wp-config. Tomando tu ejemplo con la puerta principal: Ocultar tu wp-config es lo mismo que si cerraras con llave tu puerta principal, pero dejaras todo tu oro desprotegido en el jardín. Todos los valores definidos en el wp-config son definidos globalmente. Por lo tanto, son todos accesibles fuera del wp-config. Incluso si ocultas tu wp-config, los valores siguen presentes.

Creo que aquellos que argumentan a favor de moverlo están intentando proteger contra escenarios donde wp-config.php podría mostrarse en texto plano a través de una solicitud HTTP, en lugar de escenarios donde podría exponerse a otro código PHP ejecutándose en el host.

@Ralf912 - eso no es del todo exacto. Las definiciones globales son ACCESIBLES por todos los archivos de programa en todos los directorios pero no se muestran. Para VER los valores necesitarías poder escribir código modificado de vuelta al servidor. Mientras que un servidor mal configurado con wp-config.php en la raíz del documento mostrará fácilmente esos valores como texto plano. Ese es el punto subyacente. Ver el código de cualquier plugin/tema no causa ningún daño.

Lamento revivir una publicación antigua, pero ¿no hay una solución obvia para todo esto? Sabemos que hay algunos beneficios de seguridad al mover el archivo wp-config.php fuera del directorio raíz de WordPress. Algunos argumentarían que los beneficios son mínimos, otros no estarían de acuerdo.
Por otro lado, puede haber algunos inconvenientes al mover el archivo de su ubicación predeterminada, como romper algunos plugins que no tienen la funcionalidad para buscar el archivo wp-config.php en otras ubicaciones.
Lo más obvio para mí es crear un archivo secret-info.php fuera del directorio raíz de WordPress que contenga variables para todos tus nombres de usuario y contraseñas, por ejemplo:
$userName = "user";
$databasePassword = "12345";
Deja el archivo wp-config.php en la ubicación predeterminada del directorio raíz de WordPress, elimina los valores de nombre de usuario y contraseña de wp-config.php pero deja todo lo demás. Luego simplemente referencia las variables $userName y $databasePassword requiriendo secret-info.php en wp-config.php, así:
require('RUTA-AL-ARCHIVO/secret-info.php');
Parece lo más obvio a hacer, ¿me estoy perdiendo algo aquí?

De hecho, es algo muy bueno agregar una respuesta a una pregunta antigua, incluso hay una insignia por ello. WPSE está diseñado para ser un repositorio de conocimiento, más que un foro.

Una eternidad después y WordPress todavía coloca el archivo wp-config.php
por defecto en su directorio raíz, accesible desde la web sin siquiera añadir reglas .htaccess para prevenir su acceso. La mayoría de los alojamientos compartidos que tienen instalación de WordPress en un clic probablemente hacen lo mismo. El resultado es que la mayoría de los sitios WordPress están configurados así y no creo haber escuchado a alguien decir "mi sitio fue hackeado porque wp-config.php estaba en el directorio raíz".
Para usar la información contenida en el archivo, necesitas acceso al servidor de base de datos, probablemente añadiendo scripts a algún servidor de aplicaciones. Si usas un VPS, significa que si un atacante tiene esa capacidad, es "game over" para ti de cualquier forma. En alojamientos compartidos, probablemente aíslan el acceso a la base de datos por usuario, por lo que no es algo trivial de hacer incluso en ese entorno.
El resultado es que el informe de salud de WordPress 5.2+ no sugerirá mover el archivo, y nunca escuché de un plugin de seguridad que lo haga.
Así que, información práctica a largo plazo muestra que, teóricamente, es mejor hacerlo, pero en su mayoría es teatro de seguridad.
El verdadero problema con mover wp-config.php
un directorio arriba es que esencialmente evita que otros WordPress sean instalados en el mismo directorio que el primero, algo que mucha gente hace. La solución es mantener tu wp-config.php
en la ubicación predeterminada pero añadirle código que cargue la configuración real desde un archivo diferente ubicado fuera del directorio web y probablemente nombrado de forma no genérica sino específica para el sitio.
El problema con esto es que muchos tutoriales de WordPress ni siquiera mencionan la posibilidad de tener wp-config.php
en otro lugar, y las personas que vengan después de ti tendrán un momento WTF tratando de entender cómo seguir instrucciones que les piden añadir un define
al archivo wp-config.php
.

Además de los beneficios de seguridad, también te permite mantener tu instancia de WordPress bajo control de versiones mientras mantienes los archivos principales de WordPress como un submódulo/externo. Así es como Mark Jaquith ha configurado su proyecto WordPress-Skeleton. Consulta https://github.com/markjaquith/WordPress-Skeleton#assumptions para más detalles.

Lo tiene configurado en la raíz del documento, no fuera de ella, por lo que no es relevante para esta pregunta. La técnica sobre la que se pregunta especifica que debes mover wp-config.php
un directorio por encima de la raíz del documento del vhost, no solo un directorio por encima de la carpeta de instalación de WordPress. El objetivo principal es sacarlo de la carpeta que puede ser leída por solicitudes HTTP.
