Metodi per mantenere un registro autonomo con alta integrità

1

Sto scrivendo un'applicazione desktop .NET che viene utilizzata per inviare ordini a un server tramite un'API REST. Per evitare la perdita del nostro token di autenticazione, ho fatto in modo che, una volta usato per la prima volta, l'utente debba inviare il token di autenticazione e una password per crittografarlo con.

L'algoritmo di crittografia è AES-256-CBC e lo schema è il seguente: la password viene cancellata prima che venga utilizzata dall'algoritmo, il sale utilizzato per l'hashing è il GUID del computer, quindi copiare i file del programma non è sufficiente e la IV viene generata casualmente e concatenata con il codice. Quando l'utente apre il programma in seguito, gli viene richiesta una password, viene avviata la decrittografia e quando il token di autenticazione non corrisponde alla maschera richiesta restituirà un errore. Fin qui tutto bene direi.

Tuttavia , il mio supervisore non è ancora soddisfatto del livello di sicurezza: vuole che il programma registri tutti gli ordini che sono stati inviati al server in caso di anomalie amministrative da parte della terza parte che ospita il server, solo per avere un riferimento con un ragionevole livello di credibilità (anche se suppongo che potresti chiamarlo 'prova' nel caso che la loro amministrazione fallisca). La parte "credibilità" è quella in cui qualsiasi implementazione diretta di un file di log viene visualizzata direttamente dalla finestra, non fornirebbe:

  • Integrità: nessuna persona (incluso l'utente) può modificare il file di log con contenuti che non riflettono l'effettivo utilizzo del programma. Il registro può essere aggiunto solo quando viene utilizzata la funzione principale del programma e solo dal programma stesso.
  • Riservatezza: il contenuto del registro può essere richiamato solo dall'utente del programma (la richiesta della password aiuterà l'identificazione dell'utente).

Ho provato a creare uno schema crittografico (firma digitale) che codifica ogni record che viene aggiunto al registro e crittografa la chiave pubblica con la password dell'utente, ma questo non risolve metà problema: la chiave privata dovrebbe essere comunque memorizzato dal programma, quindi in senso stretto significa che l'utente ha accesso ad esso e ha la possibilità di modificare il registro.

Esiste un metodo o uno schema che soddisfa questi requisiti?

    
posta Chavez 02.07.2015 - 14:14
fonte

2 risposte

1

Hai ragione nel senso che è un problema intrattabile molto simile al perché il DRM non può mai essere provabilmente sicuro. È possibile rendere molto difficile per un utente la creazione del registro, ma in definitiva l'applicazione dovrà disporre della chiave necessaria per la firma digitale dei messaggi di registro. Se la chiave esiste sul computer client, può essere rimossa dal computer client.

La vecchia massima di "non c'è sicurezza delle informazioni senza sicurezza fisica" è in gioco.

Quindi molto dipende dal livello di integrità richiesto. Quanto è probabile che gli utenti provino e forgiano il log? Qual è il loro potenziale guadagno? Sarei onesto con il tuo capo su come la sicurezza perfetta non possa essere raggiunta.

Dettagli tecnici della registrazione

Non è esattamente chiaro quindi ho solo pensato di chiarirlo. L'applicazione dovrebbe contenere una chiave privata per la firma. Si consiglia di rendere questo client specifico per compartimentare il rischio. Ci sono modi per rendere più difficile l'estrazione di questa chiave privata, ma è importante essere aperti e trasparenti, quindi non è possibile renderlo impossibile. La chiave pubblica è nota sia all'utente che all'utente per l'autenticazione del registro. L'applicazione firma il messaggio di log e quindi esegue la crittografia con una chiave derivata dalla password dell'utente.

A seconda del livello di sicurezza e del costo del software, qualcuno del team potrebbe suggerire di utilizzare un dongle hardware o un token USB per memorizzare la chiave privata. Tieni a mente che mentre questo rende la chiave più sicura se l'attaccante può inviare un falso messaggio alla chiave per la firma, l'attaccante può modificare il log senza ottenere l'accesso diretto alla chiave.

Dettagli tecnici dell'API REST

Potresti voler riconsiderare il permesso al client di determinare se il token è valido al fine di prevenire attacchi offline. Se il token viene memorizzato crittografato sul computer client, un utente malintenzionato con accesso al filesystem potrebbe estrarre il token crittografato e forzarlo offline fino a quando non scoprirà il token valido.

D'altra parte se il token di autenticazione può essere validato solo dal server, l'unico modo per forzare la password dell'utente è quello di fare una richiesta al server. Ciò consente di limitare il throughput di tali attacchi di forza bruta, bloccare i conti e vietare l'IP se necessario. Diventa più difficile ottenere l'accesso non autorizzato a un token. Ci sono due modi per raggiungere questo obiettivo. Il metodo più semplice se si rendono i token arbitrari sarebbe quello di rendere il token semplicemente una derivazione (PBKDF2) della password dell'utente.

Se il token deve essere indipendente dalla password dell'utente o è predefinito, è possibile crittografarlo e memorizzarlo sul client, ma farlo in modo tale che per qualsiasi password venga restituito un token decrittografato e non sia possibile distinguere i token validi o invalidi senza comunicare con il server.

Se segui questo percorso per evitare perdite di informazioni, i registri dovrebbero essere crittografati non da una chiave derivata direttamente dalla password dell'utente ma da una chiave fornita dal server su richiesta (con un token di autenticazione corretto). In caso contrario, un utente malintenzionato può semplicemente forzare i registri offline e utilizzarli come canarino per identificare la password corretta e quindi il token.

    
risposta data 02.07.2015 - 14:40
fonte
1

Userei un servizio fornito esternamente (Splunk on Cloud, Papertrail - ce ne sono altri, ma ho usato questi) per garantire un'integrità ragionevole. Oppure usa il tuo, separato dal servizio (basato su una soluzione commerciale o, ad esempio, ELK )

La parte riservata è più difficile. Per il caso Splunk, se si dispone di un elenco predefinito di utenti, è possibile creare visualizzazioni con un contenuto per utente e attribuisce i diritti di lettura agli utenti appropriati. Questo è appena scalabile, però.

    
risposta data 02.07.2015 - 14:26
fonte

Leggi altre domande sui tag