¿Es realmente beneficioso mover wp-config fuera del directorio raíz web?

13 jul 2012, 18:26:11
Vistas: 76.6K
Votos: 156

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.

4
Comentarios

Realmente no es necesario promocionar tu elección de respuestas y rechazar todas las demás dentro de tu pregunta. Como puedes ver a continuación, para eso está el sistema de votación de StackExchange, para votar las respuestas que tienen sentido para las personas, mientras que los que hacen preguntas deberían usar el mecanismo de "respuesta aceptada" y sus propios votos positivos/negativos.

Kzqai Kzqai
20 ene 2014 18:53:59

No hago eso en el 99% de las preguntas que he formulado, pero pensé que era apropiado en este caso específico. Hay 8 respuestas a la pregunta, algunas de las cuales son bastante extensas/complejas, y algunas tienen muchos votos a pesar de contener información inexacta o no aportar nada a la conversación. Creo que ofrecer una conclusión semi-autoritativa es útil para las personas que leen el hilo por primera vez. Como siempre, los lectores son libres de formarse su propia opinión; solo estoy ofreciendo la mía como el OP.

Ian Dunn Ian Dunn
21 ene 2014 02:15:01

@Kzqai: El "sistema de votación de StackExchange" es un proceso democrático, y los participantes a menudo 1) no tienen claro qué está preguntando o intentando resolver el OP, y 2) no comprenden la validez de una respuesta particular. Después de que las respuestas han llegado y los votos han sido emitidos, es más que útil que el OP aclare aquellas respuestas que le brindaron ayuda. Después de todo, el OP es el único que sabe, y desearía que más OPs lo hicieran. Sí, la gente "vota las respuestas que tienen sentido para ellos", pero dejemos que el OP tenga la última palabra sobre lo que tiene sentido para él.

Mac Mac
14 jul 2017 16:55:12

Tu pregunta es buena. Sin embargo, tus comentarios en las respuestas muestran que tienes en mente una configuración muy específica con restricciones externas muy reales (es decir, que no controlas). Hubiera sido más justo mencionarlas desde el principio. Hace diferencia si tengo control total sobre el servidor web, PHP y systemd, digamos, o si open_basedir es mi única manera de afectar la seguridad de manera tangible. También: el "buen argumento en contra" debería señalar cómo es dañino, en lugar de enumerar razones por las cuales esta medida singular puede no ser suficiente. Y ten en cuenta la audiencia.

0xC0000022L 0xC0000022L
18 ago 2021 11:32:13
Todas las respuestas a la pregunta 10
16
158

Respuesta corta: sí

La respuesta a esta pregunta es 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):

Plesk restablece el reenvío de subdominios después de sincronizar la suscripción con el plan de alojamiento (117199)

¿Suena inofensivo, verdad?

Bueno, esto es lo que hice para desencadenar este error:

  1. Configuré un subdominio para redirigir a otra URL (por ejemplo, site.staging.server.com a site-staging.ssl.server.com).
  2. 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 real wp-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 expandir open_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.

4 dic 2012 21:29:58
Comentarios

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

Mark Kaplun Mark Kaplun
4 dic 2012 23:14:30

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.

Aaron Adams Aaron Adams
4 dic 2012 23:23:34

¿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.

Mark Kaplun Mark Kaplun
5 dic 2012 07:46:36

@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.

Aaron Adams Aaron Adams
5 dic 2012 20:27:27

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...

Ian Dunn Ian Dunn
6 dic 2012 01:47:29

...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.

Ian Dunn Ian Dunn
6 dic 2012 01:48:57

@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.

Aaron Adams Aaron Adams
6 dic 2012 06:07:18

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.

Lance Cleveland Lance Cleveland
6 dic 2012 07:46:18

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.

Ian Dunn Ian Dunn
6 dic 2012 18:56:00

@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.

Aaron Adams Aaron Adams
7 dic 2012 05:16:58

@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.

Aaron Adams Aaron Adams
7 dic 2012 05:20:59

@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.

Lance Cleveland Lance Cleveland
10 dic 2012 17:32:36

¿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.

Kangarooo Kangarooo
8 mar 2017 03:21:33

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.

0xC0000022L 0xC0000022L
12 jul 2020 13:59:50

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.

Abdul Rehman Abdul Rehman
26 mar 2021 05:55:07

Pregunta menor sobre el código php: ¿Es beneficioso omitir ?> en este caso especial? ¿O es simplemente una preferencia personal?

John John
5 mar 2024 17:15:03
Mostrar los 11 comentarios restantes
12
44

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.

18 jul 2012 03:17:03
Comentarios

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í.

