Overkill o appropriato? [chiuso]

0

Mi sono imbattuto in un'applicazione web che un'azienda mi ha chiesto di ricostruire. Dopo che tutta l'implementazione è stata fatta e completata, eseguirò l'implementazione su un server privato e il database sarà sul proprio server privato. Gestirò la comunicazione tra i due con i firewall e entrambi i dati dei server e il web sarà dietro un bilanciatore del carico. La mia domanda è questa, i dati che vengono raccolti sono dati estremamente sensibili, seleziono le colonne di informazioni sensibili e le crittografo, perché prima non lo facevano, o sarebbe semplicemente eccessivo. Voglio memorizzare in modo sicuro le informazioni, tuttavia posso essere un po 'intenso quando si tratta delle mie preoccupazioni.

Se la risposta è no, è grandioso e sono contento di averlo chiesto. Tuttavia, se la risposta è sì, qualcuno sa come farei per aggiornare le informazioni alla nuova crittografia necessaria.

I passaggi dovrebbero selezionare tutte le informazioni, convertire le colonne da varchar a varbinary, crittografare i dati e infine reinserirli nel database.

Lo stack di sviluppo per il codice per i dati che sto utilizzando è Java / MySQL.

    
posta Richard Davy 11.01.2015 - 18:27
fonte

2 risposte

2

Supporto completamente la crittografia delle informazioni sensibili mentre è in memoria. La crittografia delle informazioni sensibili nel database impedisce a un utente malintenzionato di raccogliere informazioni utili se ha ottenuto il database. Tuttavia, come sempre, come implementare il sistema di crittografia è di fondamentale importanza.

Per prima cosa dobbiamo confrontare e mettere a confronto due situazioni in cui il database è compromesso:

  1. La situazione si verifica quando il database è stato compromesso, ma il file system è ancora sicuro.
  2. La situazione due si verifica quando sia il database sia il file system sono compromessi.

La situazione uno è quando la crittografia è la più utile. Questo tipo di attacco si verifica quando l'utente malintenzionato ha utilizzato un metodo come l'iniezione SQL. Questo è l'ideale perché l'utente malintenzionato non ha una chiave / metodo di decrittografia e lui / lei dovrebbe forzare la chiave di decodifica per ottenere i dati (ciò dovrebbe essere impossibile).

La situazione due è molto meno favorevole. Questo tipo di attacco si verifica quando l'utente malintenzionato ha ottenuto l'accesso al server (ad esempio, accesso fisico, FTP, SSH, eccetera). Poiché l'autore dell'attacco ha ottenuto l'accesso al file system, probabilmente ha la chiave di decrittografia, il che significa che può solo decodificare il database ed è game over.

Tuttavia, qui hai un vantaggio perché hai sia un server front-end che un server back-end. Ciò significa che è possibile implementare un design più sicuro per proteggere dalla situazione due. È possibile crittografare / decodificare su entrambi i server, il che significa che l'utente malintenzionato dovrebbe compromettere entrambi i file system del server. Ecco cosa intendo: il server di frontend può crittografare i dati sensibili utilizzando la propria chiave; inviare tali dati al server di back-end; il server di back-end quindi crittografa i dati crittografati utilizzando una chiave diversa; e infine il server di back-end memorizza i dati con doppia crittografia. Il processo di decodifica è solo il contrario: il server di backend estrae i dati crittografati; il server back-end decrittografa il primo livello di crittografia e lo invia al server frontend; il server di frontend rimuove quindi il secondo livello di crittografia; infine, il server di frontend visualizza i dati sensibili decrittografati all'utente.

Tutto ciò detto, come afferma la risposta di Kevinze, ci sono altre protezioni che dovrebbero essere in atto. Dovresti utilizzare HTTPS (SSL / TLS) per le comunicazioni tra l'utente e il server frontend. Ciò impedirebbe MiTM (nella maggior parte dei casi) e aiuterà a proteggere le comunicazioni tra il client e il server. Dovresti anche prendere in considerazione altre protezioni come la crittografia completa del disco. Non posso darti molte informazioni al riguardo, ma ovviamente aggiungerebbe protezione al file system.

Nella tua domanda, hai chiesto di aggiornare il tuo database e convertirlo in un modulo crittografato. Se fossi nella tua posizione, costruirò un nuovo database per memorizzare le informazioni crittografate e poi scriverò un programma per leggere tutte le voci dal vecchio database, scorrere su di esse, crittografare le colonne sensibili e inserirle nel nuovo database. Ecco alcuni pseudo-codice:

All_Entries[][] = Fetch_Array_All_Entries(FROM_OLD_DATABASE); // Multidimensional Array

for(int i = 0; i < count(All_Entries); i++){
    thisEntry = All_Entries[i];
    encryptedEntry = new Array();
    encryptedEntry["Some Insensitive Column Name"] = thisEntry["Some Insensitive Column Name"];
    encryptedEntry["Sensitive Column 1"] = encryptColumn(Backend_Key, encryptColumn(Frontend_Key, thisEntry["Sensitive Column 1"]));
    encryptedEntry["Sensitive Column 2"] = encryptColumn(Backend_Key, encryptColumn(Frontend_Key, thisEntry["Sensitive Column 2"]));
    // ... Encrypt all sensitive columns and assign them to the encryptedEntry ...

    // Once all encryption is done:
    Insert_Array_Entry(TO_NEW_DATABASE, encryptedEntry);
} // end entry loop

Una volta che il nuovo database è stato aggiornato con voci crittografate, è sufficiente sostituire il vecchio database con quello nuovo.

La tua domanda menziona il passaggio da VARCHAR a VARBINARY . Questa è davvero una tua scelta, ma potresti continuare a utilizzare VARCHAR se converti i byte in un formato stringa. Solitamente i dati crittografati vengono visualizzati come una stringa Base64. Ancora una volta, devi prendere quella decisione per te stesso, ma è così che probabilmente lo farei.

    
risposta data 12.01.2015 - 21:37
fonte
1

Il canale di comunicazione tra il browser e il server (praticamente qualsiasi canale su Internet) deve essere crittografato con TLS. Questo crittografa e fornisce un canale sicuro e autenticato.

Dopo che i dati hanno raggiunto in sicurezza il server del database, è necessario utilizzare la crittografia nello spazio di archiviazione del disco poiché si ha la responsabilità di proteggere le informazioni sensibili del client. È possibile esplorare la crittografia completa del disco (FDE) per il server in quanto dovrebbe essere più sicuro della sola crittografia del database (il sistema operativo stesso deve essere crittografato). Aggiungi uno strato di sicurezza fisica (chiusure delle porte, guardie di sicurezza) e hai un ambiente professionale. La crittografia protegge principalmente dagli attacchi offline, ad es. il server è fisicamente compromesso, ma i dati rimangono illeggibili.

Dopo aver implementato FDE, probabilmente non è necessario crittografare ulteriormente le singole colonne del database perché non ci sarà molto più beneficio. In una configurazione realistica, il tuo database non solo cripta solo. Dovrebbe anche decifrare le informazioni su richiesta quando è necessario. Un malintenzionato può sfruttare il tuo server web in qualche modo per ingannare il tuo back-end nel produrre comunque le informazioni decifrate. Cose come iniezioni SQL, cross-site scripting e altri attacchi "online" che sono probabilmente più comuni e più letali. Scopri le 10 principali minacce qui da The Open Web Application Security Project.

link

    
risposta data 12.01.2015 - 19:48
fonte

Leggi altre domande sui tag