it-swarm.it

È generalmente una cattiva idea crittografare i campi del database?

Lavoro in una piccola azienda, sono letteralmente io (il programmatore) e il proprietario. Il proprietario mi ha chiesto di crittografare diversi campi in un database per proteggere i dati dei clienti. Questa è un'applicazione web che aiuta gli studi legali a gestire i propri dati, quindi sostanzialmente memorizza le informazioni su persone e cause legali (chi viene citato in giudizio, perché, per quanto). Considera queste informazioni sensibili che non dovrebbero essere facilmente visualizzate. La sua paura è "Non voglio che persone non autorizzate vedano queste informazioni". Solo altri studi legali potrebbero essere interessati a questi dati, quindi questo non dovrebbe essere così importante come le carte di credito, ad esempio.

Ho letto molto su questo sul web e stavo pensando di usare semplicemente la crittografia simmetrica su questi campi, in modo che le prestazioni non fossero così male. La chiave verrebbe memorizzata sul server. Tuttavia, this thread su stackoverflow dice che questa è una cattiva idea.

Non capisco come crittografare i campi e salvare la chiave sul server possa essere così inutile. Non temo che i dischi vengano rubati perché sono su Amazon EC2. Non sono un esperto di sicurezza, ma secondo me, se qualcosa potesse andare storto, direi che il database perde. Anche allora, le informazioni importanti verrebbero crittografate. Ora, se il ragazzo riuscisse persino a hackerare il mio server EC2, beh, immagino che ci sarebbe poca o nessuna protezione che potrei fare per aiutare questo. Dato che siamo una piccola azienda, abbiamo un solo server che fa tutto, dalla pubblicazione delle pagine alla memorizzazione dei dati.

La mia domanda è, considerando che possiamo permetterci solo un server, è crittografare quei campi con una chiave simmetrica, che viene salvata su questo server, ok?

65
Bhaskara

Commenti generali. Sembra che sarebbe utile per te e il tuo capo imparare alcuni concetti di sicurezza di base, prima di procedere. La sicurezza è un campo specializzato. Non chiederesti a una persona a caso per strada di eseguire un intervento a cuore aperto su di te; e non dovresti aspettarti che uno sviluppatore di software medio sappia come proteggere i tuoi sistemi.

Sento alcune idee sbagliate qui. Ad esempio, sembra che il tuo capo abbia equiparato la sicurezza alla crittografia. Ma questo è un errore. Come ha sottolineato Bruce Schneier, la crittografia non è polvere magica di folletti che puoi cospargere su un sistema per renderlo sicuro . E come ha detto una volta Roger Needham, Se pensi che la crittografia risolverà il tuo problema, o non capisci la crittografia o non capisci il tuo problema .

Quando si protegge un sistema informatico, un concetto importante è il modello di minaccia . Ciò significa che devi pensare attentamente a quali tipi di attacchi e avversari stai cercando di fermare e cosa non sei. Un fallimento nel pensare chiaramente attraverso il modello di minaccia può portare a teatro della sicurezza : meccanismi di sicurezza che sembrano buoni a prima vista, ma in realtà sono terribilmente inadeguati nella pratica. Una buona gestione della sicurezza si riduce spesso a gestione dei rischi : un'attenta analisi di quali sono i rischi più gravi e quindi l'elaborazione di strategie per mitigare o gestire tali rischi particolari.

È anche importante capire che la sicurezza è una proprietà del collegamento più debole: la sicurezza del tuo sistema è forte tanto quanto il collegamento più debole . Una vulnerabilità in ogni parte del sistema può compromettere la sicurezza dell'intero sistema. Ciò significa che non esiste una risposta che sarà sufficiente per proteggere il tuo sistema; invece, per difendere il tuo sistema, devi ottenere la sicurezza in diversi punti.

Immergersi nei dettagli. Sembra che i tuoi obiettivi siano prevenire la divulgazione non autorizzata di dati sensibili. In tal caso, dovrai concentrarti su un numero di elementi. Non esiste un semplice proiettile d'argento magico che risolverà questo problema per te; dovrai lavorare sulla sicurezza delle applicazioni in generale.

