Réponse courte: oui
La réponse à cette question est un oui sans équivoque , et dire le contraire est totalement irresponsable .
Réponse longue: un exemple concret
Permettez-moi de donner un exemple très réel, tiré de mon serveur très réel, où le fait de passer wp-config.php
à l'extérieur de la racine Web empêchait spécifiquement la capture de son contenu .
L'insecte:
Jetez un coup d’œil à cette description d’un bogue dans Plesk (corrigée dans 11.0.9 MU # 27):
Plesk réinitialise le transfert de sous-domaine après la synchronisation de l'abonnement avec le plan d'hébergement (117199)
Cela semble inoffensif, non?
Eh bien, voici ce que j'ai fait pour déclencher ce bug:
- Configurez un sous-domaine pour le rediriger vers une autre URL (par exemple,
site.staging.server.com
vers site-staging.ssl.server.com
).
- Modification du plan de service de l'abonnement (par exemple, sa configuration PHP).
Lorsque j'ai fait cela, Plesk a réinitialisé le sous-domaine aux valeurs par défaut: servir le contenu de ~/httpdocs/
, sans interprète (par exemple, PHP) actif.
Et je n'ai pas remarqué. Pendant des semaines.
Le résultat:
- Avec
wp-config.php
dans la racine Web, une demande /wp-config.php
aurait téléchargé le fichier de configuration WordPress.
- En
wp-config.php
dehors de la racine Web, demande de /wp-config.php
télécharger un fichier totalement inoffensif. Le wp-config.php
fichier réel n'a pas pu être téléchargé.
Il est donc évident que le fait de wp-config.php
sortir de la racine Web présente des avantages réels en matière de sécurité .
Comment passer wp-config.php
à n’importe quel emplacement sur votre serveur
WordPress recherchera automatiquement un répertoire au-dessus de votre installation WordPress pour votre wp-config.php
fichier. Si c'est là que vous l'avez déplacé, vous avez terminé!
Mais que faire si vous l'avez déplacé ailleurs? Facile. Créez un nouveau wp-config.php
dans le répertoire WordPress avec le code suivant:
<?php
/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
/** Location of your WordPress configuration. */
require_once(ABSPATH . '../phpdocs/wp-config.php');
(Assurez-vous de remplacer le chemin ci-dessus par le chemin réel de votre wp-config.php
fichier déplacé .)
Si vous rencontrez un problème avec open_basedir
, ajoutez simplement le nouveau chemin d'accès à la open_basedir
directive dans votre configuration PHP:
open_basedir = "/var/www/vhosts/example.com/httpdocs/;/var/www/vhosts/example.com/phpdocs/;/tmp/"
C'est ça!
Choisir des arguments contraires
Chaque argument contre le fait de wp-config.php
quitter la racine Web repose sur de fausses hypothèses.
Argument 1: Si PHP est désactivé, ils sont déjà présents
La seule façon de voir le contenu de [ wp-config.php
] est de contourner l'interpréteur PHP de votre serveur ... Si cela se produit, vous avez déjà un problème: vous avez un accès direct à votre serveur.
FAUX : Le scénario que je décris ci-dessus est le résultat d'une mauvaise configuration, pas d'une intrusion.
Argument 2: La désactivation accidentelle de PHP est rare, et donc insignifiante
Si un attaquant a suffisamment d'accès pour modifier le gestionnaire PHP, vous êtes déjà voué à l'échec. D'après mon expérience, les modifications accidentelles sont très rares et dans ce cas, il serait facile de changer le mot de passe.
FAUX : Le scénario que je décris ci-dessus est le résultat d'un bogue dans un logiciel serveur commun affectant une configuration de serveur commune. C’est loin d’être "rare" (et d’ailleurs, sécurité, c’est se soucier de ce scénario rare).
WTF : Changer le mot de passe après une intrusion n'aide guère si des informations sensibles ont été collectées pendant l'intrusion. Vraiment, pensons-nous toujours que WordPress n'est utilisé que pour les blogs occasionnels, et que les attaquants ne s'intéressent qu'à la défiguration? Nous allons nous préoccuper de la protection de notre serveur, pas seulement de la restauration après que quelqu'un se soit introduit.
Argument 3: Refuser l'accès wp-config.php
est suffisant
Vous pouvez restreindre l'accès au fichier via votre configuration d'hôte virtuel ou
.htaccess
- en limitant efficacement l'accès extérieur au fichier de la même manière que le fait de passer à l'extérieur de la racine du document.
FALSE : Imaginez que les valeurs par défaut de votre serveur pour un hôte virtuel soient: pas de PHP, non .htaccess
, allow from all
(ce qui n’est guère inhabituel dans un environnement de production). Si votre configuration est en quelque sorte réinitialisée au cours d'une opération de routine, telle qu'une mise à jour de panneau, par exemple, tout reviendra à son état par défaut et vous serez exposé.
Si votre modèle de sécurité échoue lorsque les paramètres sont réinitialisés par défaut, vous avez besoin de davantage de sécurité.
WTF : Pourquoi quelqu'un recommanderait-il spécifiquement moins de couches de sécurité? Les voitures chères n'ont pas seulement des serrures; ils ont également des alarmes, des immobilisateurs et des suiveurs GPS. Si quelque chose mérite d'être protégé, faites-le correctement.
Argument 4: L'accès non autorisé à wp-config.php
n'est pas grave
Les informations de base de données sont vraiment le seul élément sensible de [ wp-config.php
].
FALSE : Les clés d’authentification et les sels peuvent être utilisés dans un nombre illimité d’attaques de piratage.
WTF : Même si les informations d'identification de la base de données étaient la seule chose à posséder wp-config.php
, vous devriez être terrifié par l'attaque d'un attaquant.
Argument 5: le fait de wp-config.php
sortir de la racine Web rend un serveur moins sécurisé
Vous devez toujours laisser l'accès WordPress [ wp-config.php
], vous devez donc développer open_basedir
pour inclure le répertoire au-dessus de la racine du document.
FALSE : En supposant que wp-config.php
soit présent httpdocs/
, déplacez-le simplement ../phpdocs/
et définissez-le open_basedir
pour inclure uniquement httpdocs/
et phpdocs/
. Par exemple:
open_basedir = "/var/www/vhosts/example.com/httpdocs/;/var/www/vhosts/example.com/phpdocs/;/tmp/"
(N'oubliez pas de toujours inclure /tmp/
, ou votre tmp/
répertoire utilisateur , si vous en avez un.)
Conclusion: les fichiers de configuration doivent toujours toujours être situés en dehors de la racine Web.
Si la sécurité vous tient à cœur, vous vous déplacerez en wp-config.php
dehors de votre racine Web.