Come crittografare le credenziali di connessione al database su un server web?

25

OWASP sconsiglia di archiviare le credenziali del DB in testo semplice:

link

Tuttavia, non forniscono suggerimenti su come crittografare le credenziali di accesso ai DB, dove archiviare le chiavi, come gestire l'accesso alle chiavi, ecc.

Qualcuno ha esperienza nel mondo reale nell'implementazione di tale soluzione che può suggerire un'architettura su uno stack LAMP (ubuntu 10, PHP 5.3)?

PS - Non sto cercando risposte sulla falsariga di "non preoccuparti - se qualcuno ottiene l'accesso come root è troppo tardi", ecc.

    
posta tom 18.10.2012 - 18:18
fonte

3 risposte

16

Le altre risposte qui sono corrette in alcuni aspetti chiave. Il file contenente la stringa di connessione non deve essere conservato in una posizione leggibile dal mondo e, come si nota, non è possibile impedire a qualcuno di ottenere la chiave se ha compromesso il proprio server. Anche così, ci sono altri motivi per crittografare la chiave (o il file). Parte del motivo per cui OWASP consiglia di archiviare in testo semplice è quello di impedire la divulgazione accidentale delle credenziali a coloro che non ne hanno bisogno.

Mentre molti sostengono che crittografare la stringa di connessione sul sistema in esecuzione fornisce un piccolo valore reale (sicurezza per oscurità) questo è vero soprattutto nel contesto del sistema live. Supponendo una configurazione LAMP tradizionale, le autorizzazioni basate su file impedirebbero la lettura a qualsiasi utente diverso dall'utente di script in cui è in esecuzione il processo php / apache. Avere il file al di fuori del root locatin fornisce un po 'più di sicurezza potenziale (in caso di gestori MIME o .htaccess mal configurati) ma non è strettamente necessario.

Il più grande valore nel separare le impostazioni di connessione è che i dettagli e i dati di autenticazione non devono più essere distribuiti a sviluppatori / tester o altri individui che potrebbero avere una reale necessità di connettersi al server. Mantenendo i dettagli della connessione fuori dal controllo del codice sorgente e fuori dalla distribuzione generale, si riduce la possibilità di perdite o perdite.

Un secondo vantaggio è la distribuzione e il backup della fonte. Sicuramente una buona pratica sarebbe quella di trasferire solo file contenenti connessioni sensibili e informazioni sull'account crittografate, ma per molte ragioni, questo non è sempre pratico. A causa di ciò, se la crittografia è in uso, separare la chiave dal connectiontring e separare il connectiontring dall'origine è un'azione essenziale. Questa operazione ha separato i compiti e la protezione delle chiavi di crittografia (o dei file di configurazione) diventa una funzione di amministratore di sistema, piuttosto che una funzione di sviluppatore.

Questo fuori mano, in Apache / php hai un numero di opzioni.

1.) Non inserire la stringa di connessione nel codice php. Puoi inserire questi valori nel tuo httpd.conf o nel file degli host virtuali. La connessione quindi non richiede parametri quando si utilizza mysql_connect() ... l'uso più dettagliato è disponibile qui: link

2.) Includere il file di configurazione configfile.php come normale, ma spostare il file di connessione fuori da webroot, se possibile, e crittografare il file stesso. La decrypyption del sistema operativo può essere impostata dalla SA per il processo che accederà al file. Uso alternato Se non puoi spostare il file fuori dal webroot (hosting condiviso) proteggi il file con .htaccess

<files configfile> 
     order allow,deny 
     deny from all 
</files> 

Per Microsoft IIS con ASP.NET, la stringa di connessione è memorizzata nel file application.config o web.config e la crittografia utilizzata può essere una chiave computerizzata statica, memorizzata in uno di questi file o una chiave generata da IIS stesso - che non è memorizzato in una posizione accessibile. Sono disponibili specifiche su MSDN, che non inoltrerò a questa risposta poiché la tua domanda era specifica per LAMP.

Devo anche notare che, quando possibile, preferisco evitare il problema utilizzando l'autenticazione integrata. Mappare l'utente os a un utente db allontana quasi del tutto i requisiti di protezione dal contesto di questa domanda.

    
risposta data 19.10.2012 - 16:57
fonte
1

Ho poca esperienza con questo, ma ho sempre sentito che lo lasciate in chiaro (quale è il punto nel crittografare se la chiave è proprio lì comunque) e lasciare le credenziali in un file di inclusione e quindi mettere un controllo di accesso molto rigoroso su quel file.

nella mia esperienza con le cose del web ... ci sono molti modi di fare le cose ... e pochi modi di fare le cose bene.

(dal mio telefono scusa la mia brevità)

    
risposta data 19.10.2012 - 00:57
fonte
0

C'è poco uso nella crittografia della password del database. Nel caso di PHP hai persino bisogno di un codice crittografico per essere eseguito su ogni richiesta - è solo uno spreco di tempo per la CPU. Oltre a questo, ci sono un sacco di altri motivi per cui non è una buona idea:

  • La tua applicazione deve decrittografare i dati. Poiché in PHP i file di configurazione sono probabilmente anche file PHP, è probabile che qualcuno con accesso al file di configurazione abbia anche accesso al file contenente il codice / chiave di decrittografia.
  • Spreco di tempo della CPU per decrittografare la password.
  • Se il database è configurato correttamente con la password non ti dà alcun vantaggio - l'accesso dovrebbe essere limitato a localhost (o qualsiasi host sul quale il server web è in esecuzione) e nel caso in cui strumenti come phpMyAdmin siano sul server dovrebbero essere protetti con una password diversa. In realtà, nel caso ad es. PostgreSQL in esecuzione localmente potrebbe non avere bisogno di una password poiché puoi semplicemente concedere a un utente di sistema l'accesso a un determinato database, quindi se il tuo codice PHP viene eseguito come tale utente eviti di memorizzare qualsiasi password per il database.

Quindi ... cosa puoi fare che abbia senso? Abbastanza semplice, non mettere più file nella root del documento di quanto assolutamente necessario. Poiché solitamente le buone applicazioni utilizzano URL puliti instradati attraverso un singolo file .php, inserire tale file nella root del documento. Qualsiasi altra cosa - vale a dire l'altro codice dell'applicazione, i file di configurazione, ecc. Dovrebbero trovarsi al di fuori della radice del documento. In questo modo l'errata configurazione del server (ad es. Il motore PHP disabilitato e quindi l'invio di codice semplice all'utente) darà all'utente solo l'accesso a un singolo file PHP che probabilmente non contiene molto più di una chiamata require e qualche chiamata di funzione.

Assicurati anche che i tuoi file non siano leggibili a livello mondiale / leggibili (specialmente quando devi usare l'hosting condiviso). Con un server configurato correttamente (php NON in esecuzione come www-data o un utente simile ma tuo utente) puoi disabilitare completamente l'accesso "mondiale" e possibilmente "di gruppo" ai tuoi file.

    
risposta data 19.10.2012 - 01:35
fonte

Leggi altre domande sui tag