Lascia che ti suggerisca alcune cose che dovrebbero essere prioritarie per te, se ho capito bene i tuoi obiettivi:

  • Sicurezza dell'applicazione. Devi iniziare a studiare sulla sicurezza delle applicazioni web. Non importa quante criptovalute lanci al problema; se un utente malintenzionato riesce a trovare una falla nella sicurezza nel codice dell'applicazione, viene espulso. Per informazioni sulla sicurezza delle applicazioni Web, OWASP ha molte risorse eccellenti. Assicurati di conoscere OWASP Top Ten, XSS, iniezione SQL, sanificazione/convalida dell'input, escape dell'output, whitelisting e altri concetti.

  • Controllo dell'accesso. La tua applicazione web deve avere controlli di accesso solidi, per garantire che un utente del tuo sistema non possa accedere alle informazioni di un altro utente (senza autorizzazione). I dettagli di questo dipenderanno dalle specifiche del tuo particolare sistema, quindi se desideri ulteriore aiuto su questo, probabilmente dovrai pubblicare una domanda separata con maggiori dettagli sulla tua applicazione e sulla tua attuale strategia per il controllo degli accessi.

  • Autenticazione. La tua applicazione web avrà bisogno di un modo per autenticare i suoi utenti. Lo schema standard di minimo sforzo è usare solo un nome utente e una password. Tuttavia, ciò ha in pratica serie limitazioni ben comprese. Se gli utenti scelgono le proprie password, spesso scelgono password scadenti e questo può sovvertire la sicurezza del sistema.

  • Ciclo di vita dello sviluppo del software sicuro. È necessario integrare la sicurezza nel processo di sviluppo del software. Quando elaborate l'architettura software, dovreste pensare ai requisiti di sicurezza ed eseguire la modellazione delle minacce e l'analisi dei rischi architetturali. Quando si scrive il codice, è necessario conoscere gli errori di implementazione comuni che possono violare la sicurezza e assicurarsi di evitarli. Dopo che il software è stato creato, è necessario testarne la sicurezza e valutare costantemente il proprio rendimento in termini di sicurezza. Quando si distribuisce il software, le persone operative devono sapere come gestirlo in modo sicuro. Microsoft ha alcune eccellenti risorse sul ciclo di vita dello sviluppo di software sicuro (SDL). Vedi anche BSIMM per di più.

  • Valutazione della sicurezza. Se sei preoccupato per la sicurezza, ti suggerisco di valutare la sicurezza della tua applicazione. Un semplice punto di partenza potrebbe essere quello di avere qualcuno che esegue un pentest della tua applicazione web, per verificare alcuni tipi di errori comuni. Questa non è affatto una garanzia di sicurezza, ma a volte può essere utile come sveglia se sono presenti molti problemi importanti. Potresti guardare i servizi di WhiteHat Security; ce ne sono anche molti altri che eseguiranno il pentesting sul web.

Se hai la sensazione che questa non sia un'impresa banale, mi scuso, ma è proprio così. D'altra parte, la buona notizia è che ci sono molte risorse là fuori e, inoltre, non è necessario diventare un guru della sicurezza a livello di esperto: è sufficiente acquisire familiarità con alcuni concetti di base e alcuni comuni di sicurezza errori nella programmazione web e questo si occuperà della maggior parte delle tue esigenze.

101
D.W.

La crittografia dei dati nel database proteggerà le informazioni se il database viene in qualche modo rubato. Ma non farà nulla per proteggersi dal sito Web attaccato. Ad esempio indovinando un nome utente/password. Potrebbe rallentare qualcuno se ha compromesso il server perché deve trovare la chiave ma non le fermerà. Inoltre ha un prezzo potenzialmente elevato. Ad esempio, i campi crittografati non sono più ricercabili in alcun modo efficace. È inoltre necessario essere consapevoli delle implicazioni del backup e assicurarsi che venga eseguito il backup della chiave, preferibilmente separatamente per i backup del database per impedire la decodifica del database in caso di furto di un nastro di backup. E devi assicurarti di avere diverse copie della chiave e testarle regolarmente.

15
pipTheGeek

Un buon concetto di SoA è avere un servizio di crittografia, in esecuzione isolata da altri processi sul tuo server (anche la tua app web dovrebbe essere isolata!). Quindi, quando è necessario crittografare/decrittografare un oggetto/campo, si invia in chiaro/crypttext al servizio crittografico e si viene restituiti con crypttext/plaintext. In questo modo, anche se l'app Web viene compromessa, l'utente malintenzionato non può leggere la chiave di crittografia, poiché solo il servizio crittografico conosce la chiave. Inoltre, poiché l'app Web è isolata, ciò che potrebbe fare sul tuo sistema è fortemente limitato. L'isolamento del servizio viene solitamente eseguito con un sistema MAC come SElinux, TOMOYO (molto più facile da usare rispetto a SElinux imo), AppArmor. Inoltre consiglierei di eseguire l'ultimo kernel Linux patchato con grsecurity.

6
Matrix

Risposta breve: Sì, utilizzare una crittografia simmetrica. Ciò impedirà alcuni attacchi come la lettura di dati sql attraverso l'iniezione sql. Tuttavia, se la tua webapp viene attaccata, potrebbe non avere importanza. Se qualcuno ha abbastanza accesso al tuo server non puoi praticamente fare nulla. Anche con crittografia asimmetrica.

3
user5575