Protezione di un'applicazione IIS con una configurazione complessa

1

Sono un po 'sottaceto.

Ho un'applicazione IIS che accede a un database SQL (su una macchina diversa). Questo significa già che:

a) l'applicazione IIS deve avere una stringa di connessione al database contenente la password
b) l'applicazione IIS deve essere eseguita utilizzando un'identità AD che ha accesso al database SQL

L'opzione b) sembra essere più sicura.

Tuttavia , esiste un requisito secondario:
Il database menzionato in precedenza contiene informazioni sensibili che sono crittografate con AES. L'applicazione IIS memorizza localmente la chiave AES e la crittografa anche tramite DPAPI (per evitare di memorizzarla in testo semplice). DPAPI ha tuttavia un piccolo problema:

1) Se lascio che l'applicazione IIS venga eseguita utilizzando il ruolo ApplicationPoolIdentity , DPAPI funziona correttamente 2) Se lascio che l'applicazione IIS venga eseguita come utente AD specifico, DPAPI non riesce a decodificare i dati dopo un IISRESET

Come puoi vedere, b) è in conflitto con 1), e a) è in conflitto con 2).

Come dovrei affrontare questo problema?

    
posta Shaamaan 18.02.2014 - 11:30
fonte

1 risposta

1

DPAPI funziona in realtà con 2 semplici chiamate di funzione: CryptProtectData e CryptUnprotectData .

Per farla breve, CryptProtectData ha due modalità di funzionamento: Utente o sistema. Se si utilizza la modalità utente (impostazione predefinita), i dati vengono crittografati utilizzando i dati di accesso utente correnti. Significa che puoi solo chiamare CryptUnprotectData con successo sugli stessi dati dallo stesso contesto utente di quello da cui hai chiamato CryptProtectData. (in modalità "sistema", qualsiasi processo in esecuzione su quella stessa macchina può decifrare i dati ma non da un altro sistema: non va bene quando i dati sono in un database).

Ciò significa che, se inizialmente hai crittografato i tuoi dati nel database del server SQL utilizzando un account utente AD specifico, sei permanentemente limitato a utilizzare questo utente per accedervi. (Questo potrebbe essere considerato un difetto o una caratteristica a seconda dell'applicazione).

Che cosa significa per te? Bene, a meno che tu non possa cambiare il modo in cui funziona l'applicazione o sei disposto a reimpostare completamente i dati crittografati, non puoi modificare l'identità utilizzata dal processo di applicazione web.

La buona notizia, tuttavia, è che questo non deve essere insicuro: se la tua applicazione Web è un'app ASP.NET e utilizza le stringhe di connessione memorizzate nel file web.config in un modo standard, puoi proteggerle usando anche DAPI ma questa volta con un delegato al sistema. Microsoft ha una spiegazione abbastanza lunga su come farlo .

Infine, c'è sempre il solito modo di morire con questo tipo di problemi: contatta gli sviluppatori dell'applicazione: sono quelli che possono dirti esattamente cosa è supportato e come. Se necessario, sono quelli che possono anche apportare le modifiche necessarie al loro sistema per raggiungere gli obiettivi di sicurezza che hai impostato.

Modifica: C'è un ulteriore elemento da tenere in considerazione nel tuo caso: quando usi DAPI, la chiave principale utilizzata per la crittografia è memorizzato nel profilo utente .

Ciò significa che, quando si utilizza un account utente virtuale (come quelli creati per l'utente durante l'esecuzione di un'app Web in AppPoolidentity ), DAPI non verrà permanentemente né ricaricato poiché non è stato creato alcun profilo effettivo e si verificherà il problema che si descrive: IISreset fa sì che l'applicazione perda la sua chiave di crittografia master perché non può persistere.

Per risolvere ciò, puoi passare a passare all'identità NetworkService per il tuo pool di applicazioni web. Perderai la segregazione dell'utente fornita dall'account virtuale ma, al di là di questo, dovrebbe funzionare allo stesso modo. Microsoft suggerisce anche di verificare la proprietà "LoadUserProfile" del pool di applicazioni Web ma dubito che cambiandolo risolverà il tuo problema da solo: prova, ma suppongo che dovrai usare anche NetworkService .

    
risposta data 18.02.2014 - 14:06
fonte

Leggi altre domande sui tag