Spostare wp-config fuori dalla root web è davvero vantaggioso?
Una delle best practice di sicurezza più comuni al giorno d'oggi sembra essere spostare wp-config.php
una directory più in alto rispetto alla document root del vhost. Non ho mai trovato una buona spiegazione per questo, ma presumo sia per minimizzare il rischio che uno script malevolo o infetto all'interno della webroot possa leggere la password del database.
Tuttavia, devi comunque permettere a WordPress di accedervi, quindi devi espandere open_basedir
per includere la directory sopra la document root. Questo non vanifica l'intero scopo e potenzialmente espone i log del server, i backup, ecc. agli attaccanti?
Oppure la tecnica cerca solo di prevenire una situazione in cui wp-config.php
verrebbe mostrato come testo normale a chiunque richieda http://example.com/wp-config.php
, invece di essere interpretato dal motore PHP? Questo sembra un caso molto raro e non compenserebbe gli svantaggi dell'esporre log/backup/ecc alle richieste HTTP.
Forse è possibile spostarlo fuori dalla document root in alcune configurazioni di hosting senza esporre altri file, ma non in altre configurazioni?
Conclusione: Dopo molte discussioni su questo argomento, sono emerse due risposte che ritengo debbano essere considerate quelle autorevoli. Aaron Adams presenta una buona argomentazione a favore dello spostamento di wp-config, e chrisguitarguy presenta una buona argomentazione contro. Queste sono le due risposte che dovresti leggere se sei nuovo alla discussione e non vuoi leggere l'intero thread. Le altre risposte sono ridondanti o imprecise.

Risposta breve: sì
La risposta a questa domanda è sì e dire il contrario è probabilmente irresponsabile.
Risposta lunga: un esempio reale
Permettimi di fornire un esempio molto reale, dal mio server molto reale, dove spostare wp-config.php
al di fuori della root web ha specificamente impedito che il suo contenuto venisse catturato.
Il bug:
Dai un'occhiata a questa descrizione di un bug in Plesk (risolto nella versione 11.0.9 MU#27):
Sembra innocuo, vero?
Ecco cosa ho fatto per attivare questo bug:
- Ho configurato un sottodominio per reindirizzare a un altro URL (ad esempio
site.staging.server.com
asite-staging.ssl.server.com
). - Ho cambiato il piano di servizio dell'abbonamento (ad esempio la sua configurazione PHP).
Quando ho fatto questo, Plesk ha ripristinato il sottodominio alle impostazioni predefinite: servendo i contenuti di ~/httpdocs/
, senza interpreti (ad esempio PHP) attivi.
E non me ne sono accorto. Per settimane.
Il risultato:
- Con
wp-config.php
nella root web, una richiesta a/wp-config.php
avrebbe scaricato il file di configurazione di WordPress. - Con
wp-config.php
al di fuori della root web, una richiesta a/wp-config.php
scaricava un file completamente innocuo. Il vero filewp-config.php
non poteva essere scaricato.
Quindi, è ovvio che spostare wp-config.php
al di fuori della root web può avere benefici di sicurezza reali nel mondo reale.
Come spostare wp-config.php
in qualsiasi posizione sul tuo server
WordPress cercherà automaticamente una directory sopra la tua installazione di WordPress per il tuo file wp-config.php
, quindi se l'hai spostato lì, hai finito!
Ma cosa succede se l'hai spostato altrove? Facile. Crea un nuovo wp-config.php
nella directory di WordPress con il seguente codice:
<?php
/** Percorso assoluto alla directory di WordPress. */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
/** Posizione della tua configurazione WordPress. */
require_once(ABSPATH . '../phpdocs/wp-config.php');
(Assicurati di cambiare il percorso sopra con il percorso effettivo del tuo file wp-config.php
spostato.)
Se incontri un problema con open_basedir
, aggiungi semplicemente il nuovo percorso alla direttiva open_basedir
nella tua configurazione PHP:
open_basedir = "/var/www/vhosts/example.com/httpdocs/;/var/www/vhosts/example.com/phpdocs/;/tmp/"
Ecco fatto!
Affrontare argomenti contrari
Ogni argomento contro lo spostamento di wp-config.php
al di fuori della root web sembra basarsi su presupposti falsi.
Argomento 1: Se PHP è disabilitato, sono già dentro
L'unico modo in cui qualcuno potrà vedere il contenuto di [
wp-config.php
] è se aggirano l'interprete PHP del tuo server… Se ciò accade, sei già nei guai: hanno accesso diretto al tuo server.
FALSO: Lo scenario che descrivo sopra è il risultato di una errata configurazione, non di un'intrusione.
Argomento 2: Disabilitare accidentalmente PHP è raro, e quindi insignificante
Se un attaccante ha abbastanza accesso per cambiare il gestore PHP, sei già spacciato. I cambiamenti accidentali sono molto rari nella mia esperienza, e in quel caso sarebbe facile cambiare la password.
FALSO: Lo scenario che descrivo sopra è il risultato di un bug in un comune software di server, che colpisce una configurazione comune di server. Questo è difficilmente "raro" (e comunque, la sicurezza significa preoccuparsi dello scenario raro).
Cambiare la password dopo un'intrusione non aiuta molto se le informazioni sensibili sono state raccolte durante l'intrusione. Davvero, pensiamo ancora che WordPress sia usato solo per blogging casuale, e che gli attaccanti siano interessati solo alla defacement? Preoccupiamoci di proteggere il nostro server, non solo di ripristinarlo dopo che qualcuno è entrato.
Argomento 3: Negare l'accesso a wp-config.php
è sufficiente
Puoi limitare l'accesso al file tramite la configurazione del tuo virtual host o
.htaccess
– limitando efficacemente l'accesso esterno al file nello stesso modo in cui lo farebbe spostarlo al di fuori della root del documento.
FALSO: Immagina che le impostazioni predefinite del tuo server per un virtual host siano: no PHP, no .htaccess
, allow from all
(difficilmente insolito in un ambiente di produzione). Se la tua configurazione viene in qualche modo resettata durante un'operazione di routine – come, ad esempio, un aggiornamento del pannello – tutto tornerà allo stato predefinito, e sarai esposto.
Se il tuo modello di sicurezza fallisce quando le impostazioni vengono accidentalmente reimpostate ai valori predefiniti, probabilmente hai bisogno di più sicurezza.
Perché qualcuno dovrebbe specificamente raccomandare meno livelli di sicurezza? Le auto costose non hanno solo serrature; hanno anche allarmi, immobilizzatori e tracker GPS. Se qualcosa vale la pena proteggere, fallo bene.
Argomento 4: L'accesso non autorizzato a wp-config.php
non è un grosso problema
Le informazioni del database sono davvero le uniche cose sensibili in [
wp-config.php
].
FALSO: Le chiavi di autenticazione e i sali possono essere usati in qualsiasi numero di potenziali attacchi di hijacking.
Anche se le credenziali del database fossero l'unica cosa in wp-config.php
, dovresti essere terrorizzato che un attaccante possa metterci le mani sopra.
Argomento 5: Spostare wp-config.php
al di fuori della root web rende effettivamente un server meno sicuro
Devi comunque permettere a WordPress di accedere a [
wp-config.php
], quindi devi espandereopen_basedir
per includere la directory sopra la root del documento.
FALSO: Assumendo che wp-config.php
sia in httpdocs/
, spostalo semplicemente in ../phpdocs/
, e imposta open_basedir
per includere solo httpdocs/
e phpdocs/
. Ad esempio:
open_basedir = "/var/www/vhosts/example.com/httpdocs/;/var/www/vhosts/example.com/phpdocs/;/tmp/"
(Ricorda di includere sempre /tmp/
, o la tua directory tmp/
utente, se ne hai una.)
Conclusione: i file di configurazione dovrebbero sempre sempre sempre essere posizionati al di fuori della root web
Se ti interessa la sicurezza, dovresti spostare wp-config.php
al di fuori della tua root web.

