Problema Sicurezza

giovedì 03 marzo 2016 - 10.12
Tag Elenco Tags  SQL Server Express

zseven Profilo | Senior Member

Buongiorno ragazzi,
abbiamo ricevuto un paio di email in lingua inglese da un ipotetico "good Web/Internet Developer" dove ci viene
segnalato un grave problema di sicurezza.

In particolare in questa email vengono addirittura elencati tutti i database presenti sul sql server installato
su uno dei nostri server, oltre che il nome dell'istanza di sql server.

In una seconda email ci sollecita a rispondergli ricordandoci che ci vuole solo aiutare a risolvere il problema.

Ovviamente siamo molto preoccupati da questa cosa e volevo chiedervi:
per aver elencato tutti i db presenti su sql server è riuscito per forza ad ottenere la password giusto?

Stanotte abbiamo cambiato la password su Sql Server, e ci stiamo mettendo in contatto con degli esperti
in sicurezza per cercare di stare tranquilli.
Voi cosa consigliate di fare intanto?

Grazie mille per l'aiuto

alx_81 Profilo | Guru

>Buongiorno ragazzi,
ciao

>abbiamo ricevuto un paio di email in lingua inglese da un ipotetico
>"good Web/Internet Developer" dove ci viene
>segnalato un grave problema di sicurezza.
>In particolare in questa email vengono addirittura elencati tutti
>i database presenti sul sql server installato
>su uno dei nostri server, oltre che il nome dell'istanza di sql server.
>In una seconda email ci sollecita a rispondergli ricordandoci
>che ci vuole solo aiutare a risolvere il problema.
bella mossa!
il problema è che se è entrato, significa che può anche fare danni.

>Ovviamente siamo molto preoccupati da questa cosa e volevo chiedervi:
>per aver elencato tutti i db presenti su sql server è riuscito
>per forza ad ottenere la password giusto?
no, non serve necessariamente una password, basta usare la Vs applicazione e iniettare dell'sql.

- Per evitare ciò, c'è da cambiare tutto il Vs data access layer. Usate le query parametriche o concatenate stringhe?
- Usate stored procedure senza SQL dinamico?
- Se lo fate dinamico, usate la sp_ExecuteSQl?
- Avete disabilitato sa e fatto un Vs utente sysadmin irraggiungibile?

Ci sono tool, come SQLMap e SQL Ninja che fanno verifiche di quel tipo contro un ipotetico website:
http://sqlmap.org/
http://sqlninja.sourceforge.net/
Mi raccomando, la sicurezza è da considerare sempre, i malintenzionati ci sono e molto spesso il buco è colpa di azioni di base non eseguite.
Svolgo anche attività di controllo della security sulle istanze SQL, e Vi posso dire che ho visto perdere una miriade di dati, senza nemmeno avere uno che sia un backup da qualche parte. Sono cose alle quali va riservato il giusto quantitativo di risorse.

>Grazie mille per l'aiuto
di nulla!
Alessandro Alpi | MS Data Platform MVP | Engage IT Services s.r.l.
MCP|MCITP|MCTS|MCT
http://www.engageitservices.it
http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com

zseven Profilo | Senior Member

Ciao Alx,
grazie mille per la risposta.

In linea di massima le query sono tutte parametrizzate, solo in pochi casi concateniamo stringhe, ma le stringhe contengono sempre i parametri però
e non dovrebbero mai passare le variabili concatenate alle stringhe.

Le stored non le usiamo proprio e l'unico utente abilitato è il sa.

Il problema principale è che questo sql server contiene circa 60 database, controllarli tutti per l'injiection non sarà uno scherzo...

Per ora la cosa che abbiamo fatto subito è stato modificare la password di accesso a sql server e criptare il web.config
di tutti i siti che dialogano con questo server, così almeno da nascondere ip, porta, nome e password dei vari database.

Sentendo anche altre voci in molti mi hanno consigliato di eliminare l'account sa e crearne un altro.
Come posso fare questa operazione?
E soprattutto, i siti che si collegano a questo sql server dove cambierò l'user, dovranno subire modifiche?

Grazie mille per l'aiuto!

alx_81 Profilo | Guru

>In linea di massima le query sono tutte parametrizzate, solo
>in pochi casi concateniamo stringhe, ma le stringhe contengono
>sempre i parametri però e non dovrebbero mai passare le variabili concatenate alle stringhe.
verifica comunque che non vi sia possibilità di iniettare SQL via stringhe. Stored procedure oppure query parametriche con .net (oppure Entity Framework, NHibernate, ecc..)

>Le stored non le usiamo proprio e l'unico utente abilitato è il sa.
ok, questo dovrebbe essere disabilitato in favore delle utenze applicative con i minimi permessi possibili.

