Attualmente sto utilizzando l'autenticazione di SQL Server con nome utente / password come parte della stringa di connessione per la mia applicazione web. Per quanto ne so questa procedura standard all'interno del mondo .NET e forse oltre. Tuttavia, stavo esaminando i documenti per SqlConnection.ConnectionString proprietà dovuta a un problema non correlato e notato che dicono:
SqlCredential is a more secure way to specify credentials for a connection that uses SQL Server Authentication.
Suppongo che la maggior parte di questa sicurezza sia dovuta all'uso di SecureString
per memorizzare la password. Questa classe ha una propria serie di problemi quando viene utilizzata nel contesto di un'applicazione Web perché implementa IDisposable
. Ciò significa che devo fare una delle tre opzioni sbagliate:
- Non disponga intenzionalmente di
SecureString
lasciandola una variabile globale statica che legge una volta la password dal file di configurazione. - Accetta il colpo di prestazione di leggere la password dal file di configurazione ogni richiesta.
- Ignora i benefici di
SecureString
mantenendo la password in giro comestring
in modo da poter smaltire regolarmenteSecureString
senza incorrere nella penalità di lettura dal file di configurazione ogni richiesta.
Considerati questi problemi e il fatto che se qualcuno abbia accesso al server in cui sei stato ucciso . Inoltre, sembra che i vantaggi della crittografia della stringa di connessione si riducano sostanzialmente a riducendo il rischio di perdita accidentale dei dettagli persone che non dovrebbero averle:
By keeping the connection details out of source control, and out of general distribution, you reduce the possibility of loss or leakage. ... Due to this if encryption is in use, separating the key from the connectionstring and separating the connectionstring from the source is an essential action. Doing this has separated the duties and protection of the encryption keys (or configuration files) becomes a system administrator function, rather than a developer function.
Tuttavia, mi sembra che il modo più efficace per ridurre tale rischio sia limitare l'accesso al server e la stringa di connessione solo a coloro che devono sapere tramite la pipeline di build / release automatizzata 1 e la protezione del server è ovviamente il primo e più importante passo verso la protezione della stringa di connessione. Mi sembra che ci sia probabilmente un minor vantaggio teorico nell'usare SqlCredential classe in un'applicazione web 2 , ma non c'è un reale vantaggio pratico rispetto alla presenza del nome utente / password nella stringa di connessione.
Detto questo, c'è probabilmente un difetto fondamentale nel mio ragionamento perché i membri di Microsoft sono un gruppo intelligente. Quindi cosa mi manca?
1: Trasformazione / aggiunta del valore automaticamente nella pipeline di build / release.
2: sto utilizzando un Servizio cloud di Azure e connettersi a un Database SQL di Azure , con la maggior parte della logica del livello dell'applicazione scritta in C # se importa.