Se hai un bug in Apache, Linux o nel cervello dell'amministratore, sei fritto in ogni caso. Nel tuo scenario non spieghi perché è più probabile che una configurazione errata avvenga alla radice del sito web rispetto a qualsiasi altro posto sul server. Un Apache configurato male può probabilmente accedere a /../config.php tanto facilmente quanto a /config.php

Non sei "fritto in ogni caso." È molto probabile, e persino dimostrabile, che un bug possa ripristinare la root web al suo valore predefinito, nel qual caso non sei "fritto" – il tuo wp-config.php
rimane al sicuro. Ed è estremamente improbabile – così tanto da essere praticamente impossibile – che un bug ripristini arbitrariamente la root web esattamente alla directory in cui hai posizionato il tuo wp-config.php
.

Quanto è probabile questo tipo di bug? Non sono un esperto di sicurezza, ma non ho mai sentito parlare di questo vettore di attacco utilizzato nella pratica. Sono contrario a raccomandare questo metodo perché una volta che devi mantenere il tuo sito, non sai dove si trova il tuo wp-config e probabilmente invaliderebbe la maggior parte dei tutorial che toccano quel file in qualche modo. Tu, io e il resto dei commentatori qui capiremmo cosa è successo, ma per le persone meno esperte sarebbe un grande e lungo momento di WTF.

@MarkKaplun "Le persone che non leggono Stack Exchange potrebbero confondersi" è un argomento piuttosto debole contro una pratica di sicurezza consigliata su Stack Exchange. Quando più persone comprendono i reali pericoli di lasciare file di configurazione sensibili all'interno della root web, più persone sposteranno quei file fuori dalla root web, e più tutorial su WordPress verranno scritti per aiutare l'utente a individuare wp-config.php
. Se pensi che la convenienza sia più importante della sicurezza, questa è la tua opinione; allora, però, rendi chiaro che stai consigliando agli utenti di dare priorità alla convenienza rispetto alla sicurezza.

Ciao Aaron, grazie per la risposta riflessiva e dettagliata. Hai ragione sul fatto che cambiare semplicemente la password dopo un'intrusione non sia sufficiente. Tuttavia, non sono ancora convinto dalla tua aneddoto su Plesk. È sicuramente un problema, ma non credo che spostare wp-config sia la soluzione appropriata a quel problema. Lo stesso vale per il ripristino della configurazione del vhost, ecc. Se la tua applicazione ha bisogno di abbastanza sicurezza da preoccuparti di quel tipo di vulnerabilità, allora devi affrontarle in modo più diretto. Ad esempio, non usare Plesk, perché sarà sempre vulnerabile; assicurati che la configurazione del vhost sia sicura di default...

