La sicurezza in SQL Server Raffaele Rialdi Microsoft C# MVP MVP Profile Blog [email protected] Vevy Europe SpA http://mvp.support.microsoft.com http://snipurl.com/f0cv http://blogs/ugidotnet.org/raffaele Agenda Introduzione Architettura e servizi di SQL Server 2000 L’architettura di sicurezza in SQL Server 2000 Login e Database User Account Permission e Ruoli Security Issues Encryption Best practices Sicurezza applicativa Controllare SEMPRE l’input dell’utente Eseguire i servizi con account utente con solo i privileggi strettamente necessari Per contrastare attacchi di tipo escalation dei privilegi Mai mantenere le password degli utenti in chiaro Per evitare attacchi di tipo SQL Injection o Cross-scripting Utilizzare tecniche di hashing Operare con i database server utilizzando connessioni a bassi privilegi Considerazioni sulla protezione in aziende di piccole e medie dimensioni Server con più ruoli Risorse limitate per l'implementazione di soluzioni di protezione Utilizzo di sistemi non aggiornati Conseguenze legali Minaccia interna o accidentale L'accesso fisico impedisce molte misure di protezione Mancanza di esperienza sulla protezione Principi della protezione dei server Riservatezza Principi della protezione Integrità Disponibilità La riservatezza assicura la protezione dell'accesso alle informazioni L'integrità assicura l'assenza di modifiche nelle informazioni La disponibilità assicura la possibilità di accesso alle informazioni Difesa a più livelli L'utilizzo di un approccio a più livelli offre una serie di vantaggi, tra cui: Aumenta il rischio per un hacker di essere rilevato e scoperto Riduce le probabilità di successo di un attacco Dati Applicazione Elenchi di controllo dell'accesso, crittografia Protezione avanzata di applicazioni, antivirus Host Rete interna Perimetro Sicurezza fisica Criteri, procedure e consapevolezza Segmenti di rete, IPSec, NIDS Firewall, VPN di quarentena Personale di sicurezza, serrature e dispositivi di monitoraggio Formazione degli utenti Il servizio SQL Server SQL Server Client Results Results Query Query OLTP OLAP Applicazione Client Relational Database Management System Componenti Client-Server Applicazione Applicazione Client Client Database Database API API (OLE DB, ODBC, (OLE DB, ODBC, DB-Library) DB-Library) Client Client Net-Library Net-Library Client SQL SQL Server Server Server Server Net-Libraries Net-Libraries Open Open Data Data Services Services Relational Relational Engine Engine Server Storage Storage Engine Engine Processore Processore Memoria Memoria Database Locale Servizi di SQL Server L’architettura di sicurezza Sql Server implementa le due principali funzionalità di sicurezza Autenticazione Autorizzazione Che diritti hanno sui dati Autenticazione integrata con Windows Chi sono gli utenti che tentano di connettersi Sql non “riconosce” gli utenti ma demanda al S.O. questa operazione Autenticazione standard Architettura obsoleta, meno sicura Windows Authentication Connessione di rete/pre-login handshake Connessione al computer che ospita SQL Server Richiesta di autenticazione della login a SQL Server La connessione viene stabilita con le credenziali della login Richiesto switch nel contesto del db + autorizzazione Viene stabilito un contesto di database Esecuzione di comandi sugli oggetti Verifica dei permessi per i vari comandi sugli oggetti del db Security Security all’installazione Dir e Files, Registry, sa password La modalità di security di default per l’installazione di SQL Server 2000 è “Autenticazione Integrata” MS la consiglia come l’unica veramente sicura, insieme all’installazione su NTFS Solo gli account con cui girano i servizi e i local administrator avranno qualche permission sulle risorse utilizzate Durante il setup è possibile impostare una password per sa Vivamente consigliato Login e User Account Una login da il diritto di aprire una connessione tra un’applicazione e il server È contenuta nella sysxlogins del master Si applica a tutti i db dell’istanza Non ha permessi di accesso ai db tranne per i SysAdmin Un “database user account” da l’accesso alla login al contesto di sicurezza del database I permessi di accesso nel db sono dati ai database users, non alle logins Sono specifici per singolo database Permission SQL Server gestisce le permission di accesso agli oggetti con tre comandi: GRANT concede un permesso DENY nega esplicitamente un permesso REVOKE toglie una condizione precedente Grant - Revoke Revoke [deny] + DENY Grant Deny Ruoli in SQL Server Fixed server role Fixed database role Semplificano l’amministrazione del database Custom database role Semplificano l’amministrazione del server Semplificano la gestione delle permission degli utenti nel database Application role Permettono di dare le permission alle applicazioni indipendentemente dagli utenti che le utilizzano Ruoli in SQL Server 2000 Windows 2000 Group User SQL Server verifica la Trusted Connection SQL Server assegna le Login agli User Accounts e ai Roles Database User Server Role SQL Server Database Role SQL Server Login Account SQL Server verifica Login e Password Security Security basata sui ruoli migliorata Nuovo ruolo BulkAdmin SecurityAdmin può cambiare le password Eccetto per i membri del ruolo sysadmin ServerAdmin può controllare tutti gli aspetti dei messaggi sul server Può eseguire statement BULK INSERT Ora può utilizzare sp_addmessage, sp_dropmessage, e sp_altermessage Certificazione C2 ottenuta dal National Computer Security Center (NCSC), una divisione della National Security Agency (NSA) http://www.microsoft.com/technet/archive/security/news/c2eval.mspx Security issues La password di sa rimane vuota quando durante il setup si sceglie Windows Only Meglio impostarla comunque Il gruppo Builtin\Administrators è SysAdmin di default Meglio toglierlo e rimpiazzarlo con [NT Authority\System] (per MsSearch) e con gli account con i quali girano i servizi. Quando è in cluster, anche il service account del cluster Mai lasciare la password vuota per sa Eseguire I servizi con account a bassa priorità limita I danni in caso di attacco Network Security Le caratteristiche di sicurezza di SQL Server non sostituiscono la classica network security Es. da SQL Server non è possibile restringere l’accesso dei client per IP Firewall, IPSec, o altri network layer filter permettono di agire su indirizzi e porte TCP consentite Se la macchina è esposta, spostare le porte di default TCP 1433, UDP 1434 Network Security Encryption Le netlibs possono criptare Informazioni di login e i dati della sessioni utilizzando SSL/TLS La fase di handshake durante il logon viene sempre criptata È possibile criptare tutto il traffico Le nuove funzioni interne chiamano le Crypto API di Win2K Occore un certificato sul server per utilizzare la encryption SSL Il client deve accettare il certificato File Encryption E’ possibile proteggere i file di SQL Server Utilizzando Windows Encrypted File System (EFS) Prodotti di terze parti http://www.netlib.com C’è un overhead sul sistema Windows 2000 o successivi < 5% solitamente Pienamente supportato da SQL Server Previene la copia fisica dei file dati Permission Standard Ogni Database User Account appartiene inevitabilmente al ruolo Public Il ruolo Public per default può accedere ad una serie di informazioni In alcuni db di sistema è abilitato l’utente guest Realmente necessario solo in master e in tempdb Togliere l’accesso al gruppo public sugli oggetti per i quali è assolutamente necessario In Yukon sarà disabilitato di default, compreso l’accesso ai metadati Auditing Auditing architecture Basato sulle funzionalità di SQL Profiler L’architettura del Profiler è cambiata Vengono tracciate 19 tipologie di eventi SQL Trace – motore di trace lato server SQL Profiler – componente di UI Logon/logoff, Gant Revoke Deny ,Modify logon property, Password change event, Add/remove from fixed server role , Server shutdown/pause/start , ecc. È implementato attraverso un file di trace Può essere gestito come buffer circolare Extended Stored Procedure Sono lo strumento per estendere le funzionalità di SQL Server attraverso funzioni scritte in C e C++ in DLL esterne Normalmente vengono eseguite in-process con il servizio SQL Server Alcune di queste consentono all’intruso di eseguire privilege escalation XP_CMDSHELL Di default solo i sysadmin possono eseguirla Viene eseguita nel contesto di sicurezza del servizio o con il proxy account se l’utente che la lancia non è sysadmin NON concedere l’accesso se non giustificato Evitare di fare girare il servizio come amministratore della macchina MAI eseguire SQL Server su un domain controller e permettere xp_cmdshell Security Best Practices SQL Server Agent Di default, le SP per la creazione di job possono essere chiamate da public Il meccanismo di sicurezza dei job di per sé evita che qualcuno possa eseguire operazioni di tipo ActiveX script o Operative System Command ma… E’ possibile sfruttare altre vulnerabilità per eseguire codice nel contesto di sicurezza del servizio Best Practices Se è possibile evitare di fare girare il servizio come amministratore o LocalSystem Anche se complica la gestione della sicurezza Ma Enterprise Manager ci viene incontro… Rimuovere BUILTIN\administrators dai sysadmins Se per forza devo andare in Mixed mode Configurare password sensate MAI usare password blank Utilizzare SSL Best Practices Applicare sempre le ultime security patch [Q316333] Abilitare l’auditing e il tracing in modo appropriato Monitorare i log e gli alert relativi alla sicurezza Non utilizzare il ruolo sysadmin applicativamente e concedere solo se necessario Rimuovere xp_cmdshell, se non utilizzata Client connection E’ sempre il client che decide il tipo di security da utilizzare per la connessione Il server può solo rifiutarsi di accettare le credenziali non valide Utilizzare la sicurezza integrata con Windows Non cablare nome utente e password nel codice “….Integrated Security=SSPI; …” Utilizzare i tanti metodi disponibili nelle varie piattaforme di sviluppo Non utilizzare la login sa Scrivere codice security-aware Data Encryption Microsoft non la fornisce in SQL Server Problemi di performance e di recuperabilità dei dati Problema aperto per le prossime versioni del prodotto Esistono soluzioni di terze parti http://www.protegrity.com Limita la possibilità di sottrazione fisica delle informazioni Sviluppatori, Sistemisti o DBA? Cosa abbiamo capito? Nel rendere sicura una piattaforma basata su SQL Server occorre la partecipazione di tutte queste figure Se in una di queste aree qualcuno lascia degli spazi aperti… SQL Server può diventare una piattaforma potente per altri tipi di attacchi all’interno della rete Sviluppatori, Sistemisti o DBA? Sistemista Organizzazione di utenti e gruppi di domino Configurazione dei security account dei servizi Implementazione di Kerberos Configurazione di firewall, IPSec e IP Filtering Configurazione encryption con SSL File encryption Configurazione di SQLXML (parte IIS) Sviluppatori, Sistemisti o DBA? DBA Gestione utenti e ruoli nel DB server Configurazione dei database user account e delle loro permission Configurazione dei ruoli nei database Modifica delle impostazioni di default per Extended Stored Procedure Configurazione dell’Auditing Configurazione di SQLXML (parte SQL) Sviluppatori, Sistemisti o DBA? Sviluppatore Sviluppo di Stored Procedure che verificano sempre i parametri in input Sviluppo del codice client che utilizza correttamente la security per le connessioni Utilizzo di Trusted Connection dove possibile Encryption di codice T-SQL per nascondere la logica applicativa Encryption dei dati nelle tabelle, solo se è necessario Link utili [Q316333] http://www.microsoft.com/technet/treeview/default.asp?url=/techn et/security/bulletin/MS02-043.asp [Q321911] http://www.microsoft.com/technet/treeview/default.asp?url=/techn et/security/bulletin/MS02-030.asp http://www.sqlsecurity.com http://www.nextgenss.com Risorse Academic http://www.msdnaa.net http://www.microsoft.com/italy/msdn/studenti User Groups http://www.ugiss.org http://www.sqlpass.org http://www.ugidotnet.org Microsoft http://www.microsoft.com/sql http://www.microsoft.com/italy/sql http://msdn.microsoft.com/sql http://www.microsoft.com/TechNet/prodtechnol/sql Risorse Newsgroups news://msnews.microsoft.com microsoft.public.it.sql microsoft.public.sqlserver.* Non vi fanno uscire via NNTP ? http://msdn.microsoft.com/newsgroups Novità! http://www.microsoft.com/italy/sql/support/newsgroup/ © 2003-2004 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary. Per sfatare qualche luogo comune… Windows non è sicuro!! From January 2002 through November 2002, these were the number of security advisories issued (fonte ISS – X Data): Debian: 124 Mandrake: 86 Red Hat 7.2: 87 Sun Solaris: 68 Windows 2000 Server: 36 Windows XP Pro: 28 CERT advisories SUN OS: 12 Red Hat Linux: 9 Microsoft : 4 Per sfatare qualche luogo comune… Windows non è affidabile!! Windows Server 2003 System uptime > 99.999% Operations & best practices Windows Reliability Strategy Case studies NASDAQ Stock Market Inc London Stock Exchange Lockheed Martin Pirelli Spa Ecc. Per sfatare qualche luogo comune… Windows non è scalabile!! Bechmark TPC-C (www.tpc.org) Windows Server 2003 Enterprise Edition 64-bit e SQL Server 2000 Enterprise Edition 64-bit 786.646 tpmC Benchmark SAP Windows 2000 DataCenter Edition e SQL Server 2000 Enterprise Edition 26.000 utenti concorrenti Appendice © 2003-2004 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary. SQL Injection Un intruso può devastare il db ... string strSql = "Select * from authors where au_lname like '" + TextBox1.Text + "'"; SqlCommand cmd = new SqlCommand(strSql, Cnn); SqlDataReader dr = cmd.ExecuteReader(); Select * from authors where au_lname like ' ' Prima query ; drop authors -- ' Seconda query Scartato SQL Injection ... usare i parameters!!! ... I Parameters incrementano anche le performance: non c'è conversione da string a tipo sul db la query rimane compilata e preparata sul db server string strSql = "Select * from authors where au_lname like @au_lname"; SqlCommand cmd = new SqlCommand(strSql, Cnn); cmd.Parameters.Add("@au_lname", SqlDbType.VarChar,40); SqlDataReader dr = cmd.ExecuteReader(); exec sp_executesql N'Select * from authors where au_lname like @au_lname', N'@au_lname varchar(40)', @au_lname = ' ' ' ; drop authors - - ' apice raddoppiato da ADO.NET Gli apici non sono l'unico problema: select * from titles where royalty = 0 ; drop authors Autenticazione in SQL Server 2000 Verifica la che esista il SID nella tabella sysxlogins; Windows 2000 ha già verificato la password al logon Windows 2000 Group or User sysxlogins Windows 2000 Se non uso SSL o MultiProtocol encryption tutto passa in chiaro SQL Server Verifica che login e pwd esistano In sysxlogins SQL Server Login Account sysxlogins Autorizzazione in SQL Server 2000 Northwind..sysprotects Qui si trovano i permessi sugli oggetti id uid action protecttype 1977058079 1977058079 1977058079 1977058079 0 0 0 7 193 195 196 193 205 205 205 205 Qui vengono mappate le login nel DB Northwind..sysusers uid name 0 1 3 7 public dbo INFORMATION_SCHEMA payroll Kerberos e Delegation Kerberos è un protocollo di autenticazione supportato in Windows Server 2003 Necessario per supportare la delegation Molto più sicuro di NTLM La capacità di far fare alle credenziali di un client più hop di rete Windows 2003 può limitare l'uso di delegation applicazione per applicazione Client EUROPE \ raffaele Server1 Server2 A Server2 arriva MIESTAFF\raffaele Kerberos e SQL Server Supporto al modello di autenticazione di Win2K, Kerberos: Durante la fase di logon SQL esegue una richiesta di validazione tramite SSPI (security integrata) Per tutte le connessioni con linked server vengono utilizzate le vere credenziali del client Deve essere un dominio nativo Win2000 con AD Gli account devono essere settati per supportare la delegation Il server deve essere settato in AD per supportare la delegation Occorre registrare in AD il Service Principal Name per l’utente con il quale gira SQL Server Utilizzare l’utility setspn nel ResourceKit di W2K Network Security Occorre configurare il certificato utilizzando Internet Explorer O l’applet di gestione dei certificati Attenzione al nome DNS fully-qualified durante la richiesta del certificato Per criptare le comunicazioni client/server basta settare la checkbox nella client network utility e nella server network utility Se il certificato non è trusted dal client la connessione fallisce [Microsoft][ODBC SQL Server Driver][DBNETLIB]Encryption not supported on SQL Server Auditing È possibile attivare l’auditing attraverso una stored procedure create proc p_audittrace with encryption as Exec sp_trace_create @traceid output, 2, n‘d:\temp\mytrace.trc’, 500 Aggiungere gli eventi che interessa catturare sp_trace_setevent @traceid, @eventid,@columnid, @on Ed eventualmente farle partire in autostart insieme a SQL Server Exec sp_procoption ‘p_audittrace’, ‘startup’, ‘on’ Extended Stored Procedure Queste ad esempio consentono di eseguire query nel contesto di sicurezza del servizio xp_execresultset, xp_printstatements, xp_displayparamstmt Eventualmente, rimuovere quelle che non servono Il rischio è di perdere alcune funzionalità ad esempio nei tool di amministrazione Testare prima su una macchina non di produzione Security Best Practices -- Chiunque può creare il job EXEC sp_add_job @job_name = 'GetSystemOnSQL', @enabled = 1, @description = ‘', @delete_level = 1 -- Chiamo un extended SP che ha un buco di sicurezza EXEC sp_add_jobstep @job_name = 'GetSystemOnSQL', @step_name = 'Exec my sql', @subsystem = 'TSQL', @command = 'exec master..xp_execresultset N''select ''''exec master..xp_cmdshell "dir > c:\agent-jobresults.txt"'''''',N''Master''' EXEC sp_add_jobserver @job_name = 'GetSystemOnSQL', @server_name = 'SERVER_NAME' -- Eseguo il job e il gioco è fatto EXEC sp_start_job @job_name = 'GetSystemOnSQL' Security Best Practices Replication Su un distributor è possibile eseguire privilege escalation attraverso la SP sp_MScopyscript che di default è accessibile al ruolo public Internamente richiama xp_cmdshell per eseguire la copia di un file di script sui subscribers, ma anche di eseguire comandi di sistema operativo Es. creare un utente e farlo diventare Administrator Configurare il servizio con un account che non abbia privilegi amministrativi e sulla rete (può essere utile anche per i backup schedulati) Security Best Practices -- Il codice interno alla SP select @cmd = N'copy "' + @scriptfile + N'" "' + @directory + N'"' exec @retcode = master..xp_cmdshell @cmd, NO_OUTPUT -- Utilizzo non proprio ‘legale’ della SP use master declare @cmd nvarchar(4000) exec sp_MScopyscriptfile N'c:\autoexec.bat" c:\cp.txt&echo hello > c:\ccc.bbb & echo "hello',@cmd OUTPUT print @cmd Eseguire SQL dinamico Il codice SQL eseguito internamente ad una stored proc viene eseguito nel contesto di sicurezza dell’esecutore e non dell’owner Protegge da tentativi di eseguire operazioni non permesse Es. Create proc myproc @p1 nvarchar(500) as Exec (@p1) return 0 Exec myproc “sp_addlogin ‘raffaele’ exec sp_addsrvrolemember ‘raffaele’,’sysadmin’” e io sarei sysadmin… Meta Data Obfuscation Capacità di poter nascondere cifrandole: Non è possibile utilizzarla per altri scopi Stored procedure Trigger View Es. dati Previene la copia delle logiche applicative Sviluppo e security SQL Injection consente all’instruso di Fare seri danni ai dati Sfruttare altre vulnerabilità per ottenere privilegi più elevati Creare nuovi utenti nel server Ottenere l’accesso a dati protetti Modificare o cancellare oggetti nel database Se l’account con il quale viene eseguito il servizio SQL Server ha privilegi amministrativi sul server L’intruso li può acquisire ed utilizzare il server come base per altri attacchi Security Best Practices SQLXML [Q321911] Sono possibili due tipi di attacchi Buffer overrun sulla estensione ISAPI Script injection attraverso un tag XML che consente l’esecuzione di codice durante una trasformazione XSLT Disabilitare la possibilità di eseguire query dirette via HTTP (di default è così) Utilizzare piuttosto la tecnica dei template XML per eseguire l’accesso ai dati