Modo sicuro per stabilire connessioni al database PHP

3

Ho letto il consiglio ( esempio : memorizzarli in un file php in una posizione inaccessibile come URL) ma non può aiutare a pensare che ci debba essere un modo migliore di memorizzare / accedere alle credenziali del database.

Idealmente sarebbe impossibile per qualcuno che ha accesso ai file del server web ottenere le credenziali del database. Questo lascia la sfida di come il webserver ottiene una connessione al database ...

Se c'era un modo per passare un oggetto di connessione PDO tra due script non collegati, potrebbe essere possibile.

es.

  1. script del sito web principale, eseguito come www-data richiede una connessione db

  2. in qualche modo effettua una chiamata a una funzione php che esiste in un file illeggibile da www-data.

  3. tale funzione decide se lo script deve essere autorizzato ad accedere al database (ad esempio, usa un backtrace di debug, crea md5sums (o simili) di tutti i file menzionati, li confronta con quelli protetti, conosciuti bene) e se supera questo test, stabilisce una connessione e restituisce l'oggetto PDO.

  4. lo script web principale è in grado di utilizzare l'oggetto PDO, ma non può estrarre le credenziali.

C'è un modo per creare una libreria PHP che viene caricata prima, ma al di fuori dell'esecuzione dello script principale? per esempio. aggiungere alle librerie di magazzino? Ciò renderebbe possibile questo tipo di cose.

O c'è un modo migliore?

    
posta artfulrobot 21.05.2013 - 17:01
fonte

2 risposte

2

Se il tuo modello di attacco consente a "autori di attacchi di caricare i propri script", hanno accesso a tutto ciò che lo stesso script può vedere o fare e "accesso sicuro al database", per questo valore di sicuro , è semplicemente non possibile .

(A meno di ridisegnare il database in modo che possa eseguire un controllo su tutti i file PHP coinvolti in una determinata connessione - mentre teoricamente possibile, sarebbe estremamente difficile - basta pensare a cosa significa identificare gli script PHP, incluso da un Web processo , che ha aperto una connessione, di cui il server DB conosce solo l'origine indirizzo e porta ! - e molto probabilmente un killer delle prestazioni)

Ma a questo punto puoi allontanare una certa logica dal server web, considerata inaffidabile, e vedere quale sicurezza può essere trovata altrove.

Ad esempio, puoi fare in modo che i diversi livelli di accesso alle applicazioni Web utilizzino credenziali diverse: potresti avere tre utenti del database "ospite", "utente" e "admin". Puoi organizzare le cose in modo che, ad esempio, l'amministrazione degli utenti da parte dell'utente admin non venga eseguita sullo stesso server web (puoi separarla per utente del processo, su un altro webroot, un'altra VM o un server Web separato fisicamente).

La maggior parte delle funzioni e delle query che è possibile replicare utilizzando procedure e funzioni con privilegi elevati che possono accedere ai dati sottostanti a cui gli utenti Web non hanno accesso : ad esempio è possibile eseguire i controlli di accesso con una funzione:

DELIMITER //
CREATE FUNCTION is_valid_user(user varchar(32), pass varchar(32))
returns BOOLEAN
DETERMINISTIC SQL SECURITY DEFINER
BEGIN
DECLARE ret BOOLEAN;
SELECT 1 = COUNT(*) INTO ret FROM users WHERE user = username AND MD5(pass) = password;
RETURN ret;
END//
DELIMITER ;

L'applicazione Web come utente web ha EXECUTE privilege, ma non ha SELECT/INSERT/DELETE privilegi sulla tabella users . Quindi non può enumerare gli utenti, o resettare tutte le password in un colpo solo,

È anche possibile (ma non molto utile, dal momento che la possibilità di caricare script eseguibili rende uno scenario quasi maniaco ideale) per utilizzare l'account guest per recuperare web credenziali di accesso, memorizzate nella tabella users , a condizione che l'utente Web abbia la password corretta:

  1. utente Giovanni si collega con la password "Doe". L'applicazione Web è in esecuzione come guest
  2. la funzione get_credentials('John','Doe') restituisce 'web: myfirstpass'
  3. L'applicazione Web cambia le credenziali in web e ora ha accesso a più funzioni

Tutta la registrazione dei dati è solo INSERT (solo l'amministratore può cancellare i record di log) e l'accesso a dati importanti / "finanziari" (ad esempio una tabella invoice ) può essere eseguito eseguendo tutte le operazioni su una tabella temporanea di proprietà da web , mentre una procedura privilegiata può essere utilizzata per finalizzare e convalidare la tabella e copiarla in invoices .

Con un po 'più di lavoro, l'utente può essere associato a una stringa "identificatore di sicurezza" altamente casuale che è unica per lui. Solo fornendo tale identificatore di sicurezza è possibile accedere alle procedure che recuperano le fatture; e tali procedure selezioneranno solo le fatture con lo stesso identificatore.

In questo modo - un modo molto laborioso, ammettiamolo - un utente malintenzionato può accedere solo ai dati degli utenti che accedono e vengono ingannati dalle proprie credenziali sul server Web compromesso.

Ti rimane il problema di reagire rapidamente a tale compromesso.

Su un server Linux con inotify , sarebbe possibile per monitorare continuamente i file e rimuovere quelli che non sono "approvati" (cioè il loro hash SHA1 non è nella lista "consentita"). Qualsiasi modifica o aggiunta ai file monitorati determinerebbe la loro rimozione e un avviso inviato all'amministratore:

inotify: '/srv/www/padma/htdocs/ CREATE dfqjkw.php'
inotify: '/srv/www/padma/htdocs/ MODIFY dfqjkw.php'
inotify: '/srv/www/padma/htdocs/ CLOSE_WRITE,CLOSE dfqjkw.php'
ANOMALY: '/srv/www/padma/htdocs/dfqjkw.php' (SHA: e0a6bf9020320dca178cf115da4fa26de0278a25cf41702d667988877cdbc2d1) is neither known nor in testing
inotify: '/srv/www/padma/htdocs/ DELETE dfqjkw.php'
ACTIONS: '/srv/www/padma/htdocs/dfqjkw.php' targzipped, sent to root, and removed

Ciò richiederebbe anche un po 'di tweaking per le persone che caricano i loro siti web - avresti bisogno di un sito Web FTP "test" dove avviene il caricamento e una procedura di "approvazione" mediante la quale viene estratta la firma di ogni file il sito web viene copiato sul filesystem "di produzione", raddoppiando efficacemente l'utilizzo dei dati.

D'altro canto, il furto di credenziali FTP come molti trojan non sarebbe più utile: in assenza della procedura di approvazione, i file compromessi sarebbero presenti solo su link , che sarebbe accessibile solo da alcune reti selezionate, non dal link che è consentito a tutti.

    
risposta data 21.05.2013 - 20:53
fonte
1

Potresti rendere un sito web interno accessibile solo a localhost che passerebbe le credenziali allo script PHP principale e quindi il file sarebbe inaccessibile al contesto utente del sito principale e verrebbe memorizzato solo nella memoria, ma probabilmente è eccessivo per la maggior parte scopi.

Se si inserisce la configurazione in un file non accessibile direttamente dal web e si limitano le connessioni all'essere solo dal server Web, si è abbastanza protetti poiché essi devono dirottare il server Web per eseguire attacchi altri di SQL Injection (e se possono iniettare SQL, saranno in grado di accedere alle stesse credenziali che il sito utilizza legittimamente).

    
risposta data 21.05.2013 - 17:22
fonte

Leggi altre domande sui tag