Le credenziali dell'applicazione di crittografia utilizzano le buone pratiche di crittografia dei certificati?

2

Sto lavorando su una piccola applicazione web. L'applicazione web richiede l'accesso a un database, quindi l'applicazione deve accedere a un nome utente e una password del database.

L'applicazione viene eseguita in un ambiente in cui le macchine virtuali vengono e vengono e non ci sono dischi persistenti. L'unica configurazione dell'ambiente che possiamo impostare rimane nel tempo sono i certificati, tutte le altre configurazioni devono essere archiviate come parte dell'applicazione (che noi carichiamo al servizio di hosting in un file zip). I certificati che carichiamo ai provider di hosting vengono installati automaticamente nell'archivio certificati di Windows dal provider di hosting.

Il server di database che stiamo usando non supporta l'autenticazione usando i certificati - solo nome utente e password, quindi mi chiedo se il seguente schema abbia senso:

  1. Creiamo un certificato X509 autofirmato usando openssl o makecert.
  2. Carichiamo il certificato (con chiave privata) al provider di hosting (lo facciamo una volta o quando vogliamo rinnovare il certificato).
  3. Cifriamo le password del database nella configurazione dell'applicazione utilizzando la parte chiave pubblica del nostro certificato (utilizzando RSACryptoServiceProvider ).
  4. Carichiamo la password crittografata in un file di configurazione come parte del nostro pacchetto di applicazioni zip al provider
  5. Nel nostro codice applicazione, prima di connettersi al server del database, decifriamo la password del database utilizzando il certificato (di nuovo, utilizzando RSACryptoServiceProvider)

Con questo, otteniamo quanto segue:

  1. Chiunque (io o i miei amici) che lavora con l'applicazione può impostare una nuova password del database, crittografarla e aggiornare la configurazione dell'applicazione, senza accedere alla chiave privata nel certificato.
  2. Solo le persone con la chiave privata (che è installata sui server e memorizzate localmente da me) possono decodificare la password del database.

Sembra che questa sarebbe una soluzione abbastanza buona, ma sarei grato se qualcun altro potesse individuare un difetto.

    
posta Nitramk 01.09.2015 - 08:34
fonte

2 risposte

3

In superficie sembra un'idea geniale - se stai cercando di fornire un buffer contro:

  • Controllo della versione (git / svn hosting) compromesso
  • Furto di una macchina fisica contenente il codebase / credenziali
  • Il malware su uno dei tuoi sviluppatori perde le credenziali in qualche modo.
  • Qualsiasi altro modo in cui i file contenenti credenziali vengono rubati da un utente malintenzionato

Ricorda che questo non proteggerà il tuo database se la tua app web è compromessa, dato che ad un certo punto avrà ancora le credenziali non crittografate in memoria. Se stai solo cercando di proteggere le credenziali dal furto da un posto diverso da quello in diretta, dovrebbe funzionare comunque bene.

Inoltre, a mio parere l'ambiente che stai descrivendo sembra abbastanza non standard, il che mi preoccupa un po '. Stai facendo affidamento su qualsiasi servizio che il provider di hosting sta esponendo per accedere alle chiavi private in grande stile.

    
risposta data 01.09.2015 - 09:26
fonte
1

Non mi è chiaro se stai utilizzando Azure VM o PaaS ma potresti prendere in considerazione un flusso utilizzando token SAS.

Su Azure si dispone di un meccanismo integrato denominato firme di accesso condiviso SAS. Puoi leggere ulteriori informazioni su SAS qui link

Il tuo flusso sarebbe come questo

  1. Passa le credenziali e ottieni un token SAS una tantum a tempo
  2. È possibile utilizzare SAS con granularità funzionale, ovvero diversi token per diverse operazioni di dati. Questo ti darà un'ottima soluzione usando la funzionalità nativa di Azure

Sebbene esista la vulnerabilità di memorizzare un nome utente / password nel codice backend - se un utente malintenzionato compromette la macchina fisica / la tua VM o sfrutta il codice e eleva le autorizzazioni, l'utilizzo di una chiave pubblica / privata come descritto non sarà una sicurezza efficace contromisura e ti costerà solo un sacco di dolore e test di tempo e debugging. Quindi dimenticalo. Codifica le tue credenziali nel codice e utilizza SAS

In generale, eseguirò un'analisi delle minacce sulla tua applicazione prima di implementare le contromisure di sicurezza e anche come best practice, mai crittografia fai-da-te!

    
risposta data 01.09.2015 - 12:01
fonte

Leggi altre domande sui tag