>Il problema principale è che questo sql server contiene circa 60 database, controllarli tutti per l'injiection non sarà uno scherzo...
me ne rendo conto, però hai già capito.. pensarci fin da subito d'ora in poi è la cosa migliore. Mi rendo conto anche che non è detto che li abbiate scritti direttamente (ereditarietà di mastodonti ) però la sicurezza è fondamentale. Anche step by step.. ma iniziare il processo di messa a punto è fortemente consigliato.

>Per ora la cosa che abbiamo fatto subito è stato modificare la
>password di accesso a sql server e criptare il web.config
>di tutti i siti che dialogano con questo server, così almeno
>da nascondere ip, porta, nome e password dei vari database.
Non sono le uniche backdoor purtroppo..

>Sentendo anche altre voci in molti mi hanno consigliato di eliminare
>l'account sa e crearne un altro. Come posso fare questa operazione?
crei una login che rimpiazza sa con un nome decisamente più introvabile e custom e poi gli assegni il ruolo serve sysadmin. Dopo questo, e dopo aver verificato che funzioni, disabiliti sa direttamente dalle proprietà della login. Il modo migliore sarebbe avere windows auth e non sql, ma questo puoi farlo dopo aver messo in sicurezza il tutto.

>E soprattutto, i siti che si collegano a questo sql server dove
>cambierò l'user, dovranno subire modifiche?
purtroppo sì, se usavano sa, tutte le connection string andranno cambiate. Per questo l'autenticazione integrata di windows è più comoda e sicura. Ma serve anche un domain controller (se i tuoi servizi ed applicazioni girano su macchine differenti da quella di SQL Server) o almeno la possibilità di assegnare un utente windows alle vostre app.
Alessandro Alpi | MS Data Platform MVP | Engage IT Services s.r.l.
MCP|MCITP|MCTS|MCT
http://www.engageitservices.it
http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com

zseven Profilo | Senior Member

mmm... mi sa che la cosa migliore e più semplice da fare sia quella di prendere un nuovo server dove installare
correttamente ed in maniera più protetta un altro sql server e man mano fare in modo che tutti i siti leggano
i db dal nuovo server piuttosto che dal vecchio che poi sarà dismesso.
Che ne dici?

Attualmente la stringa nel web.config è la seguente:
<add name="connessione" connectionString="Data Source=IP SERVER,PORTA\IP SERVER;database=NOME DB;User Id=sa;Password=PASSWORD; multipleactiveresultsets=true" />

una volta eliminato il sa ed aggiunto quello custom sarà sufficiente modificare la user id o cambia completamente la stringa di connessione?

Grazie mille!

alx_81 Profilo | Guru

>mmm... mi sa che la cosa migliore e più semplice da fare sia
>quella di prendere un nuovo server dove installare
>correttamente ed in maniera più protetta un altro sql server
>e man mano fare in modo che tutti i siti leggano
>i db dal nuovo server piuttosto che dal vecchio che poi sarà
>dismesso.
>Che ne dici?
Non puoi creare una nuova istanza su quel server? In questo modo, la prima verrà "dismessa" a migrazione compiuta. Non ti sposti da quel server ed eviti l'acquisto.. certo, se vuoi sfruttare l'occasione per comprare, ci sta

>una volta eliminato il sa ed aggiunto quello custom sarà sufficiente
>modificare la user id o cambia completamente la stringa di connessione?
no, cambiano solo le credenziali. Ma se potessi, utilizza utenti windows (autenticazione integrata) evitando sql auth.
Alessandro Alpi | MS Data Platform MVP | Engage IT Services s.r.l.
MCP|MCITP|MCTS|MCT
http://www.engageitservices.it
http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com

zseven Profilo | Senior Member

Ipotizzavo il nuovo server per configurare poi al meglio il rapporto tra le due macchine senza creare disservizi,
in quanto nella vlan abbiamo anche una VPN che vorrei sfruttare per limitare il dialogo tra le due macchine
e garantire ancora di più la sicurezza (correggimi se ho detto qualche fesseria :D).

Comunque, giusto per approfondire l'argomento, puoi indicarmi un link dove poter seguire la procedura
corretta per creare la nuova istanza senza creare problemi?

Grazie mille

alx_81 Profilo | Guru

>Comunque, giusto per approfondire l'argomento, puoi indicarmi
>un link dove poter seguire la procedura
>corretta per creare la nuova istanza senza creare problemi?
Si tratta di una semplice installazione di SQL Server, solo che specifichi l'istanza nominata, dal momento in cui la default è già usata.
Alessandro Alpi | MS Data Platform MVP | Engage IT Services s.r.l.
MCP|MCITP|MCTS|MCT
http://www.engageitservices.it
http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com

zseven Profilo | Senior Member

Allora ho installato sql server.
Come nome istanza ho lasciato quello che mi suggeriva lui cioè MSSQLSERVER e poi ho scelto l'autenticazione windows.