...usa la gestione della configurazione per documentare e applicare automaticamente tutti gli aspetti del sistema, ecc. Si potrebbe sostenere che spostare wp-config sia un'alternativa approssimativa a tecniche più professionali, e va bene, ma non credo che debba essere presentato come una soluzione adeguata. Per quanto riguarda spostarlo in httpdocs/../phpdocs, per quanto ne so, WordPress cercherà il file solo una directory sopra ABSPATH, quindi non è possibile.

@IanDunn In realtà, è facile spostare wp-config.php
in una posizione arbitraria. Ho aggiunto le istruzioni alla mia risposta; basta creare un file wp-config.php
fittizio nella directory di WordPress che faccia riferimento alla posizione di quello reale.

Questa risposta è perfetta. La mia compagnia di hosting ha avuto un guasto all'array di dischi. Quando tutto è stato risolto, hanno ripristinato il sistema SOLO PARZIALMENTE. Si è scoperto che hanno usato una serie di script cPanel/WHM per ricostruire i file httpd.conf in modo errato. Fortunatamente avevo già wp-config.php fuori dalla root del documento, ma se non l'avessi fatto, i contenuti sarebbero stati lì per chiunque. Sì, è raro, ma come notato, sono i casi rari quelli di cui devi preoccuparti. Inoltre, affermare che "le persone semplici sarebbero perse" è una scusa pessima per avere MENO sicurezza.

È un ottimo punto, Aaron. Sono ancora un po' scettico per le ragioni che ho menzionato in questo e altri thread di commenti, ma mi hai convinto che ha più merito di quanto pensassi inizialmente. Almeno, se fatto correttamente, non penso che possa far male. Ho ancora un problema con il fatto che la maggior parte delle persone che lo promuovono non sembrano capire le ragioni, e il modo in cui lo insegnano spesso porterebbe a esporre la directory sopra httpdocs, ma hai aiutato a affrontare questi problemi nella tua risposta.

@IanDunn Sono completamente d'accordo con te sul fatto che la maggior parte delle persone che consigliano di spostare wp-config.php
in una directory superiore non capisca realmente la sicurezza del server. Sono le stesse persone che consiglierebbero altrettanto rapidamente chmod 777
su .htaccess
, un file che potrebbe facilmente essere utilizzato per reindirizzare gli utenti verso siti di phishing. Ad essere sinceri, questo sembra rappresentativo dello stato generale della comunità WordPress; c'è una quantità sorprendente di codice scadente in giro, e a causa delle dimensioni della comunità, si diffonde. Tutto ciò che possiamo fare è cercare di educare meglio le persone sui rischi.

@CharlestonSoftwareAssociates Sono felice di sentire che eri ben preparato! Per proteggermi ulteriormente da problemi come questo, anch'io non permetto più che i file rimangano nelle loro directory predefinite; quei file Web che sono stati esposti pochi giorni fa in ~/httpdocs/
ora risiedono in ~/sites/example.com/www/
. La prossima volta che qualcosa viene ripristinato alle impostazioni predefinite, i domini restituiranno errori 500, piuttosto che servire i miei file PHP così come sono.

@AaronAdams - questa è una buona idea, ma nel mio caso non avrebbe aiutato. Hanno ripristinato ABBASTANZA della configurazione per puntarla alla mia root document non predefinita, ma non abbastanza per farla funzionare correttamente. Davvero lo scenario peggiore possibile. In effetti ALCUNE parti del sito funzionavano dopo il secondo tentativo di riparazione, ma comunque non era ancora corretto. Una situazione veramente orribile a causa di una riparazione del server mal gestita dalla mia compagnia di hosting, che sento sottolineare il tuo punto. Più puoi fare per proteggere i dati sensibili anche per quegli eventi "una volta su un milione", meglio è.

Posso scrivere ../../wp-config.php o anche un nome diverso? Ho appena provato su un sistema automator con la costante config posizionata un livello sopra. Ho creato quel blog in una sottocartella e volevo mettere wp-config.php due livelli sopra, ma il sito non funzionava usando ../../ mentre ..// funziona quando WP non è in una sottocartella.

Risposta molto chiara con una conclusione altrettanto chiara. Pratico questa e altre misure di sicurezza da anni e non ho avuto incidenti di sicurezza su tre istanze WordPress ospitate separatamente. Penso che la mera ipotesi che qualcosa non sia efficace da solo come lo è in combinazione con altre misure. Eppure le persone continuano a perpetuare questo consiglio scomodo di far ascoltare SSH su porte non privilegiate ("alte") per un falso senso di sicurezza, ad esempio. O consideriamo la sicurezza il risultato di una combinazione di misure mirate, o la lasciamo perdere del tutto.

Ho sbagliato qualche configurazione su nginx e ha iniziato a scaricare file contenenti ogni informazione sensibile. Quindi è definitivamente meglio mettere wp-conf su una directory sopra. Il famoso framework PHP "Laravel" utilizza lo stesso approccio per default.

