Come posso proteggere le chiavi per i dati memorizzati in un'applicazione web Python contro la violazione del server?

2

Sto costruendo un'applicazione REST per archiviare le credenziali: le chiavi GitHub e altri dati sensibili (che possono essere caricati dall'utente della web app). Sto cercando un modo ottimale per proteggere i dati, ma sono perso su come ridurre il rischio di sicurezza nel caso in cui il server di database / web application sia compromesso.

Attualmente sto osservando la seguente soluzione:

  • Le credenziali crittografate sono archiviate nel database dell'applicazione.

  • Le chiavi di crittografia per le credenziali sono archiviate in un database separato dietro un firewall.

  • Questo, come lo vedo io, dovrebbe ridurre il rischio se il database dell'applicazione è compromesso.

Il database è PostgreSQL e probabilmente il server è Apache2 + wsgi.

Questa architettura ha senso? È ridondante? Cosa può essere migliorato per l'archiviazione delle chiavi di crittografia? Quali strumenti consiglieresti per questo caso d'uso? Grazie in anticipo!

    
posta Alex Bausk 07.10.2016 - 10:17
fonte

1 risposta

1

La chiave per rispondere a questa domanda consiste nel pensare a quale accesso ha la tua applicazione web principale e cosa potrebbe accadere se un utente malintenzionato fosse in grado di riprogrammarlo per fare quello che vuole.

Questo esperimento mentale mostra rapidamente che l'unico modo per impedire completamente la fuga di dati sensibili in questo scenario è che l'applicazione Web non lo veda mai, ad esempio crittografandolo sul client con una chiave conosciuta solo dal client. Questo approccio è spesso poco pratico per le applicazioni web. Tuttavia è usato per alcune applicazioni come i backup del cloud.

Tuttavia, non tutto è perduto. Si possono ancora ridurre drasticamente i rischi di una perdita di massa di tutti i dati sensibili nel sistema in un paio di modi.

1. Archivia i dati crittografati, ma non conservare le chiavi.

Nel caso in cui il server venga compromesso, l'utente malintenzionato riceve solo i dati crittografati. Nel normale funzionamento la chiave può essere fornita dall'utente, ad esempio come password. Questo ha lo svantaggio che se un utente perde la sua password, perde anche i suoi dati.

2. Inserisci i dati sensibili (o le chiavi) su un server separato, dietro un firewall accessibile solo tramite un'API restrittiva.

La chiave di questo approccio è progettare l'API restrittiva in modo tale che, se un utente malintenzionato ottiene l'accesso a chiamarlo compromettendo l'applicazione Web principale, è limitato a ciò che può recuperare. Ci sono molti modi per raggiungere questo obiettivo, ma le idee di base sono come per qualsiasi servizio. Ecco alcuni aspetti da considerare se si implementa una tale API:

  • Richiedi l'autenticazione (come utente finale pertinente)
  • Non fornire API di esportazione collettive
  • Mantenere l'API semplice per ridurre il rischio di errori di programmazione
  • Richieste di limite di velocità
risposta data 07.10.2016 - 11:02
fonte

Leggi altre domande sui tag