Successivamente ho dovuto aggiungere l'utente NT AUTHORITY/SYSTEM altrimenti non riusciva a collegarsi.

Così il sito in test funziona e va tutto ok.

Ritieni che ho sbagliato qualcosa o che devo fare qualcos'altro per alzare il livello di sicurezza?

alx_81 Profilo | Guru

>Come nome istanza ho lasciato quello che mi suggeriva lui cioè MSSQLSERVER e poi ho scelto l'autenticazione windows.
Quindi significa che non avevi altre istanze su quella macchina

>Successivamente ho dovuto aggiungere l'utente NT AUTHORITY/SYSTEM altrimenti non riusciva a collegarsi.
non hai fatto "add current user" come amministratore durante l'installazione? L'utenza dove l'hai messa, tra le login?

>Così il sito in test funziona e va tutto ok.
>Ritieni che ho sbagliato qualcosa o che devo fare qualcos'altro
>per alzare il livello di sicurezza?
Il servizio SQL Server dovrebbe girare con un domain user o un local user NON AMMINISTRATORE,
poi, per le utenze sql, è tutta altra storia, dovrai disegnare i permessi per ogni utente che si collega al server

Alessandro Alpi | MS Data Platform MVP | Engage IT Services s.r.l.
MCP|MCITP|MCTS|MCT
http://www.engageitservices.it
http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com

zseven Profilo | Senior Member

[b]Quindi significa che non avevi altre istanze su quella macchina[/b]
No questa è la macchina nuova che ho preso per testare il tutto

[b]non hai fatto "add current user" come amministratore durante l'installazione? L'utenza dove l'hai messa, tra le login?[/b]
Sì l'ho fatto, ho dovuto aggiungere almeno un utente altrimenti nonmi faceva proseguire, non ricordo però precisamente in quale momento dell'installazione.

L'utenza l'ho aggiunta inquesto percorso:
Database - Nome Database - Sicurezza - Utenti e qui l'ho aggiunta

Adesso però sto notanto che non c'è più in questa posizione l'utente. Come mai?
Vedo che esiste però in questo percorso: Database - Sicurezza - Account di accesso

[b]Il servizio SQL Server dovrebbe girare con un domain user o un local user NON AMMINISTRATORE,
poi, per le utenze sql, è tutta altra storia, dovrai disegnare i permessi per ogni utente che si collega al server[/b]
E' sbagliato quindi quello che ho fatto? Puoi indicarmi se devo modificare qualcosa per migliorare il tutto?

Grazie mille

alx_81 Profilo | Guru

>Sì l'ho fatto, ho dovuto aggiungere almeno un utente altrimenti
>nonmi faceva proseguire, non ricordo però precisamente in quale
>momento dell'installazione.
c'è la parte in cui definisci le utenze per servizio, e di solito ti imposta questa opzione proprio lì.

>L'utenza l'ho aggiunta inquesto percorso:
>Database - Nome Database - Sicurezza - Utenti e qui l'ho aggiunta
>Adesso però sto notanto che non c'è più in questa posizione l'utente.
>Come mai?
>Vedo che esiste però in questo percorso: Database - Sicurezza
>- Account di accesso
attenzione, ci sono due livelli di sicurezza.. Il primo, espresso dalle Login (o account di accesso) serve per definire il livello di accesso al server SQL. Il secondo, espresso dagli utenti database, è il livello di accesso al database, concretizzato dalla relativa login. Ognuno di questi elementi può avere un suo set di permessi (definiti dal Data Control Language, per GRANT, REVOKE e DENY), come ad esempio "posso fare select su un oggetto" oppure "posso scrivere su questo database", ecc.
Una volta definita la login (account di accesso) dovrai andare nella sezione "mapping utente" nelle sue proprietà. Da lì dovrai assegnare l'account al database, con le relative permission.

In definitiva:
1 - andare su SQL Server Configuration Manager ed impostare l'utente del servizio ad un domain user o local user non amministratore
2 - riavviare il servizio sql (se non è di produzione e se puoi permettertelo, attenzione perchè la ram allocata viene distrutta e riallocata, con il conseguente disagio per chi si connette)
3 - definire (ma credo tu l'abbia già fatto) la login di accesso col nome che hai messo nella connection string dell'applicazione e, nei ruoli a server, verificare che non sia sysadmin (worst practice altrimenti)
4 - definire il mapping tra quell'account di accesso ed il database utente (che verrà creato all'atto del mapping) andando ad impostare il ruolo dell'utente verso quel database (e dipende quello che quell'utente deve poter fare sul db)

Procedi così e ci aggiorniamo,
ciao
Alessandro Alpi | MS Data Platform MVP | Engage IT Services s.r.l.
MCP|MCITP|MCTS|MCT
http://www.engageitservices.it
http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5