La cosa più importante è che il file wp-config.php
contiene informazioni sensibili: nome utente e password del database, ecc.
Quindi l'idea è: spostarlo al di fuori della root del documento e non dovrai preoccuparti di nulla. Un attaccante non potrà mai accedere a quel file da una fonte esterna.
Tuttavia, c'è un problema: wp-config.php
in realtà non stampa mai nulla sullo schermo. Definisce solo varie costanti utilizzate in tutta l'installazione di WordPress. Pertanto, l'unico modo in cui qualcuno potrà vedere il contenuto di quel file è se aggira l'interprete PHP del tuo server – facendo in modo che un file .php
venga visualizzato come testo semplice. Se ciò accade, sei già nei guai: hanno accesso diretto al tuo server (e probabilmente permessi root) e possono fare ciò che vogliono.
Dirò subito che non c'è alcun vantaggio nello spostare wp-config
al di fuori della root del documento da un punto di vista della sicurezza – per i motivi sopra citati e questi:
- Puoi limitare l'accesso al file tramite la configurazione del tuo virtual host o .htaccess – limitando efficacemente l'accesso esterno al file nello stesso modo in cui lo farebbe spostandolo al di fuori della root del documento
- Puoi assicurarti che i permessi del file siano rigorosi su
wp-config
per impedire a qualsiasi utente senza privilegi sufficienti di leggere il file, anche se ottiene accesso (limitato) al tuo server via SSH. - Le tue informazioni sensibili, come le impostazioni del database, vengono utilizzate solo su un singolo sito. Quindi, anche se un attaccante avesse accesso a tali informazioni, l'unico sito interessato sarebbe l'installazione di WordPress a cui appartiene il file
wp-config.php
. Ancora più importante, quell'utente del database ha solo i permessi per leggere e scrivere nel database di quell'installazione di WordPress e nient'altro – nessun accesso per concedere permessi ad altri utenti. In altre parole, se un attaccante ottiene accesso al tuo database, è semplicemente una questione di ripristinare da un backup (vedi punto 4) e cambiare l'utente del database - Esegui backup frequentemente. "Frequentemente" è un termine relativo: se pubblichi 20 articoli al giorno, è meglio eseguire un backup ogni giorno o ogni pochi giorni. Se pubblichi una volta a settimana, un backup settimanale è probabilmente sufficiente.
- Hai il tuo sito sotto controllo delle versioni (come questo), il che significa che anche se un attaccante ottenesse l'accesso, potresti facilmente rilevare le modifiche al codice e ripristinarle. Se un attaccante ha accesso a
wp-config
, probabilmente ha manomesso qualcos'altro. - Le informazioni del database sono davvero le uniche cose sensibili in
wp-config
, e poiché sei attento a questo (vedi punto 3 e 4), non è un grosso problema. I salt e simili possono essere cambiati in qualsiasi momento. L'unica cosa che accade è che invalida i cookie degli utenti loggati.
Per me, spostare wp-config
al di fuori della root del documento puzza di sicurezza per oscurità – che è molto un argomento fantoccio.

Sì, è più o meno quello che pensavo. Sono contento di sapere di non essere l'unico :) Vorrei lasciare la domanda aperta per un altro giorno o due nel caso qualcuno abbia un contro-argomento convincente, ma finora questa mi sembra la risposta corretta.

Piccola correzione: non c'è alcun vantaggio in termini di sicurezza nello spostare il file wp-config.php fuori dalla root del documento. Ci sono altri vantaggi, che non sono legati alla sicurezza, e che si applicano solo a configurazioni insolite.

Solo per sfatare un possibile mito - non è possibile che qualcosa vada storto lato server - nel qual caso il codice php viene stampato sullo schermo?

Certo. Se mod_php non funzionasse o i file PHP non venissero passati all'interprete PHP, è possibile. Se stai utilizzando una configurazione FCGI, la stessa cosa è possibile se i file PHP non vengono passati al processo fcgi per l'interpretazione. Entrambi i casi indicano problemi piuttosto gravi che però è improbabile si verifichino.

Penso che la domanda fondamentale qui non sia se ci sia qualche vantaggio nello spostarlo, ma se tali vantaggi superino il rischio di espandere l'ambito di openbase_dir per includere la directory padre, che spesso contiene file di log, backup, una directory di archiviazione file privati, ecc. Continuo a chiedere questo, e nessuno dei sostenitori dello spostamento di wp-config mi ha mai dato una risposta. Quindi, a questo punto, interpreto il loro silenzio come un segnale che i vantaggi non valgono il rischio.

@IanDunn Ma le risposte migliori suggeriscono di spostarlo completamente da quella gerarchia in una separata, il che affronta effettivamente la tua preoccupazione riguardo i log ecc. Questa risposta non risponde alla tua domanda dal titolo "spostare... è davvero benefico", dice solo che altre misure di sicurezza sono utili e cerca di rassicurarti sul non preoccuparti della sicurezza. Tutti pensano che la propria casa sia sicura finché non vengono svaligiati. Dopo di che fanno un lavoro migliore. Alcune persone non vengono mai svaligiate, anche se la loro sicurezza è bassa, ma questo non significa che sia un buon consiglio avere una sicurezza inferiore.

A quanto ne so, non è possibile spostarlo in nessun posto tranne una directory sopra ABSPATH, perché è l'unica posizione dove WP lo cercherà.

Non importa, Aaron ha aggiornato la sua risposta con una soluzione alternativa per questo, utilizzando un file wp-config.php fittizio per includere() quello reale.

