Come posso archiviare e accedere in modo sicuro ai dettagli della stringa di connessione?

Attualmente sto lavorando su un sito Web ASP.NET MVC e sono arrivato a un punto in cui ho bisogno di integrare un database nel sito web.

Normalmente aggiungerei semplicemente la stringa di connessione appropriata al file Web.config :

  

Ma c’è ovviamente un evidente errore di sicurezza se lascio il mio ID utente e la password direttamente in Web.config , specialmente quando è sotto controllo del codice sorgente.

In breve: come posso memorizzare i dettagli della mia stringa di connessione senza renderli visibili pubblicamente?

La procedura migliore è crittografare la sezione delle stringhe di connessione. Utilizzare aspnet_regiis.exe, che può essere trovato in vari luoghi:

  • Start – Visual Studio – Strumenti di Visual Studio – Prompt dei comandi di Visual Studio
  • C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 (assicurandosi di essere eseguito come amministratore)

Prima:

      

Esegui questo comando:

 aspnet_regiis –pef connectionStrings c:\PathToWebSite 

Oppure, se il comando precedente non funziona (e ottieni il testo di aiuto di aspnet_regiis), prova

 aspnet_regiis -pe connectionStrings -app "/" -site 6 

dove “6” è l’ID del sito come riportato in IIS.

Dopo:

        Rsa Key   Bf677iFrUFW ... +4n4ZZKXCTUAu2Y=     UDEZ ...QfXUmM5rQ==    

Ora che è confuso, non puoi modificarlo. Decifrare in questo modo:

 aspnet_regiis –pdf connectionStrings c:\PathToWebSite 

O

 aspnet_regiis -pd connectionStrings -app "/" -site 6 

E poi cambia e ri-cripta.

Per leggere la stringa di connessione, utilizzare la class statica ConfigurationManager.

 string connStr = ConfigurationManager .Connectionstrings["MainConnectionString"] .ConnectionString.ToString(); var myConnection = new SqlConnection(connStr); myConnection.Open(); 

Un approccio consiste nell’utilizzare qualsiasi sicurezza integrata offerta dal DB, quindi la password non è un problema. Il server ottiene l’accesso diretto al server senza dover utilizzare una password, ma è necessario impostare un utente che ha solo accesso dal server web stesso.

per esempio. I DB come MySQL consentono di specificare quali server possono accedervi, limitare l’accesso da qualsiasi altra parte, in modo che un hacker non possa accedere al proprio DB se non dal server web. Ciò riduce notevolmente la superficie di sicurezza e consente di archiviare i file delle stringhe di connessione in SCM.

Non è ancora sicuro al 100% in quanto l’hacker potrebbe (spesso facilmente) hackerare il tuo server web e visualizzare il DB da esso. È ansible memorizzare la password altrove, ma questo è solo oscurare il problema: se il server Web può accedere alla password, anche l’hacker può farlo. (nota, altri posti per memorizzare la password includono il registro, un file separato come un file .udl o qualcosa in / etc). È ansible proteggere questo file in modo che solo l’utente del server Web possa leggerlo, ma un server Web compromesso può ovviamente leggerlo!

Quindi il passo successivo è di astrarre la connessione DB in modo che sia esterna al web server, il metodo usuale è quello di avere un processo separato per archiviare la logica aziendale (es. Un servizio) che espone metodi fissi – il server web chiama semplicemente il servizio che esegue il lavoro e restituisce i dati al codice del server web.

Se un hacker sconfigge il tuo server web, tutto ciò che possono fare è chiamare i metodi sul servizio, non avrebbero accesso diretto al DB, quindi non potrebbero corromperlo o modificarlo. Di solito ci sarebbero pochi suggerimenti all’hacker su cosa fossero o cosa fossero i metodi di servizio, e il servizio avrebbe una buona quantità di codice di convalida per tutti gli input, quindi un messaggio creato da un hacker sarebbe (si spera) respinto. (usa timestamp, contatori, ecc. per cercare di sconfiggere messaggi personalizzati creati per il servizio).

Questo è l’approccio che abbiamo usato per un sistema ad alta sicurezza (c’è molto altro che puoi fare per proteggere ogni segmento di questa catena usando meccanismi di sicurezza OS standard). Le ragioni per farlo sono diventate molto chiare una volta che il nostro tizio di sicurezza ha dimostrato un hack IIS che gli ha fornito una shell remota con privilegi di amministratore. Qualsiasi cosa tu faccia per proteggere le tue configurazioni sul server web è inutile se un hacker ottiene questo. (ed era banalmente facile da fare – da quando è stato risolto, ma ci sono sempre degli exploit da 0 giorni trovati)

Forse vuoi esaminare la crittografia della stringa di connessione: http://chiragrdarji.wordpress.com/2008/08/11/how-to-encrypt-connection-string-in-webconfig/ (l’articolo è un po ‘vecchio)

Gli approcci comuni includono la crittografia di web.config e l’ archiviazione delle stringhe di connessione nel registro .

Il secondo link è una parte di un articolo molto più ampio che spiega come proteggere in modo sicuro un’applicazione ASP.NET. È stato scritto per WebForms, ma i principi sono gli stessi. È una buona lettura e la maggior parte si applica ancora oggi, anche se è un po ‘vecchia.

È ansible archiviare le stringhe di Encrypted Connection nella cache. Il server cache si trova su un altro server di proposito (questa comunicazione può essere limitata a 1 porta e l’indirizzo IP diventa molto più difficile da hackerare). Questo otterrà la stringa di connessione completamente fuori dal server Web e anche se un hacker ottiene l’accesso alla cache vengono crittografati. La chiave è il caricamento delle stringhe nella cache e può essere fatto in remoto, quindi quelle stringhe di connessione non vengono mai scritte sul disco rigido del server. Il codice decodifica solo le stringhe di connessione in base alle esigenze e non mantiene mai le stringhe non crittografate in una variabile.