Ian Dunn Ian Dunn
18 jul 2012 04:56:05

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.

Otto Otto
12 ago 2012 18:19:02

Buen apunte. Editado.

chrisguitarguy chrisguitarguy
12 ago 2012 19:36:42

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?

Stephen Harris Stephen Harris
12 ago 2012 21:49:17

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.

chrisguitarguy chrisguitarguy
12 ago 2012 22:17:30

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.

Ian Dunn Ian Dunn
13 sept 2012 10:25:06

@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.

AndrewC AndrewC
5 dic 2012 02:56:40

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á.

Ian Dunn Ian Dunn
6 dic 2012 01:57:24

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

Ian Dunn Ian Dunn
6 dic 2012 18:58:11

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.

Goldentoa11 Goldentoa11
16 jun 2014 21:50:35

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.

Abdul Rehman Abdul Rehman
26 mar 2021 05:55:34

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.

0xC0000022L 0xC0000022L
18 ago 2021 11:09:19
Mostrar los 7 comentarios restantes
7
26

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).

13 jul 2012 19:13:49
Comentarios

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

its_me its_me
13 jul 2012 19:15:39

Aahan Krish, has dado en el blanco. Gracias por el aporte.

Max Yudin Max Yudin
13 jul 2012 19:26:34

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?

Ian Dunn Ian Dunn
13 jul 2012 20:59:10

@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).

its_me its_me
13 jul 2012 21:10:23

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

its_me its_me
13 jul 2012 21:10:58

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.

Ian Dunn Ian Dunn
14 jul 2012 03:11:58

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.

Ian Dunn Ian Dunn
14 jul 2012 03:12:56
Mostrar los 2 comentarios restantes
3
18

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,

12 sept 2012 15:41:08
Comentarios

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.

Ian Dunn Ian Dunn
12 sept 2012 18:01:18

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.

Ian Dunn Ian Dunn
12 sept 2012 18:04:58

@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.

0xC0000022L 0xC0000022L
18 ago 2021 11:21:23
7
16

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.

13 jul 2012 19:07:26
Comentarios

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?

Ian Dunn Ian Dunn
13 jul 2012 21:01:21

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.

Max Yudin Max Yudin
13 jul 2012 21:35:40

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.

Ian Dunn Ian Dunn
14 jul 2012 03:03:12

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í?

Ian Dunn Ian Dunn
14 jul 2012 03:04:10

Sí, a través de un panel de control.

Max Yudin Max Yudin
14 jul 2012 10:37:56

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.

MickeyRoush MickeyRoush
14 jul 2012 13:48:18

El nombre de archivo wp-config.php está codificado en wp-load.php, por lo que no es posible cambiarlo sin modificar el núcleo.

Ian Dunn Ian Dunn
16 jul 2012 19:45:24
Mostrar los 2 comentarios restantes
6

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
3 oct 2012 16:44:03
Comentarios

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.

Ian Dunn Ian Dunn
3 oct 2012 17:52:20

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.

Ian Dunn Ian Dunn
3 oct 2012 17:53:41

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.

Michael Michael
3 oct 2012 22:34:38

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.

Ian Dunn Ian Dunn
4 oct 2012 01:05:53

@IanDunn lo abordó bien en la respuesta de Aaron Adams

AndrewC AndrewC
5 dic 2012 03:02:10

No encuentro su argumento convincente. Lo he explicado en mi comentario sobre su respuesta.

Ian Dunn Ian Dunn
6 dic 2012 01:55:13
Mostrar los 1 comentarios restantes
7

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).

19 nov 2012 22:57:05
Comentarios

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?!

Lance Cleveland Lance Cleveland
6 dic 2012 07:51:56

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.

Ralf912 Ralf912
6 dic 2012 09:51:28

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.

Lance Cleveland Lance Cleveland
10 dic 2012 17:28:25

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.

Ralf912 Ralf912
11 dic 2012 13:21:45

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.

Ian Dunn Ian Dunn
12 dic 2012 00:40:19

@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.

Lance Cleveland Lance Cleveland
12 dic 2012 02:33:01

Muy buen punto sobre cómo define globaliza lo que sea que se esté definiendo.

Goldentoa11 Goldentoa11
16 jun 2014 21:53:39
Mostrar los 2 comentarios restantes
1

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í?

21 jul 2020 20:49:08
Comentarios

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.

Ian Dunn Ian Dunn
22 jul 2020 07:36:24
0
-1

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.

10 ago 2021 09:26:11
1
-2

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.

18 jul 2012 00:18:38
Comentarios

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.

Ian Dunn Ian Dunn
18 jul 2012 01:59:08