Questi sono punti validi, ma il mio problema principale è che si tratta di argomenti rimediali, non preventivi. La maggior parte di questi discorsi spiega come non sia un grosso problema perché A) si presuppone che qualcuno abbia gestito correttamente l'utente del database e B) si dispone di backup. Cosa succede quando si utilizza qualcosa come WooCommerce o si memorizzano informazioni sensibili nel database? Allora si è nei guai.

Ho sbagliato qualche configurazione su nginx e ha iniziato a scaricare file contenenti ogni tipo di informazione sensibile. Quindi è decisamente meglio mettere wp-conf nella directory superiore. Anche il famoso framework PHP "Laravel" utilizza lo stesso approccio per impostazione predefinita.

Che approccio ignorante sulla sicurezza. Come se non ci fosse differenza di portata tra (accidentalmente) configurare male PHP e perdere le credenziali del server del database e i salt per gli hash delle password contenute al suo interno. Sebbene il punto di rottura finale delle misure di sicurezza sia binario, la loro implementazione non lo è. Seguendo la tua logica, potresti rimuovere qualsiasi componente, ad esempio SELinux/AppArmor, senza influire sulla sicurezza complessiva del sistema. Dovrebbe essere ovvio quanto sia sbagliato. Tipicamente, le misure di sicurezza preventive cercano di proteggere anche da casi improbabili.

Penso che la risposta di Max sia molto competente, e questa è una parte della questione. Il WordPress Codex fornisce ulteriori consigli:
Inoltre, assicurati che solo tu (e il server web) possa leggere questo file (generalmente significa un permesso 400 o 440).
Se utilizzi un server con .htaccess, puoi inserire questo nel file (all'inizio) per negare l'accesso a chiunque cerchi di accedervi:
<files wp-config.php> order allow,deny deny from all </files>
Nota che impostare i permessi 400 o 440 su wp-config.php potrebbe impedire ai plugin di scrivere o modificarlo. Un caso reale potrebbe essere, ad esempio, quello dei plugin di caching (W3 Total Cache, WP Super Cache, ecc.). In quel caso, opterei per i permessi 600 (il valore predefinito per i file nella directory /home/user
).

Quindi, se usi htaccess per negare le richieste HTTP a wp-config.php, non ottieni lo stesso risultato che spostandolo fuori dalla root del documento, ma senza esporre log/backup/ecc.?

@IanDunn Dipende da quale sia la document root— (1) Se WordPress è ospitato in una directory all'interno di public_html
, spostare wp-config.php
al di fuori della directory significa che si troverà nella directory public_html
. In questo caso, dovrai utilizzare le regole htaccess per negare le richieste HTTP a wp-config.php. (2) Se WordPress è installato direttamente sotto la directory public_html
, un livello sopra => sposterai il file nella directory /home/user
. In questo caso sei abbastanza al sicuro poiché il file è al di fuori della document root. Puoi comunque impostare i permessi del file a 600 (o anche più restrittivi come 440 o 400).

@IanDunn Come ho detto, questa è la mia comprensione di base, e non sono un esperto di sicurezza. :)

Nel caso #1 non ottieni il beneficio di sicurezza desiderato. Il punto principale è spostarlo al di fuori della document root, non solo di un livello.

Nel caso #2, dovresti espandere l'ambito di open_basedir
per consentire a PHP di accedere a tutto in /home/user, il che mi sembra un grosso problema. Tutto ciò che è memorizzato lì (log, backup, .bash_history, ecc.) sarebbe accessibile a qualsiasi script PHP infetto in esecuzione in /home/user/public_html. Sembrerebbe meglio lasciare wp-config in /home/user/public_html/wp-config.php e usare regole htaccess per bloccare le richieste HTTP ad esso. Ottieni comunque il vantaggio di bloccare l'accesso nel caso (improbabile) che venga visualizzato in testo semplice, ma non esponi i file sopra public_html.

Qualcuno ci ha chiesto di intervenire, e risponderò qui.
Sì, ci sono vantaggi di sicurezza nell'isolare il tuo wp-config.php dalla directory root del tuo sito.
1- Se il tuo gestore PHP viene danneggiato o modificato in qualche modo, le informazioni del tuo database non saranno esposte. E sì, ho visto questo accadere alcune volte su host condivisi durante gli aggiornamenti del server. Sì, il sito sarà guasto durante quel periodo, ma le tue password rimarranno intatte.
2- Le migliori pratiche raccomandano sempre di isolare i file di configurazione dai file di dati. Sì, è difficile farlo con WordPress (o qualsiasi applicazione web), ma spostarlo verso l'alto fa un po' di isolamento.
3- Ricorda la vulnerabilità PHP-CGI, dove chiunque poteva passare ?-s a un file e visualizzare il sorgente. http://www.kb.cert.org/vuls/id/520827
Alla fine, questi sono piccoli dettagli, ma aiutano a minimizzare il rischio. Specialmente se sei in un ambiente condiviso, dove chiunque può accedere al tuo database (tutto ciò di cui hanno bisogno è un utente/password).
Ma non lasciare che piccole distrazioni (ottimizzazioni premature) si mettano davanti a ciò che è veramente necessario per ottenere un sito adeguatamente sicuro:
1- Tienilo sempre aggiornato
2- Usa password complesse
3- Limita l'accesso (tramite permessi). Abbiamo un post al riguardo qui:
http://blog.sucuri.net/2012/08/wordpress-security-cutting-through-the-bs.html
grazie,

Ragazzi, grazie per aver condiviso le vostre opinioni. Penso che abbiamo già toccato la maggior parte di questi punti nelle altre risposte e nei relativi commenti. 1) Sì, è possibile, ma raro; 2) Sì, ci sono vantaggi, ma sono minimi; 3) Sì, è possibile, ma quel tipo di vulnerabilità è improbabile che si ripeta, e proteggersi da essa è un po' come giocare a "whac-a-mole", o far togliere le scarpe alle persone in aeroporto perché qualche idiota ha nascosto una bomba nella scarpa una volta. È una reazione eccessiva ed è improbabile che porti benefici futuri.

Nelle varie discussioni, la domanda è stata affinata da "Ci sono dei vantaggi?" a "Ok, ci sono alcuni vantaggi, ma superano i rischi?" Il rischio principale a cui mi riferisco è il fatto che devi espandere l'ambito di openbase_dir per consentire a PHP di accedere agli script al di fuori della root web. Molte configurazioni di hosting - comprese quelle che utilizzano Plesk, che sono molte - memorizzano log, backup, aree FTP private che dovrebbero essere isolate dalla root web, ecc. nella directory sopra la root web. Quindi, concedere a PHP l'accesso a quella directory può rappresentare una grave vulnerabilità.

@IanDunn da quando la rarità di un evento è un argomento valido contro l'adozione di una misura di sicurezza preventiva che affronta un evento così improbabile? Il tuo punto su dove PHP può aprire file può oggi essere affrontato tramite l'hardening di systemd, tra l'altro. Il punto centrale della sicurezza informatica è che gli aggressori hanno a disposizione infinite vie di intrusione, mentre i difensori possono solo difendersi da vettori di attacco noti. Quindi è consuetudine combinare quante più misure preventive possibili per fornire una rete di sicurezza, piuttosto che affidarsi a un singolo nodo.

Assolutamente SÌ.
Quando sposti wp-config.php al di fuori della directory pubblica, lo proteggi dalla lettura tramite browser nel caso in cui il gestore PHP venga modificato in modo malevolo (o accidentalmente!).
La lettura delle credenziali del tuo database è possibile quando il server è gravemente compromesso a causa di un amministratore negligente. Fategli pagare una multa e cercate un servizio di hosting più curato e affidabile. Anche se potrebbe costare di più.

Se un attaccante ha accesso sufficiente per modificare il gestore PHP, sei già nei guai. Nella mia esperienza, i cambiamenti accidentali sono molto rari, e in quel caso sarebbe facile cambiare la password. Alla luce di queste considerazioni, pensi ancora che valga la pena rischiare di esporre log/backup/ecc. a causa dell'ambito ampliato di open_basedir
?

Non ho mai avuto accesso -rwx
alle directory superiori a public_html
, quindi non ho mai avuto familiarità con open_basedir
. I miei log si trovano in una directory separata, così come i backup. Penso che sia così su tutti gli hosting condivisi.

Gli host variano moltissimo; non esiste una struttura di directory standard. Plesk (uno dei pannelli di controllo più popolari per gli hosting condivisi) posiziona i log in /var/www/vhosts/example.com/statistics/logs e la root del documento è /var/www/vhosts/example.com/httpdocs. Spostare wp-config.php in /var/www/vhosts/example.com/wp-config.php richiederebbe di dare agli script l'accesso all'intera directory example.com.

Solo per curiosità, dove sono memorizzati i tuoi log e backup, se non nella directory del dominio? Vi si accede tramite un pannello di controllo o qualcosa del genere?

Potrei sbagliarmi su questo, ma se il tuo server non è sicuro, un attacco tramite symlink potrebbe leggere il tuo wp-config.php indipendentemente da dove si trova. Tutto ciò che un attaccante deve sapere è dove potrebbe trovarsi il file e se il symlinking è possibile. Forse è una domanda fuori tema, ma sembrerebbe che se ci fosse un modo per rinominare il wp-config.php, sarebbe un modo per prevenire il phishing per trovarlo.

Vorrei solo chiarire, per amor di discussione, che spostare il file wp_config.php non significa necessariamente doverlo spostare solo nella directory genitore. Supponiamo che tu abbia una struttura come /root/html, dove html contiene l'installazione di WP e tutto il tuo contenuto HTML. Invece di spostare wp_config.php in /root, potresti spostarlo in qualcosa come /root/secure ... che è sia al di fuori della directory html sia non nella directory root del server. Naturalmente, dovresti assicurarti che php possa essere eseguito anche in questa cartella secure.
Poiché WP non può essere configurato per cercare wp_config.php in una cartella di pari livello come /root/secure, devi fare un passo aggiuntivo. Ho lasciato il wp_config.php in /root/html, e ho rimosso le parti sensibili (credenziali del database, salt, prefisso delle tabelle) e le ho spostate in un file separato chiamato config.php. Poi aggiungi il comando PHP include
al tuo wp_config.php, in questo modo: include('/home/content/path/to/root/secure/config.php');
Questo è essenzialmente ciò che ho fatto nella mia configurazione. Ora, basandomi sulla discussione di cui sopra, sto ancora valutando se sia necessario o addirittura una buona idea. Ma volevo solo aggiungere che la configurazione sopra descritta è possibile. Non espone i tuoi backup e altri file root, e fintanto che la cartella secure non è configurata con il suo URL pubblico, non è navigabile.
Inoltre, puoi limitare l'accesso alla cartella secure creando un file .htaccess all'interno con:
order deny,allow
deny from all
allow from 127.0.0.1

Ciao Michael, grazie per aver condiviso questo. Hai provato a testarlo in un ambiente reale per verificare che funzioni? Penso che la direttiva open_basedir
accetti un intero albero, quindi per accedere a /root/secure
da /root/html
, dovresti impostare open_basedir
su /root
.

Per far funzionare la tua idea, penso che dovresti configurare la struttura delle directory come /root/httpdocs/config/accessible
, dove httpdocs
contiene log, backup, ecc.; config
contiene wp-config.php
, e accessible
contiene WordPress e tutto il contenuto. Dovresti modificare la configurazione del vhost, ecc. per rimappare la root del documento su accessible
. Tuttavia, non vedo alcun vantaggio rispetto al semplice negare le richieste HTTP a wp-config nella configurazione predefinita.

Secondo http://www.php.net/manual/en/ini.core.php#ini.open-basedir: "Su Windows, separa le directory con un punto e virgola. Su tutti gli altri sistemi, separa le directory con i due punti. Come modulo Apache, i percorsi open_basedir dalle directory padre vengono ora ereditati automaticamente." Quindi puoi impostare più directory, non è necessario che siano in un singolo albero.

Ho appena testato e sembra che tu abbia ragione. Tuttavia, non sono ancora sicuro di quale vantaggio in termini di sicurezza questo abbia rispetto al semplice negare l'accesso al file tramite Apache.

Ci sono molti temi e plugin scritti male là fuori che consentono agli aggressori di iniettare codice (ricordate il problema di sicurezza con Timthumb). Se fossi un aggressore, perché dovrei cercare il wp-config.php? Basta iniettare questo codice:
var_dump( DB_NAME, DB_USER, DB_PASSWORD );
Puoi provare a nascondere il tuo wp-config.php. Fintanto che WordPress rende tutte le informazioni sensibili accessibili globalmente, nascondere il wp-config.php non ha alcun beneficio.
La parte negativa di wp-config.php non è che contiene dati sensibili. La parte negativa è definire i dati sensibili come costanti accessibili globalmente.
Aggiornamento
Voglio chiarire i problemi con define()
e perché è una cattiva idea definire dati sensibili come costanti globali.
Ci sono molti modi per attaccare un sito web. L'iniezione di script è solo uno dei metodi per attaccare un sito web.
Supponendo che il server abbia una vulnerabilità che consente a un aggressore di accedere a un dump della memoria. L'aggressore troverà nel dump della memoria tutti i valori di tutte le variabili. Se definisci una costante accessibile globalmente, deve rimanere in memoria fino alla fine dello script. Creando una variabile invece di una costante, c'è una buona probabilità che il garbage collector sovrascriva (o liberi) la memoria dopo che la variabile non è più necessaria.
Un modo migliore per proteggere i dati sensibili è eliminarli immediatamente dopo l'uso:
$db_con = new stdClass();
$db_con->db_user = 'username';
$db_con->password = 'password';
$db_con->host = 'localhost';
$db_handler = new Database_Handler( $db_con );
$db_con = null;
Dopo aver utilizzato i dati sensibili, l'assegnazione a null
sovrascriverà i dati in memoria. Un aggressore deve ottenere il dump della memoria proprio nel momento in cui $db_con
contiene i dati sensibili. E quello è un tempo molto breve nell'esempio sopra (se la classe Database_Handler non ne salva una copia).

Questa risposta non affronta direttamente la domanda. Qualsiasi autore di plugin può divertirsi con WordPress se riesce a convincerti a installare il suo codice con intenti malevoli. Non è diverso dall'installare volontariamente un virus sul tuo sistema. Questo argomento per non spostare wp-config.php è inutile. È come dire che installare volontariamente una bomba nell'auto rende inutile l'allarme. Tecnicamente vero, ma WTF?!?

No, non è inutile. La domanda è: Posso proteggere l'account del database nascondendo wp-config.php? E la risposta è chiaramente: No. È come chiedere "Posso proteggere la mia auto dalle bombe con un allarme?" Non c'è altro vantaggio nel nascondere wp-config in termini di protezione dell'accesso al database o FTP. Entrambi sono nell'ambito globale. Sono sicuro che ci sono molti altri modi per gli attaccanti di accedere alle variabili globali senza iniettare codice.

Non vedo "posso proteggere l'account del database nascondendo wp-config.php" nella domanda originale. La domanda originale era "ha senso spostare wp-config.php?". La risposta è assolutamente sì, IMO. È come chiedere se dovresti chiudere a chiave la porta di casa quando esci. Dire "qualcuno può facilmente rompere una finestra e entrare comunque, quindi perché preoccuparsi" non risponde al punto fondamentale della domanda. IMO la domanda era questa: "Vale la pena lo sforzo extra per spostare wp-config.php? C'è QUALSIASI vantaggio nel farlo?". Sì. Almeno tiene lontani gli hacker pigri.

Una delle migliori pratiche di sicurezza più comuni... Hai trascurato un punto molto (molto, molto) importante: a cosa è interessato un attaccante? E non è come hai stilizzato il tuo wp-config.php. Un attaccante è interessato ai valori che hai definito nel wp-config. Prendendo il tuo esempio con la porta d'ingresso: Nascondere il tuo wp-config è come se chiudessi a chiave la porta di casa, ma lasciassi tutto il tuo oro incustodito in giardino. Tutti i valori definiti nel wp-config sono definiti globalmente. Quindi sono tutti accessibili al di fuori del wp-config. Anche se nascondi il wp-config, i valori sono comunque presenti.

Penso che coloro che sostengono di spostarlo stiano cercando di proteggersi da scenari in cui wp-config.php potrebbe essere visualizzato in testo semplice tramite una richiesta HTTP, piuttosto che da scenari in cui potrebbe essere esposto ad altro codice PHP in esecuzione sull'host.

@Ralf912 - non è esattamente corretto. Le define globali sono ACCESSIBILI da tutti i file di programma in tutte le directory ma non vengono visualizzate. Per VEDERE i valori dovresti essere in grado di scrivere codice modificato sul server. Mentre un server mal configurato con wp-config.php nella root del documento mostrerà prontamente quei valori come testo semplice. Questo è il punto fondamentale. Vedere il codice di qualsiasi plugin/tema non causa alcun danno.

Mi scuso per riportare in auge un vecchio post, ma non esiste una soluzione ovvia a tutto questo? Sappiamo che ci sono alcuni benefici per la sicurezza nel spostare il file wp-config.php fuori dalla directory principale di WordPress. Alcuni sostengono che i vantaggi siano minimi, altri no.
D'altra parte, ci possono essere alcuni svantaggi nello spostare il file dalla sua posizione predefinita, come il malfunzionamento di alcuni plugin che non hanno la funzionalità di cercare il file wp-config.php in altre posizioni.
La cosa più ovvia per me è creare un file secret-info.php al di fuori della directory principale di WordPress che contenga le variabili per tutti i tuoi username e password, ad esempio:
$userName = "user";
$databasePassword = "12345";
Lascia il file wp-config.php nella directory predefinita di WordPress, rimuovi i valori di username e password da wp-config.php ma lascia tutto il resto. Poi semplicemente fai riferimento alle variabili $userName e $databasePassword richiedendo secret-info.php in wp-config.php, ad esempio:
require('PERCORSO-DEL-FILE/secret-info.php');
Sembra la cosa più ovvia da fare, mi sto perdendo qualcosa?

È in realtà una cosa molto positiva aggiungere una risposta a una vecchia domanda, c'è persino un badge per questo. WPSE è pensato per essere un repository di conoscenza, piuttosto che un forum.

Anni dopo e WordPress continua a posizionare wp-config.php
per impostazione predefinita nella sua directory root accessibile dal web senza nemmeno aggiungere regole .htaccess per impedirne l'accesso. La maggior parte degli hosting condivisi che offrono un'installazione one-click di WordPress probabilmente fanno lo stesso. Il risultato è che la maggior parte dei siti WordPress è configurata così e non credo di aver mai sentito qualcuno dire "il mio sito è stato violato perché wp-config.php era nella directory root".
Per utilizzare le informazioni contenute nel file, è necessario l'accesso al server del database, probabilmente aggiungendo script a un server applicativo. Se si utilizza un VPS, significa che se un attaccante ha questa capacità, è "game over" in ogni caso. Negli hosting condivisi, invece, l'accesso al database viene solitamente isolato in base all'utente, quindi non è una cosa banale da fare nemmeno in quel contesto.
Il risultato è che le informazioni sullo stato di salute di WordPress 5.2+ non suggeriranno di spostare il file, e non ho mai sentito di un plugin di sicurezza che lo faccia.
Quindi, un'informazione pratica di lungo termine dimostra che teoricamente sarebbe meglio farlo, ma è per lo più un teatro della sicurezza.
Il vero problema nello spostare wp-config.php
una directory sopra è che essenzialmente impedisce l'installazione di altri WordPress nella stessa directory del primo, cosa che molte persone fanno. La soluzione è mantenere wp-config.php
nella posizione predefinita, ma aggiungere del codice che carica la configurazione effettiva da un file diverso, situato al di fuori della root web e probabilmente nominato in modo non generico ma specifico per il sito.
Il problema con questo approccio è che molti tutorial WordPress non menzionano nemmeno la possibilità di avere wp-config.php
in un'altra posizione, e le persone che verranno dopo di te avranno un momento di "WTF" cercando di capire come seguire le istruzioni che chiedono di aggiungere un define
al file wp-config.php
.

Oltre ai vantaggi in termini di sicurezza, ti consente anche di mantenere la tua istanza di WordPress sotto controllo delle versioni, mantenendo i file core di WordPress come un submodule/esterno. È così che Mark Jaquith ha configurato il suo progetto WordPress-Skeleton. Consulta https://github.com/markjaquith/WordPress-Skeleton#assumptions per i dettagli.

Lo ha configurato nella root del documento, non al di fuori di essa, quindi non è rilevante per questa domanda. La tecnica di cui si chiedeva nella domanda specifica di spostare wp-config.php
una directory sopra la root del documento del vhost, non solo una directory sopra la cartella di installazione di WordPress. L'intero punto è di posizionarlo al di fuori della cartella che può essere letta dalle richieste HTTP.
