Funzionalità di protezione di Microsoft
SQL Server 2000
Autori: Richard Waymire e Ben Thomas
Abstract: questo documento presenta ad amministratori e sviluppatori di Microsoft ®
SQL Server™ le nuove funzionalità di protezione di SQL Server 2000. Oltre a
introdurre le nuove caratteristiche, vengono illustrate in dettaglio le migliori modalità
di implementazione della sicurezza in domini Microsoft Windows®, con il supporto di
esempi di codice sorgente.
Le informazioni contenute in questo documento rappresentano l’attuale posizione
di Microsoft Corporation nei confronti dei problemi discussi al momento della
pubblicazione del documento. Per la necessità da parte di Microsoft di rispondere
alle mutevoli condizioni del mercato, le informazioni fornite non impegnano in alcun
modo Microsoft, che non garantisce l’accuratezza delle informazioni presentate dopo
la data di pubblicazione.
Questo documento è esclusivamente per scopi informativi. MICROSOFT ESCLUDE
OGNI GARANZIA ESPRESSA O IMPLICITA IN QUESTO DOCUMENTO.
Il rispetto di tutte le leggi in vigore in materia di copyright è responsabilità esclusiva
dell’utente. Senza alcun limite per i diritti coperti da copyright, nessuna parte di
questo documento può essere riprodotta in qualsiasi forma o mezzo elettronico o
meccanico, per alcun uso, senza il permesso scritto di Microsoft Corporation.
Microsoft può essere titolare di brevetti, domande di brevetto, marchi, copyright o
altri diritti di proprietà intellettuale relativi all’oggetto del presente documento. Salvo
quanto espressamente previsto in un contratto scritto di licenza Microsoft, la
consegna del presente documento non implica la concessione di alcuna licenza su tali
brevetti, marchi, copyright o altra proprietà intellettuale.
©
2000 Microsoft Corporation. Tutti i diritti riservati.
Active Directory, Microsoft, Microsoft Press, MDSN, Visual Basic, Visual C++, Win32,
Windows, Windows 2000, Windows Me e Windows NT sono marchi o marchi registrati
di Microsoft Corporation negli Stati Uniti e/o negli altri paesi.
Altri nomi di prodotti e società citati nel presente documento possono essere marchi
dei rispettivi proprietari.
Microsoft è un marchio registrato di Microsoft Corporation negli Stati Uniti e/o negli
altri paesi.
Gli altri marchi e nomi commerciali menzionali del presente documento appartengono
ai rispettivi proprietari.
Sommario
Funzionalità di protezione di Microsoft SQL Server 2000
Introduzione
Presupposti
Nuove funzionalità di protezione di SQL Server 2000
Installazione protetta
Completamento della valutazione per la certificazione di sicurezza C2
Autenticazione Kerberos e delega in ambiente Windows 2000
Controllo della sicurezza
Controlli previsti dallo standard C2
Eliminazione dell’account delegato SQLAgentCmdExec
Miglioramento dei ruoli del server
Crittografia
Crittografia di rete con SSL/TLS
Supporto per la crittografia del file system in Windows 2000
Crittografia avanzata basata sul server
Crittografia dei pacchetti DTS
Protezione tramite password
Backup e gruppi di supporti di backup
SQL Server Enterprise Manager
Modifica dell’account del servizio con SQL Server Enterprise Manager
Eliminazione della colonna SUID in tutte le tabelle di sistema
Modello di protezione di SQL Server 2000
Modalità di autenticazione
Utilizzo interno degli identificativi di protezione (SID)
Ruoli
Ruolo public
Ruoli predefiniti
Ruoli definiti dall’utente
Ruoli applicazione
Protezione dell’accesso al server
Protezione dell’accesso ai database
Ruoli del database definiti dall’utente
Sistema di autorizzazioni
Concessione e negazione delle autorizzazioni a utenti e ruoli
Catene di proprietà
Implementazione della protezione a livello di server
Utilizzo di identificatori di protezione (SID)
Eliminazione dei SUID (Server User ID)
Generazione di GUID per utenti non trusted
Ridenominazione di account di Windows relativi a utenti o gruppi
Tabella di sistema sysxlogins
1
3
4
5
5
6
6
7
8
8
9
9
9
10
10
11
11
11
11
11
12
13
15
16
16
16
17
19
19
22
26
27
29
30
32
34
34
34
35
35
36
i
Implementazione della protezione a livello di oggetto
Controllo delle autorizzazioni
Costo della modifica delle autorizzazioni
Ridenominazione di account di Windows relativi a utenti o gruppi
Rimozione della tabella di sistema sysprocedures
Opzione WITH GRANT
Tabella di sistema sysusers
Tabella di sistema sysmembers
Tabella di sistema syspermissions
Tabella di sistema sysprotects
Autorizzazioni Named Pipes e Multiprotocol
Aggiornamento da SQL Server 7.0
Aggiornamento da SQL Server 6.5
Processo di aggiornamento
Analisi dell’output del processo di aggiornamento
Preparazione dell’ambiente di protezione di SQL Server 6.5
Protezione dell’installazione di SQL Server 2000
Account di servizio
File system
Registro di sistema
Controllo
Profiling per il controllo
Backup e ripristino
Protezione di file e supporti di backup
Ripristino in un altro server
Autenticazione di Windows (ripristino all’interno dello stesso dominio)
Autenticazione di Windows (ripristino all’interno di un altro dominio)
Connessione e disconnessione di file di database
Configurazione generali della protezione di Windows
Conclusioni
Appendice A: Ulteriori informazioni
39
39
40
40
41
41
42
42
43
43
44
45
45
45
46
47
49
50
52
52
53
53
54
54
54
55
55
56
56
57
58
ii
Introduzione
Questo documento presenta ad amministratori e sviluppatori di Microsoft ® SQL Server™
le nuove funzionalità di protezione di SQL Server 2000. Oltre a introdurre le nuove
caratteristiche, sono discusse in dettaglio le migliori modalità di implementazione della
sicurezza in domini Microsoft Windows®, con il supporto di esempi di codice sorgente.
Poiché non è tuttavia prevista una descrizione dettagliata dell’interfaccia utente,
l’implementazione della sicurezza da questo punto di vista non rientra nello scopo
del presente documento.
Per gli utenti che desiderano eseguire l’aggiornamento di server da SQL Server
versione 7.0 o precedente, vengono fornite informazioni relative all’aggiornamento
della protezione, oltre a note relative alle modalità di gestione della protezione in
SQL Server 6.5 e versioni precedenti.
Anche se molti sviluppatori e amministratori hanno implementato un’architettura di
protezione già in SQL Server 7.0 e versioni precedenti, i più esperti in questo campo
erano consapevoli del fatto che i miglioramenti a livello di sicurezza avrebbero potuto
essere applicati solo come patch finché non fosse stata possibile un’integrazione più
completa. SQL Server 2000 parte dalle funzionalità di protezione di SQL Server 7.0
per fornire una soluzione di sicurezza più efficace di quella offerta con SQL Server 6.5
e versioni precedenti.
3
Presupposti
Il sistema di sicurezza di Microsoft SQL Server 2000 si basa sul modello di protezione
di Microsoft Windows NT® 4.0 e Windows 2000; il presente documento presuppone
quindi una buona conoscenza dell’architettura di protezione di questi due sistemi
operativi, oltre a una discreta familiarità con i concetti di dominio, gruppo globale
e account utente nel contesto di protezione di Windows NT 4.0, nonché nell’ambito
di Microsoft Active Directory™ in Windows 2000.
La conoscenza del sistema di sicurezza di SQL Server 6.x, anche se utile, non è
necessaria per la comprensione della maggior parte delle informazioni contenute
in questo documento, a eccezione della sezione “Aggiornamento da SQL Server 6.5”,
che illustra come in SQL Server 2000 siano stati eliminati i problemi di protezione
di SQL Server 6.5.
Per una comprensione approfondita dei concetti espressi nella sezione “Utilizzo interno
degli identificativi di protezione (SID)”, è necessario possedere una discreta conoscenza
delle tabelle di sistema di SQL Server 7.0 e versioni precedenti.
Per gli utenti interessati, vengono forniti alcuni esempi di codice Microsoft Visual Basic
e SQL (Structured Query Language) che favoriscono la comprensione dell’argomento.
Anche l’eventuale esperienza maturata nell’utilizzo del modello di oggetti SQL-DMO
(Distributed Management Objects) costituisce un vantaggio significativo, sebbene
anche gli utenti con una conoscenza limitata di Windows NT 4.0, Windows 2000 o SQL
Server potranno ottenere informazioni utili sui meccanismi di sicurezza di questi
prodotti. Tali informazioni sono concentrate soprattutto nelle sezioni “Nuove funzionalità
di protezione di SQL Server 2000” e “Modello di protezione di SQL Server 2000”.
4
Nuove funzionalità di protezione
di SQL Server 2000
Nella prima parte di questo documento vengono esaminate le funzionalità di protezione
di SQL Server 2000 e viene fornita una panoramica dei miglioramenti in termini di
sicurezza apportati a questa versione.
Installazione protetta
In SQL Server 2000 la sicurezza è integrata fin dal momento dell’installazione.
Quando si esegue il programma di installazione di qualsiasi versione di SQL Server
(ad eccezione di Microsoft SQL Server Desktop Engine), viene visualizzata la finestra
di dialogo illustrata nella figura 1.
Figura 1: durante l’installazione di SQL Server 2000, nella finestra per la scelta della modalità
di autenticazione è selezionata per impostazione predefinita l’autenticazione di Windows.
Questa finestra consente di selezionare la modalità di autenticazione per SQL Server
2000.1 Per impostazione predefinita è impostata l’autenticazione di Windows, che
è più sicura della modalità mista. Se si sceglie la modalità mista, è necessario
impostare la password di accesso a SQL Server per l’amministratore di sistema (sa).
È anche possibile impostare l’autenticazione senza password, ma non è consigliabile
perché rende il sistema vulnerabile a eventuali attacchi.
Nota: in SQL Server versione 7.0 e versioni precedenti, per impostazione predefinita
veniva utilizzata la modalità di autenticazione mista e senza password sa.
Per informazioni sulle modalità di protezione disponibili, vedere la sezione
del presente documento dedicata alle modalità di autenticazione.
1
5
Quando si installa SQL Server in un computer Windows NT 4.0 o Windows 2000
che utilizza il file system NTFS, le directory di destinazione dell’installazione vengono
protette in modo da limitare l’accesso ai soli account impostati per i servizi di SQL
Server e al gruppo di amministratori predefinito. Per impostazione predefinita,
l’applicazione viene installata nella directory C:\Programmi\Microsoft SQL
Server\MSSql. Durante installazione di SQL Server vengono protette in questo modo
anche le chiavi di registro di SQL Server, HKLM\Software\Microsoft\MSSQLServer
o HKLM\Software\Microsoft\Microsoft SQL Server\MSSQL$NomeIstanza, per le istanze
denominate, e le relative sottochiavi.
Installazione di Microsoft SQL Server 2000 Desktop Engine
Per impostazione predefinita nei sistemi operativi Windows NT 4.0 e Windows 2000
il programma di installazione di Microsoft SQL Server 2000 Desktop Engine utilizza
la modalità di autenticazione di Windows, mentre nei sistemi operativi Windows 98
e Windows Millennium (Windows ME), dove questo tipo di autenticazione non è
disponibile, viene utilizzata la modalità mista. Per specificare la modalità mista come
opzione di installazione predefinita, è necessario utilizzare l’opzione
SECURITYMODE=SQL quando si esegue l’installazione dalla riga di comando o nel file
INI, secondo quanto documentato nella sezione della documentazione in linea di SQL
Server 2000 dedicata all’installazione di SQL Server 2000 Desktop Engine.
Secondo quanto riportato nel file readme.txt di SQL Server 2000, nelle sezioni della
documentazione in linea dedicate all’installazione di SQL Server 2000 Desktop Engine
e all’integrazione di quest’ultimo in Windows Installer sono documentati due parametri
che vengono ignorati dalla versione finale del programma di installazione di Desktop
Engine: USEDEFAULTSAPWD e SAPASSWORD.
Pertanto, in un’installazione di Desktop Engine configurata per l’autenticazione
in modalità mista la password sa è sempre assente e deve essere impostata
immediatamente al termine dell’installazione.
Completamento della valutazione
per la certificazione di sicurezza C2
La valutazione di SQL Server 2000 è stata completata e, con la configurazione
esaminata dal Governo degli Stati Uniti, l’applicazione è risultata conforme ai requisiti
per la certificazione di sicurezza C2. Per informazioni sulla configurazione da adottare
per ottenere un sistema conforme allo standard C2, visitare il sito
www.microsoft.com/technet/treeview/default.asp?url=/technet/security/news/c2eval.asp.
All’indirizzo www.radium.ncsc.mil/tpep/epl/entries/TTAP-CSC-EPL-00-001.html
è invece disponibile un annuncio sulla certificazione C2.
Autenticazione Kerberos e delega
in ambiente Windows 2000
Kerberos è il principale meccanismo di autenticazione utilizzato nelle reti Windows
2000. La delega consente invece di trasmettere attraverso più computer e applicazioni
le credenziali di protezione dell’utente, che vengono mantenute a ogni “hop” da un
computer all’altro. SQL Server 2000 include il supporto completo per Kerberos,
compresa la capacità di accettare ticket Kerberos delegati, nonché di delegare tali
ticket (in ambiente Microsoft Windows 2000) attraverso i domain controller Windows
2000 e Active Directory. Tutto questo influisce sul funzionamento delle stored
procedure remote e delle query distribuite.
6
Per ulteriori informazioni su Kerberos e sulla protezione di Windows 2000, visitare
il sito www.microsoft.com/italy/windows2000/technologies/security/default.asp
e leggere i documenti tecnici dedicati a tali argomenti.
Per configurare la delega, è necessario che tutti i server con i quali viene stabilita
la connessione eseguano Microsoft Windows 2000 con il supporto Kerberos attivato
e utilizzino Active Directory.
Per utilizzare la delega, è necessario impostare le seguenti opzioni in Active Directory:

L’account è sensibile e non può essere delegato. Non selezionare questa
opzione per l’utente che richiede la delega.

L’account è trusted per delega. Selezionare questa opzione per l’account
di servizio di SQL Server.

Il computer è trusted per delega. Selezionare questa opzione per il server
che esegue l’istanza di Microsoft SQL Server.
Affinché sia possibile eseguire la delega degli account di protezione, l’amministratore
del dominio dell’account di Windows 2000 deve assegnare a SQL Server un nome
principale di servizio (SPN). Il nome SPN deve essere assegnato all’account del servizio
di SQL Server nel computer utilizzato. La delega esegue l’autenticazione reciproca e il
nome SPN garantisce che SQL Server è stato verificato nel server specifico, all’indirizzo
socket specifico, da parte dell’amministratore del dominio dell’account di Windows
2000. Il nome SPN per SQL Server può essere definito dall’amministratore del dominio.
Per ulteriori informazioni sull’utilità setspn, vedere
il Resource Kit di Windows 2000.
Per creare un nome SPN per SQL Server 2000
Immettere il seguente comando:
setspn -A MSSQLSvc/Host:porta accountservizio
Ad esempio:
setspn -A MSSQLSvc/server1.redmond.microsoft.com accountsql
Per il corretto funzionamento della delega, è necessario utilizzare la libreria di rete
TCP/IP Sockets. Non è possibile utilizzare la libreria Named Pipes, poiché il nome SPN
fa riferimento a un particolare socket TCP/IP. Se vengono utilizzate più porte, è
necessario impostare un nome SPN per ogni porta.
È possibile attivare la delega anche nell’ambito dell’account LocalSystem. SQL Server
2000 si registra automaticamente all’avvio del servizio, registrando automaticamente
anche il nome SPN. Questo metodo è più semplice rispetto all’attivazione della delega
tramite un account utente di dominio. Se tuttavia SQL Server 2000 viene arrestato,
la registrazione dei nomi SPN per l’account LocalSystem viene annullata.
Controllo della sicurezza
La disponibilità di una funzione di controllo della sicurezza è uno dei requisiti imposti
dal Governo degli Stati Uniti per la certificazione C2. In SQL Server 2000 è integrato un
meccanismo di controllo dotato di funzionalità complete, costituito da più componenti
che verranno descritti di seguito. Insieme, questi componenti consentono di tenere
traccia di qualsiasi utilizzo delle autorizzazioni effettuato nell’ambito di SQL Server 2000.
7
SQL Trace
SQL Trace è il nome attribuito ai componenti lato server del meccanismo di controllo.
Le funzioni di controllo sono state aggiunte allo stesso meccanismo utilizzato in SQL
Server 7.0 per ottenere informazioni sulle prestazioni di SQL Server. Le informazioni
sulle prestazioni vengono fornite anche nella nuova versione, oltre alle informazioni di
controllo, anche se in SQL Server 2000 l’interfaccia è stata completamente ridisegnata
e tutte le stored procedure estese di SQL Server 7.0 sono state sostituite.
Per informazioni sulle nuove stored procedure utilizzate per il controllo della sicurezza,
fare riferimento alla documentazione in linea di SQL Server 2000.
Ogni volta che nel motore relazionale o di archiviazione di SQL Server si verifica
un evento di sicurezza da controllare, viene inviata una notifica al motore di gestione
degli eventi (SQL Trace) e, se la traccia per l’acquisizione dell’evento generato
è attivata e in esecuzione, tale evento viene scritto nel file di traccia appropriato.
Per informazioni sull’attivazione della funzione di traccia per i normali controlli di
sicurezza e per i controlli richiesti dalla specifica C2, fare riferimento alla documentazione
in linea di SQL Server 2000.
SQL Profiler
SQL Profiler è un’utilità con interfaccia grafica che consente di visualizzare i file della
traccia di controllo e di eseguire azioni specifiche come ricerche all’interno dei file,
salvataggio dei file in una tabella e creazione e configurazione delle definizioni della
traccia tramite l’interfaccia utente. Poiché SQL Profiler è un componente client di SQL
Trace, è possibile eseguire controlli di sicurezza anche quando tale componente non
è in esecuzione.
Controlli previsti dallo standard C2
SQL Server 2000 ha ottenuto la certificazione di compatibilità con lo standard C2.
La configurazione collaudata per C2 prevede l’attivazione di un meccanismo di controllo
di livello C2, che definisce i tipi di eventi da controllare (tutti gli eventi legati alla
sicurezza), le colonne di dati da acquisire (tutte quelle che possono contenere
informazioni relative a tali eventi) e altre impostazioni prestabilite.
Ciascuna impostazione è documentata nella documentazione in linea di SQL Server
2000 e in Trusted Facilities Manual for SQL Server 2000, disponibili all’indirizzo
www.microsoft.com/Downloads/release.asp?ReleaseID=25503.
Eliminazione dell’account delegato
SQLAgentCmdExec
In SQL Server 2000 non viene più creato l’account SQLAgentCmdExec. In SQL Server
versione 7.0 e precedenti, i processi dell’Agente SQL Server di proprietà degli account
di accesso senza privilegi di amministratore di sistema potevano accedere alle risorse
di Windows solo utilizzando l’account delegato SQLAgentCmdExec, un account utente di
Windows NT 4.0 e Windows 2000 creato localmente durante l’installazione di SQL Server.
Nella nuova versione, gli utenti senza privilegi di amministratore di sistema non
possono accedere alle risorse esterne a SQL Server per impostazione predefinita.
Tuttavia, quando si attiva un account proxy per SQL Server 2000 è possibile specificare
un account utente di dominio che consente agli utenti senza privilegi di amministratore
di sistema di accedere alle risorse della rete, anziché solo alle risorse locali del
computer in cui è installato SQL Server.
8
Miglioramento dei ruoli del server
Sono stati apportati alcuni piccoli miglioramenti anche ai ruoli predefiniti del server
inclusi in SQL Server 2000. Per informazioni su tali ruoli, vedere la sezione “Ruoli
predefiniti” del presente documento.
BulkAdmin
BulkAdmin è un nuovo ruolo di SQL Server 2000, che consente agli account membri
di eseguire il comando BULK INSERT. Gli utenti di questo gruppo possono caricare dati
da qualsiasi file disponibile in rete e da qualsiasi computer che esegue il server ed è
accessibile mediante l’account del servizio di SQL Server. L’appartenenza deve essere
impostata con estrema attenzione. I membri di questo ruolo devono infatti disporre
dell’autorizzazione INSERT per tutte le tabelle utilizzate come destinazione del comando
BULK INSERT. L’appartenenza a questo ruolo predefinito del server autorizza
unicamente a eseguire l’istruzione BULK INSERT e ad accedere ai file necessari per
l’esecuzione di tale comando.
SecurityAdmin
Il ruolo SecurityAdmin è autorizzato a modificare le password degli account di accesso
per la modalità di autenticazione di SQL Server, che non possono essere reimpostate
dai membri del ruolo predefinito sysadmin. Questo ruolo può essere ad esempio
utilizzato per il personale dell’help-desk, che non necessita dell’accesso amministrativo
completo a SQL Server.
ServerAdmin
L’area dei messaggi a livello di server del ruolo ServerAdmin è stata modificata.
L’appartenenza a questo ruolo consente ora di eseguire sp_addmessage,
sp_dropmessage e sp_altermessage.
Crittografia
Crittografia di rete con SSL/TLS
SQL Server 2000 supporta automaticamente la crittografia dei dati e del traffico di rete
tra i sistemi client e server di una rete. Il livello di crittografia dipende dalle capacità
specificate nel certificato installato per SQL Server e dalle funzionalità di crittografia
del client e del server.
Il certificato selezionato per SQL Server deve essere associato al nome del server,
che deve essere costituito da un nome di server DNS completo, come
SQLServer.Redmond.corp.Microsoft.com. Il certificato deve consentire l’autenticazione
del server. È necessario effettuare l’accesso a SQL Server con l’account del servizio di
SQL Server, richiedere il certificato (a un’autorità di certificazione interna o a
un’autorità attendibile indipendente come Verisign), quindi installare il certificato nel
percorso del server suggerito al momento dell’importazione del certificato.
9
Crittografia dei pacchetti di accesso
Durante tutti i tentativi di accesso, se nel server è presente un certificato utilizzabile,
valido per l’autenticazione del server e con nome oggetto uguale al nome DNS del
computer, tutti i pacchetti scambiati durante l’accesso vengono crittografati.
Questa operazione viene eseguita automaticamente e non richiede particolari
operazioni di configurazione del server, oltre all’installazione del certificato.
Crittografia richiesta dal client
Il client può richiedere la crittografia di tutto il traffico di dati diretto a SQL Server.
Questa opzione, che può essere impostata mediante l’utilità Configurazione di rete
client (Imponi crittografia protocolli), viene applicata a tutte le connessioni in uscita
dal computer client. La richiesta di crittografia da parte del client impedisce inoltre
l’accesso a SQL Server 7.0 e versioni precedenti e a qualsiasi computer SQL Server
2000 che non disponga di un certificato valido.
Questa impostazione può essere configurata anche a livello di programmazione,
inserendo l’opzione “Encrypt=yes” nella stringa di connessione OLE DB o ODBC per
il server di database.
Crittografia richiesta dal server
La crittografia dei dati può essere applicata anche sul server, se l’amministratore del
database lo richiede. Questa opzione, che può essere impostata mediante l’utilità
Configurazione di rete di SQL Server (Imponi crittografia protocolli), assicura la
crittografia di tutto il traffico di rete diretto a SQL Server. Se un client non è in grado
di negoziare la crittografia con SQL Server, la connessione viene chiusa.
Supporto per la crittografia del file system
in Windows 2000
SQL Server 2000 protegge i file di dati utilizzando in modo appropriato il supporto
per la crittografia del file system integrata in Windows 2000. Per crittografare i file
è necessario utilizzare l’account del servizio di SQL Server.
Per cambiare l’account del servizio, occorre decrittografare i file, cambiare l’account
per i servizi di SQL Server, quindi crittografare nuovamente i file utilizzando il nuovo
account del servizio. Se non si procede in questo modo, potrebbe risultare impossibile
avviare SQL Server, perché l’applicazione non è in grado di decrittografare i file
crittografati con le credenziali dell’account del servizio utilizzato in precedenza.
Crittografia avanzata basata sul server
Nell’ambito di una revisione completa dell’uso della crittografia nei prodotti Microsoft,
per tutti i dati crittografati basati sul server (password, stored procedure crittografate
e così via) verrà utilizzata l’API di crittografia di Windows, CryptoAPI, che assicura una
maggiore affidabilità e sicurezza nell’archiviazione degli elementi protetti in SQL Server.
10
Crittografia dei pacchetti DTS
Nella nuova versione i pacchetti DTS (Data Transformation Services) vengono
crittografati mediante CryptoAPI.
Se in SQL Server 7.0 si specifica una password per un pacchetto DTS, quest’ultimo
viene crittografato utilizzando la password come chiave. Se non si specifica alcuna
password, il pacchetto non viene protetto. In SQL Server 2000 tutti i pacchetti vengono
crittografati anche se non viene fornita alcuna password.
Protezione tramite password
Backup e gruppi di supporti di backup
SQL Server 2000 consente di specificare una password per un singolo backup o per
un gruppo di supporti di backup. Poiché senza tale password non è possibile ripristinare
i dati di backup, in questo modo è possibile proteggersi dal ripristino non autorizzato
delle copie di backup.
Tuttavia, dal momento che i dati non vengono crittografati, un programma che non
supporti il formato MTF (Microsoft Tape Format) può ignorare la password e consentire
l’accesso ai dati contenuti nel supporto di backup. Tutti i meccanismi di ripristino di
SQL Server prevedono invece l’utilizzo della password.
SQL Server Enterprise Manager
Mentre in SQL Server 7.0 le password per l’accesso autenticato venivano memorizzate
in un formato non protetto nel Registro di sistema del computer client, in SQL Server
2000 tali password vengono crittografate con CryptoAPI.
Modifica dell’account del servizio con
SQL Server Enterprise Manager
Quando si utilizza SQL Server Enterprise Manager per modificare gli account dei
servizi di SQL Server (SQL Server o Agente SQL Server), vengono reimpostate sia
le autorizzazioni relative a file e directory, se i dati sono archiviati nel file system NTFS,
sia le autorizzazioni relative alle chiavi di registro. Le nuove autorizzazioni vengono
aggiunte, mentre l’account del servizio precedente e il gruppo Administrators predefinito
vengono mantenuti. La password viene reimpostata nel database dei servizi, come
avviene quando si reimpostano le informazioni di un account mediante l’utilità Servizi
del Pannello di controllo, e all’account del servizio selezionato vengono concesse le
autorizzazioni di protezione appropriate di Windows NT o Windows 2000. Infine, il
nuovo account di servizio viene aggiunto al ruolo predefinito sysadmin di SQL Server.
11
Eliminazione della colonna SUID in tutte
le tabelle di sistema
Nelle versioni precedenti di SQL Server, la colonna SUID era presente nelle seguenti
tabelle di sistema:

Sysdatabases

Syslogins

Sysremotelogins

Sysusers

Sysprocesses

Sysalternates
In SQL Server 7.0 questa colonna non veniva tuttavia utilizzata, poiché è stata
sostituita dalla colonna SID, ma è stata mantenuta per assicurare la compatibilità con
le versioni precedenti. Per evitare confusione, nella nuova versione questa colonna è
stata rimossa ed è stata eliminata anche la tabella sysalternates, poiché conteneva
solo le relazioni tra i SUID.
12
Modello di protezione di SQL Server 2000
Per implementare la sicurezza in SQL Server 2000 con la massima efficienza, è
importante comprendere come è stato implementato il modello di protezione dal team
di progettazione. Gli utenti che hanno familiarità con la protezione di Windows
avranno senz’altro compreso come l’utilizzo degli utenti e dei gruppi di Windows
possa accrescere le potenzialità di SQL Server 2000.
In SQL Server 2000 la protezione dovrebbe essere implementata come illustrato
nella figura 2.
Dominio trusted
Utente
Utente
Dominio trusted
Utente
Utente
Utente

Dominio trusted
Utente
Utente
Utente

Utente
Utente
Utente

Gruppo glob ale
Gruppo glob ale
Dominio trusted
Utente

Gruppo glob ale
Gruppo glob ale
Dominio
SQL Server
Database
$ $
$
DB
Utente
Utente

Oggetto
Utente
Ruolo

Database



DB
Oggetto
Gruppo locale
Gruppo glob ale
Figura 2: il modello basato sugli utenti e sui gruppi di Windows offre agli amministratori
di SQL Server uno strumento di protezione potente e flessibile.
Nel diagramma sono illustrati i seguenti passaggi:
1. Nei singoli domini gli utenti vengono assegnati ai gruppi globali di Windows.
2. I gruppi globali di Windows dei diversi domini vengono inseriti nel gruppo locale
di Windows.
3. Al gruppo locale di Windows vengono assegnati i diritti di accesso a SQL Server 2000.
13
4. Al gruppo locale di Windows vengono assegnati i diritti di accesso ai database
appropriati. Tale gruppo locale di Windows deve essere diverso da quello utilizzato
per concedere i diritti di accesso nel passaggio 3. I passaggi 1 e 2 vengono pertanto
ripetuti di frequente per raggruppare gli utenti in base alle autorizzazioni di accesso
necessarie.
5. Al gruppo locale di Windows vengono assegnate le autorizzazioni relative a oggetti
specifici del database.
È anche possibile adottare un approccio alternativo alla protezione, basato sull’uso dei
ruoli e in genere implementato come illustrato nella figura 3.
Dominio trusted
Utente
Utente
Dominio trusted
Utente
Utente
Utente

Dominio trusted
Utente
Utente

Gruppo glob ale
Utente
Dominio trusted
Utente
Utente
Utente

Gruppo glob ale
Utente

Gruppo glob ale
Gruppo glob ale
Dominio
SQL Server
Database
$ $
$

DB
Utente
Utente

Oggetto
Utente


 Ruolo

Database
DB
Oggetto
Gruppo locale
Gruppo glob ale
Figura 3: in alternativa, in SQL Server 2000 è possibile utilizzare la protezione basata sui ruoli.
Se si sceglie di utilizzare i ruoli per assegnare le autorizzazioni relative agli oggetti,
le autorizzazioni relative al server e al database devono essere comunque assegnate
agli utenti utilizzando l’approccio consigliato.
Nei due diagrammi i passaggi da 1 a 4 sono identici, anche se nel secondo non
verranno probabilmente creati più gruppi locali e globali di Windows. Sono
completamente supportati anche i gruppi universali di Windows 2000.
Fase 5: assegnazione di singoli account e gruppi di Windows a un ruolo.
Fase 6: assegnazione delle autorizzazioni relative agli oggetti ai ruoli.
Poiché quando si utilizzano i ruoli gli utenti vengono raggruppati in SQL Server 2000,
l’esigenza di creare gruppi di utenti in Windows è più limitata.
14
Modalità di autenticazione
In Microsoft SQL Server 2000 sono disponibili due modalità di autenticazione per
proteggere l’accesso al server: l’autenticazione di Windows e la modalità mista.
Nota: la modalità di autenticazione standard, presente in SQL Server 6.5, è stata
eliminata in SQL Server 7.0.
Autenticazione di Windows
L’autenticazione di Windows è la modalità di autenticazione predefinita di SQL Server 2000.
Se si sceglie questa modalità, SQL Server 2000 si basa esclusivamente sull’autenticazione
di Windows e consente l’accesso a tutti gli utenti e i gruppi di Windows.
L’autenticazione di Windows consente a SQL Server 2000 di autenticare gli utenti
basandosi sul sistema Windows, come fanno anche altre applicazioni. Le connessioni
stabilite con il server utilizzando questa modalità di autenticazione sono dette
connessioni trusted.
Quando viene utilizzata l’autenticazione di Windows, l’amministratore del database
concede il diritto di accesso a SQL Server 2000 agli utenti che accedono al computer
che esegue SQL Server. Per tenere traccia degli accessi autenticati da Windows
vengono utilizzati gli identificativi di protezione (SID, Security Identifier). Servendosi
dei SID di Windows, l’amministratore del database può concedere l’accesso
direttamente agli utenti e ai gruppi di Windows.
Modalità mista
Se è impostata la modalità mista, gli utenti possono essere autenticati mediante
l’autenticazione di Windows o l’autenticazione di SQL Server. Le coppie nome
utente/password degli utenti autenticati da SQL Server vengono gestite all’interno
di SQL Server.2
In SQL Server 2000, la modalità mista prevede l’uso dell’autenticazione di Windows
quando il client e il server supportano l’utilizzo di NTLM 3 o i protocolli Kerberos per
l’autenticazione di accesso. Se il client non è in grado di utilizzare un metodo di accesso
standard di Windows, SQL Server richiede l’immissione di una coppia nome
utente/password e la confronta con quella memorizzata nelle tabelle di sistema.
Le connessioni basate sulle coppie nome utente/password sono dette non trusted.
La modalità mista viene fornita per garantire la compatibilità con le versioni precedenti
e per l’utilizzo di SQL Server 2000 con i sistemi operativi Windows 98 e Windows ME.
Infatti, i computer Windows 98 e Windows ME configurati come server non supportano
le connessioni trusted.
Le coppie nome utente/password vengono memorizzate nella tabella di sistema
sysxlogins del database master.
2
3
Accesso standard di Windows NT tramite il metodo Challenge-Response.
15
Utilizzo interno degli identificativi
di protezione (SID)
SQL Server 2000 utilizza internamente gli identificativi di protezione (SID) degli utenti.
È possibile consentire agli utenti e ai gruppi di Windows l’accesso a un database o a
oggetti specifici all’interno di un database. Si supponga ad esempio che l’utente Jane
faccia parte dei gruppi SALES e MARKETING di Windows e che al gruppo SALES sia
stata concessa l’autorizzazione di accesso a SQL Server e al database pubs. Se
l’amministratore concede a Jane anche l’accesso alla tabella authors utilizzandone il
nome utente di Windows, REDMOND\Ferraro (per fare riferimento all’account di
Windows occorre specificare sia il dominio che il nome utente) il SID di Jane viene
memorizzato nelle tabelle di sistema del database pubs.
SQL Server 2000 non supporta l’uso dei nomi principali degli utenti (UPN, User Principal
Name). Se ad esempio il dominio di accesso è SALES e il nome utente è SOMEONE,
l’accesso a SQL Server è impostato come SALES\SOMEONE e non è possibile utilizzare
il nome [email protected], supportato da Windows 2000 Active Directory.
Ruoli
I ruoli, che svolgono una funzione analoga a quella dei gruppi di Windows, consentono
di raggruppare più utenti in una singola unità alla quale è possibile applicare le
autorizzazioni desiderate. La concessione, la negazione e la revoca delle autorizzazioni
hanno effetto su tutti i membri del ruolo. È ad esempio possibile definire un ruolo che
rappresenta un’attività svolta da una particolare categoria di dipendenti all’interno di
un’organizzazione e concedere le autorizzazioni a tale ruolo. Se l’attività corrispondente
al ruolo viene svolta a turno dai dipendenti, ognuno di essi viene aggiunto al ruolo
all’inizio del proprio turno e viene rimosso alla fine di quest’ultimo. In questo modo si
evita di concedere, negare e revocare continuamente le autorizzazioni ai singoli utenti
ogni volta che iniziano e finiscono il proprio turno.
I ruoli costituiscono uno strumento molto potente, poiché si basano su numerosi
concetti chiave. Innanzitutto poiché, ad eccezione di quelli predefiniti del server, i ruoli
vengono implementati all’interno di un database, l’amministratore del database può
creare gruppi di utenti indipendentemente dalle scelte effettuate dall’amministratore di
Windows. In secondo luogo, i ruoli possono essere nidificati, senza alcuna limitazione
legata ai livelli anche se, per ovvie ragioni, non è consentita la nidificazione circolare. In
terzo luogo, diversamente da quanto avveniva per i gruppi di SQL Server 6.5 e versioni
precedenti, ogni utente di un database può appartenere anche a più ruoli
contemporaneamente.
Ruolo public
Il ruolo public è presente in tutti database, inclusi i database master, msdb, tempdb
e model di sistema, e, poiché fornisce le autorizzazioni predefinite per gli utenti del
database, non può essere eliminato. Dal punto di vista funzionale, può essere paragonato
al gruppo Everyone di Windows NT 4.0. Poiché tutti gli utenti di un database vengono
automaticamente aggiunti a questo ruolo, non è possibile aggiungere né rimuovere
manualmente gli utenti.
16
Ruoli predefiniti
SQL Server 2000 include diversi ruoli predefiniti, dotati di autorizzazioni implicite
predefinite che non possono essere concesse ad altri account utente. Esistono due tipi
di ruoli predefiniti: ruoli predefiniti del server e ruoli predefiniti dei database.
Ruoli predefiniti del server
I ruoli predefiniti del server hanno ambito esteso all’intero server e non risiedono nei
database. Tutti i membri di un ruolo predefinito del server hanno facoltà di aggiungere
a tale ruolo altri account di accesso.
Nota: tutti i membri del gruppo BUILTIN\Administrators di Windows (il gruppo
dell’amministratore locale) sono membri del ruolo sysadmin per impostazione
predefinita.
I ruoli predefiniti del server disponibili in SQL Server 2000 sono elencati nella tabella
che segue (figura 4).
Ruolo
predefinito
del server
Descrizione
Sysadmin
Consente di eseguire qualsiasi attività in SQL Server.
Serveradmin
Consente di arrestare il server e di impostare le opzioni di configurazione
a livello di server.
Setupadmin
Consente di gestire i server collegati e le procedure di avvio.
securityadmin
Consente di gestire le impostazioni di protezione a livello di server, inclusi
i server collegati e le autorizzazioni CREATE DATABASE. Consente inoltre
di reimpostare le password degli account di accesso utilizzati per
l’autenticazione di SQL Server.
processadmin
Consente di terminare i processi in esecuzione in SQL Server.
dbcreator
Consente di creare, modificare, eliminare e ripristinare qualsiasi database.
diskadmin
Consente di gestire i file su disco.
Bulkadmin
Consente l’esecuzione dell’istruzione bulkadmin da parte degli utenti che
non appartengono al ruolo sysadmin.
Figura 4: ruoli predefiniti del server disponibili in SQL Server 2000.
Per aggiungere utenti ai ruoli predefiniti del server, è necessario utilizzare la seguente
istruzione Transact-SQL:
/* Add Bob to the sysadmin server role */
exec sp_addsrvrolemember “REDMOND\Bob”, “sysadmin”
È possibile aggiungere ai ruoli del server qualsiasi utente o gruppo di Windows.
17
Il codice che segue consente di aggiungere un utente a un ruolo del server mediante
SQL-DMO:
‘ Declare variables
Dim oServer As SQLDMO.SQLServer
‘ Create a server object and connect
Set oServer = CreateObject(“SQLDMO.SQLServer”)
oServer.Connect (“SERVERNAME”)
‘ Add Bob to the sysadmin server role
oServer.ServerRoles(“sysadmin”).AddMember (“REDMOND\Bob”)
Per ulteriori informazioni sull’utilizzo dei ruoli predefiniti del server, fare riferimento alla
documentazione in linea di SQL Server 2000.
Ruoli predefiniti dei database
I ruoli predefiniti dei database vengono definiti a livello di database e risiedono nei
singoli database. L’appartenenza al ruolo predefinito di un database può essere gestita
dai membri dei ruoli amministrativi db_owner e db_security, ma solo i membri di
db_owner possono aggiungere utenti a tale ruolo predefinito.
I ruoli predefiniti dei database disponibili in SQL Server 2000 sono elencati nella tabella
che segue (figura 5).
Ruoli predefiniti
dei database
Descrizione
db_owner
Consente di eseguire qualsiasi attività di manutenzione e configurazione
del database.
db_accessadmin
Consente di concedere o negare l’accesso a utenti e gruppi di Windows
e agli account di accesso di SQL Server.
db_datareader
Consente di leggere tutti i dati da tutte le tabelle utente.
db_datawriter
Consente di aggiungere, eliminare o modificare dati in tutte le tabelle
utente.
db_ddladmin
Consente di eseguire qualsiasi comando DDL (Data Definition Language)
in un database.
db_securityadmin
Consente di modificare l’appartenenza ai ruoli e di gestire le autorizzazioni.
db_backupoperator Consente di eseguire il backup del database.
db_denydatareader Impedisce di leggere i dati nelle tabelle utente di un database.
db_denydatawriter
Impedisce di aggiungere, modificare o eliminare dati in qualsiasi vista
o tabella utente.
Figura 5: ruoli predefiniti dei database disponibili in SQL Server 2000.
Per ulteriori informazioni sull’utilizzo dei ruoli predefiniti dei database, fare riferimento
alla documentazione in linea di SQL Server 2000.
18
Ruoli definiti dall’utente
I ruoli definiti dall’utente semplificano la gestione delle autorizzazioni relative a un
database quando è presente un gruppo di utenti che svolgono uno specifico insieme
di attività in SQL Server 2000 e in Windows non è disponibile alcun gruppo applicabile
oppure l’amministratore del database non dispone delle autorizzazioni necessarie per
gestire gli account utente di Windows. In questi casi, infatti, i ruoli definiti dall’utente
offrono all’amministratore del database la stessa flessibilità dei gruppi di Windows.
Tali ruoli, che sono ruoli locali del database in cui vengono creati, sono applicabili solo
a livello di database.
Ruoli applicazione
I ruoli applicazione consentono all’amministratore del database di limitare l’accesso ai
dati in base all’applicazione utilizzata. Quando si utilizzano questi ruoli, l’autenticazione
dell’utente viene eseguita dalle singole applicazioni.
Quando un’applicazione stabilisce una connessione a SQL Server 2000, esegue la
stored procedure sp_setapprole, che accetta due parametri: nome utente e password
(questi parametri possono essere crittografati 4).5 Le autorizzazioni eventualmente
esistenti per l’utente vengono eliminate e viene applicato il contesto di protezione
dell’applicazione.
Una volta attivati, i ruoli applicazione non possono essere disattivati e per tornare al
contesto di protezione originale dell’utente è necessario disconnettersi e riconnettersi
a SQL Server.
I ruoli applicazione supportano entrambe le modalità di autenticazione e non possono
avere membri. Non è infatti possibile associare utenti ai ruoli applicazione, poiché ogni
programma richiede il contesto di protezione del ruolo applicazione tramite la stored
procedure sp_setapprole.
Come i ruoli definiti dall’utente, i ruoli applicazione esistono solo nel contesto del
database. Se si accede a un altro database mentre un’applicazione si trova nel contesto
di protezione di un ruolo applicazione, l’accesso a tale database viene concesso
all’account guest di tale database, secondo le autorizzazioni impostate. Se l’account
guest non esiste o non è espressamente autorizzato ad accedere ai dati, non sarà
possibile accedere agli oggetti.
Quando si utilizzano i ruoli applicazione è importante sapere che in SQL Server 2000
viene effettuato il controllo dell’utente che esegue l’applicazione. In altre parole, i ruoli
applicazione forniscono il contesto di protezione per il controllo delle autorizzazioni di
accesso agli oggetti del database, ma l’identità effettiva dell’utente viene mantenuta.
Di seguito è riportato un esempio di implementazione basato sui ruoli applicazione. Se
Jane appartiene al gruppo ACCOUNTING e i membri di questo gruppo sono autorizzati
ad accedere ai dati disponibili in SQL Server solo tramite il pacchetto
di contabilità, è possibile creare un ruolo applicazione per tale prodotto software.
La password può essere sempre crittografata prima dell’invio a SQL Server.
Utilizzando la libreria di rete Multiprotocol, è possibile crittografare anche il pacchetto
che contiene la password.
4
Il modo migliore per memorizzare il nome utente e la password consiste nel salvare le
informazioni in una chiave di registro, la quale deve essere crittografata con una chiave
nota solo all’applicazione.
5
19
Pertanto, sarà autorizzato ad accedere ai dati il ruolo applicazione ACCOUNTING, ma
non il gruppo ACCOUNTING di Windows. In questa situazione, Jane può accedere ai
dati utilizzando il software di contabilità, ma non utilizzando SQL Query Analyzer.
La procedura che segue illustra l’utilizzo dei ruoli applicazione da parte di
un’applicazione client.
1. Creare un ruolo applicazione.
2. Assegnare a tale ruolo le autorizzazioni desiderate.
3. Assicurarsi che l’applicazione client sia in grado di connettersi a SQL Server 2000.
4. Assicurarsi che l’applicazione client attivi il ruolo applicazione.
I primi due passaggi di questa procedura sono in genere distinti dagli ultimi due.
Di seguito vengono pertanto riportati due diversi frammenti di codice, rispettivamente
per Transact-SQL e Visual Basic.
Script Transact-SQL:
/* Create the application role. */
EXEC sp_addapprole “AccAppRole”, “ABC”
/* Grant permissions to SELECT. */
GRANT SELECT
ON authors
TO AccAppRole
GO
Per attivare il ruolo è necessario utilizzare il codice seguente:
/* Activate the role. */
EXEC sp_setapprole “AccAppRole”, {ENCRYPT N “ABC”}
La crittografia della password è facoltativa, ma assicura un maggior livello
di protezione quando la password viene trasmessa su una rete WAN.
Codice Visual Basic:
‘ Declare variables.
Dim oServer As SQLDMO.SQLServer
Dim oDbRole As SQLDMO.DatabaseRole
‘ Create a server object and connect.
Set oServer = CreateObject(“SQLDMO.SQLServer”)
oServer.Connect (“SERVERNAME”)
‘ Create the Role object.
Set oDbRole = CreateObject(“SQLDMO.DatabaseRole”)
20
‘ Set the appropriate properties.
oDbRole.Name = “AccAppRole”
oDbRole.AppRole = True
oDbRole.Password = “ABC”
‘ Add the Role object to the servers Role collection.
oServer.Databases(“pubs”).DatabaseRoles.Add oDbRole
Per utilizzare il ruolo:
‘ Declare variables.
Dim oConnection As ADODB.Connection
‘ Create the connection object and connect.
Set oConnection = CreateObject(“ADODB.Connection”)
oConnection.Provider = “sqloledb”
oConnection.Open “Server=SERVERNAME;Database=pubs;Trusted_Connection=yes”
‘ Activate the application role. There is no error handling for this
sample.
oConnection.Execute “EXEC sp_setapprole ‘AccAppRole’, {ENCRYPT N ‘ABC’},
‘ODBC’”
Per le origini dati OLE DB e ODBC è necessario impostare lo stile di crittografia (l’ultimo
parametro), mentre le altre origini dati non sono in grado di crittografare la password
in modo esplicito. Se si utilizzano origini dati di questo tipo, è necessario utilizzare un
protocollo di comunicazione crittografato per la connessione al server.
Poiché i ruoli applicazione vengono implementati a livello di sessione, se l’applicazione
in uso crea più sessioni che richiedono lo stesso ruolo, prima di eseguire qualsiasi
operazione ogni sessione dovrà attivare il ruolo.
L’implementazione dei ruoli applicazione consente di ottenere un livello di sicurezza molto
più dettagliato che in passato. Ad esempio, un’applicazione client può utilizzare il contesto
di protezione dell’utente per alcune connessioni e un ruolo applicazione per altre.
Quando si utilizzano i ruoli applicazione, per verificare il nome del ruolo applicazione
in uso è possibile eseguire il comando SELECT USER, mentre per conoscere l’identità
dell’utente attualmente connesso è possibile utilizzare la seguente istruzione SQL:
SELECT SYSTEM_USER.
21
Protezione dell’accesso al server
La modalità di controllo dell’accesso al server dipende dalla modalità di autenticazione
di SQL Server 2000. Dopo l’accesso, le modalità di autenticazione sono invece
identiche. Al momento dell’installazione di SQL Server 2000 viene attivata per
impostazione predefinita l’autenticazione di Windows.
Accesso a livello di Windows
Se l’accesso al sistema viene impostato a livello di Windows, l’amministratore deve
creare un account di accesso per ciascun utente che intenda connettersi a SQL Server
e che non disponga già di un account.
In ogni dominio di account utente, è necessario creare gruppi globali per raggruppare
gli utenti in base ai requisiti di processo. Gli utenti devono essere quindi inseriti nei
gruppi globali appropriati dei rispettivi domini.
Nel computer che esegue SQL Server 2000 i gruppi locali dovranno essere creati in
base ai diversi requisiti di processo per i quali è necessario assegnare un’autorizzazione
di accesso a SQL Server. È quindi necessario inserire i gruppi globali appropriati dei
diversi domini trusted nei rispettivi gruppi locali del computer che esegue SQL Server.
Anche se la creazione dei gruppi globali e locali descritti in precedenza può sembrare
eccessivamente impegnativa per una rete di piccole dimensioni e con un solo dominio,
l’esperienza ha dimostrato che questa configurazione consente di ottenere ottimi
risultati.
È infatti essenziale raggruppare tutti gli utenti con le stesse esigenze di protezione in
una singola unità, che può essere utilizzata dall’amministratore del database per
concedere le autorizzazioni di accesso a SQL Server 2000. L’accesso per gruppo non
impedisce tuttavia di identificare i singoli utenti dall’interno del database. 6
Nonostante le raccomandazioni, l’amministratore del database ha la possibilità di
assegnare le autorizzazioni relative agli oggetti a gruppi universali, gruppi globali,
gruppi locali e singoli account utente di Windows.
Nota: la creazione di account utente e gruppi di Windows a livello di programmazione
non rientra nell’ambito del presente documento.
Tale operazione può essere effettuata utilizzando il modello di oggetti ADSI di Microsoft
Visual Basic oppure accedendo direttamente all’API Win32 ® da Microsoft Visual C++®.
In sostanza, si tratta di una configurazione analoga a quella utilizzata per la protezione
di un file nel file system NTFS, in cui l’accesso è consentito solo ai membri del gruppo
SALES. In tale configurazione Bob, che appartiene al gruppo SALES, tenta di accedere
al file, nel registro di controllo viene inserita una voce per l’utente Bob, non per il
gruppo SALES.
6
22
Accesso a livello di SQL Server
Per consentire l’accesso a SQL Server da parte dei gruppi locali di Windows creati, è
necessario concedere autorizzazioni a livello di SQL Server 2000. Tali autorizzazioni
possono essere concesse direttamente agli utenti, ma questo può risultare poco pratico
per l’amministrazione, se non negli ambienti più limitati.
Le autorizzazioni di accesso al server possono essere concesse tramite l’interfaccia
utente o implementate a livello di programmazione utilizzando Microsoft Visual Basic
o Transact-SQL.7
Per la concessione dell’accesso agli utenti e ai gruppi di Windows sono state create
le nuove stored procedure elencate di seguito (figura 6).
sp_addalias
sp_droprole
sp_addapprole
sp_droprolemember
sp_addgroup
sp_dropserver
sp_addlinkedsrvlogin
sp_dropsrvrolemember
sp_addlogin
sp_dropuser
sp_addremotelogin
sp_grantdbaccess
sp_addrole
sp_grantlogin
sp_addrolemember
sp_helpdbfixedrole
sp_addserver
sp_helpgroup
sp_addsrvrolemember
sp_helplinkedsrvlogin
sp_adduser
sp_helplogins
sp_approlepassword
sp_helpntgroup
sp_change_users_login
sp_helpremotelogin
sp_changedbowner
sp_helprole
sp_changegroup
sp_helprolemember
sp_changeobjectowner
sp_helprotect
sp_dbfixedrolepermission
sp_helpsrvrole
sp_defaultdb
sp_helpsrvrolemember
sp_defaultlanguage
sp_helpuser
sp_denylogin
sp_password
sp_dropalias
sp_remoteoption
sp_dropapprole
sp_revokedbaccess
sp_dropgroup
sp_revokelogin
sp_droplinkedsrvlogin
sp_setapprole
sp_droplogin
sp_srvrolepermission
sp_dropremotelogin
sp_validatelogins
Figura 6: stored procedure legate alla protezione disponibili in SQL Server 2000.
Le definizioni che seguono rientrano nel contesto del presente documento. Il codice
Visual Basic si riferisce alla creazione di un’applicazione in ambiente Visual Basic o
Visual Basic, Applications Edition dotato della libreria SQL-DMO. Il codice Transact-SQL
(Transact Structured Query Language) si riferisce all’implementazione di SQL
disponibile in SQL Server 7.0 e SQL Server 2000.
7
23
La seguente istruzione Transact-SQL concede i diritti di accesso al gruppo locale
SALESLG:
/* Grant login. */
exec sp_grantlogin ‘REDMOND\SALESLG’
In alternativa, per concedere i diritti di accesso è possibile utilizzare il seguente codice
Visual Basic:
‘ Declare variables.
Dim oServer As SQLDMO.SQLServer
Dim oLogin As SQLDMO.Login
‘ Create a server object and connect.
Set oServer = CreateObject(“SQLDMO.SQLServer”)
oServer.Connect (“SERVERNAME”)
‘ Create the Login object.
Set oLogin = CreateObject(“SQLDMO.Login”)
‘ Set the appropriate properties.
oLogin.Name = “REDMOND\SALESLG”
oLogin.Type = SQLDMOLogin_NTGroup
‘ Add the Login object to the server’s Logins collection.
oServer.Logins.Add oLogin
Per consentire agli utenti di accedere a SQL Server 2000 utilizzando connessioni non
trusted, è necessario creare i relativi account utente in SQL Server.
Nota: se si installa SQL Server 2000 in Windows selezionando la modalità mista,
i client che supportano l’autenticazione di Windows possono comunque stabilire
connessioni trusted.
Il seguente script Transact-SQL consente invece di creare un account di accesso per
una connessione non trusted:
/* Add a login. */
exec sp_addlogin ‘Bob’, ‘password’, ‘pubs’
Questa istruzione aggiunge un utente di nome Bob, con password uguale a password
e pubs come database predefinito. Il database predefinito è quello a cui viene
connesso l’utente al momento dell’accesso. Tuttavia, affinché ciò sia possibile l’utente
deve creare un account utente nel database predefinito, perché la stored procedure
sp_addlogin non aggiunge alcun account utente al database a cui viene fatto
riferimento nello script.
24
In alternativa, per ottenere lo stesso risultato è possibile utilizzare il seguente codice
Visual Basic:
‘ Declare variables.
Dim oServer As SQLDMO.SQLServer
Dim oLogin As SQLDMO.Login
‘ Create a server object and connect.
Set oServer = CreateObject(“SQLDMO.SQLServer”)
oServer.Connect (“SERVERNAME”)
‘ Create the Login object.
Set oLogin = CreateObject(“SQLDMO.Login”)
‘ Set the appropriate properties.
oLogin.Name = “Bob”
oLogin.Type = SQLDMOLogin_Standard
oLogin.SetPassword ““,”password”
‘ Add the Login object to the server’s Logins collection.
oServer.Logins.Add oLogin
25
Protezione dell’accesso ai database
L’esecuzione dell’accesso non implica automaticamente la possibilità di accedere a tutti
i database di SQL Server 2000. Per consentire agli utenti di accedere a un determinato
database, è infatti necessario concedere le autorizzazioni appropriate.
In questa sezione non viene fatta distinzione fra utenti non trusted, utenti di Windows
e gruppi di Windows. Se viene fatto riferimento a utenti o gruppi di Windows, può
trattarsi di utenti o gruppi globali appartenenti a domini trusted o a domini situati
nello stesso insieme di strutture.
In ogni database viene creato un utente che viene collegato a un account di accesso
di SQL Server oppure a un utente o a un gruppo di Windows.
Lo snap-in di Microsoft Management Console (MMC) SQL Server Enterprise Manager,
utilizzato per l’amministrazione di SQL Server 2000, non consente la creazione di utenti
senza autorizzazioni di accesso specifiche. È pertanto necessario selezionare una voce
dall’elenco degli account autorizzati ad accedere al server visualizzato in MMC. Lo
stesso vale per il modello di oggetti SQL-DMO.
Con Transact-SQL è possibile concedere i diritti di accesso a un database a qualsiasi
account di accesso di SQL Server oppure a qualsiasi utente o gruppo di Windows valido,
anche se nella tabella sysxlogins del database master non è presente un account di
accesso specifico.
Nota: anche se non è necessario dal punto di vista tecnico, se si utilizzano connessioni
trusted nei singoli database è preferibile creare utenti con nome uguale al nome di
accesso.
Di seguito sono riportati alcuni esempi di istruzioni Transact-SQL per la concessione
delle autorizzazioni per l’utilizzo di un database:
/* Grant access to Bob. */
exec sp_grantdbaccess ‘REDMOND\Bob’
/* Grant access to Wendy, referring to her by first name within this
database. */
exec sp_grantdbaccess ‘REDMOND\WendyH’, ‘Wendy’
Per consentire il funzionamento di questo esempio di codice con client non trusted,
è sufficiente sostituire il nome utente di dominio con il nome utente utilizzato da
SQL Server 2000 per l’autenticazione dell’utente.
Se si utilizza SQL-DMO, per ottenere lo stesso risultato è necessario utilizzare il codice
seguente:
‘ Declare variables.
Dim oServer As SQLDMO.SQLServer
Dim oUser As SQLDMO.User
26
‘ Create a server object and connect.
Set oServer = CreateObject(“SQLDMO.SQLServer”)
oServer.Connect (“SERVERNAME”)
‘ Create the User object.
Set oUser = CreateObject(“SQLDMO.User”)
‘ Set the appropriate properties.
oUser.Name = “Bob”
oUser.Login = “REDMOND\Bob”
‘ Add the User object to the servers Users collection.
oServer.Databases(“pubs”).Users.Add oUser
Protezione dell’accesso agli oggetti di un database
Le autorizzazioni concesse a ruoli e utenti possono essere assegnate in modo da
consentire l’esecuzione di determinate istruzioni e l’accesso a particolari oggetti
del database. Le autorizzazioni per l’esecuzione di istruzioni consentono di
specificare gli utenti autorizzati a eseguire istruzioni come CREATE DATABASE,
CREATE TABLE o CREATE FUNCTION. Le autorizzazioni relative gli oggetti limitano
l’accesso a oggetti come tabelle, viste, funzioni definite dall’utente e stored
procedure. Le autorizzazioni disponibili dipendono dagli oggetti a cui si riferiscono.
Ad esempio, le autorizzazioni relative alle tabelle includono SELECT, INSERT,
UPDATE, DELETE e REFERENCES, mentre quelle relative alle stored procedure
includono EXECUTE.
Ruoli del database definiti dall’utente
In un ambiente ideale i ruoli non sarebbero necessari, perché tutti utilizzerebbero
SQL Server 2000 in Windows NT 4.0 o Windows 2000 e verrebbe utilizzata solo
l’autenticazione di Windows. L’amministratore del database potrebbe pertanto
chiedere all’amministratore di Windows di inserire in un particolare gruppo di
Windows tutti gli utenti con uno specifico requisito (o ruolo) di accesso ai dati, per
poi concedere le autorizzazioni necessarie solo a tale gruppo di Windows.
Poiché, tuttavia, nella maggior parte degli ambienti questa situazione non si verifica,
non sempre è possibile creare gruppi di Windows appropriati. Se ad esempio si installa
SQL Server 2000 in Windows 98, non è tecnicamente possibile creare gruppi di
Windows. In questo caso è tuttavia possibile utilizzare i ruoli per raggruppare gli utenti
in base alle autorizzazioni necessarie.
È infatti possibile creare un ruolo, che può comprendere qualsiasi utente o gruppo di
Windows, e assegnare a tale ruolo le autorizzazioni relative gli oggetti del database
esattamente come si assegnano le autorizzazioni agli utenti del database.
Nota: gli utenti possono definire ruoli solo all’interno di un database. I ruoli predefiniti
del server e i ruoli predefiniti del database non possono essere modificati.
27
Per creare un ruolo è possibile utilizzare il seguente codice Transact-SQL:
/* Add role for Telephone Operators. */
exec sp_addrole “TelephoneOperators”
Oppure il seguente codice Visual Basic:
‘ Declare variables.
Dim oServer As SQLDMO.SQLServer
Dim oDbRole As SQLDMO.DatabaseRole
‘ Create a server object and connect.
Set oServer = CreateObject(“SQLDMO.SQLServer”)
oServer.Connect (“SERVERNAME”)
‘ Create the Database Role object.
Set oDbRole = CreateObject(“SQLDMO.DatabaseRole”)
‘ Set the appropriate properties.
oDbRole.Name = “TelephoneOperators”
‘ Add the Role object to the servers Role collection.
oServer.Databases(“pubs”).DatabaseRoles.Add oDbRole
Dopo la creazione di un ruolo di database definito dall’utente, è possibile aggiungere
a quest’ultimo utenti, gruppi o altri ruoli. I ruoli possono essere nidificati, anche se non
in modo circolare perché non si otterrebbe una configurazione efficace.
Nell’esempio di codice Transact-SQL che segue viene creato un ruolo a cui vengono
aggiunti un utente di Windows, un gruppo di Windows e un ruolo di database.
/* Add a Windows user to the TelephoneOperators role. */
exec sp_addrolemember “TelephoneOperators”, “REDMOND\Bob”
/* Add a Windows group to the TelephoneOperators role. */
exec sp_addrolemember “TelephoneOperators”, “REDMOND\Sales”
/* Add HelpDeskOperators role to TelephoneOperators role. */
exec sp_addrolemember “TelephoneOperators”, “HelpDeskOperators”
28
Utilizzando SQL-DMO si otterrebbe invece il codice seguente:
‘ Declare variables.
Dim oServer As SQLDMO.SQLServer
‘ Create a server object and connect.
Set oServer = CreateObject(“SQLDMO.SQLServer”)
oServer.Connect (“MSNZBENTHOM”)
‘ Use with statement for code legibility.
With oServer.Databases(“pubs”).DatabaseRoles(“TelephoneOperators”)
‘ Add the Windows user to the TelehoneOperators role collection.
.AddMember (“REDMOND\Bob”)
‘ Add the
Windows group to the TelehoneOperator’s role collection
.AddMember (“REDMOND \Sales”)
‘ Add the HelpDeskOperators role to TelehoneOperators role collection.
.AddMember (“HelpDeskOperators”)
End With
Sistema di autorizzazioni
Il sistema di autorizzazioni di SQL Server 2000 si basa sullo stesso modello additivo
alla base delle autorizzazioni di Windows. Un utente che sia membro dei ruoli sales,
marketing e research (ora uno stesso utente può appartenere anche a più
gruppi), dispone della somma delle autorizzazioni fornite da ciascun ruolo. Se ad
esempio il ruolo sales fornisce autorizzazioni SELECT per una tabella, il ruolo
marketing dispone di autorizzazioni INSERT e il ruolo research di autorizzazioni
UPDATE, l’utente disporrà delle autorizzazioni SELECT, INSERT e UPDATE. Tuttavia,
come avviene anche in Windows, se l’utente è membro di un ruolo a cui è stata
negata una particolare autorizzazione per gli oggetti, ad esempio SELECT, l’utente
non potrà beneficiare di tale autorizzazione. Ha infatti la precedenza l’autorizzazione
più restrittiva (DENY).
29
Concessione e negazione delle autorizzazioni
a utenti e ruoli
A livello di database è possibile concedere autorizzazioni solo agli utenti e ai ruoli
del database e agli utenti e ai gruppi di Windows, ma non agli account di accesso
di SQL Server 2000. Per gestire le autorizzazioni appropriate per gli utenti e i ruoli
di un database è necessario utilizzare metodi di concessione, negazione e revoca
delle autorizzazioni.
L’autorizzazione DENY consente all’amministratore di negare a un utente o a un ruolo
l’autorizzazione a utilizzare un determinato oggetto o istruzione. Come avviene anche
per le autorizzazioni di Windows, l’autorizzazione DENY ha la precedenza su tutte le
altre.
Se si nota ad esempio che alcuni utenti di un database modificano i dati in modo
inappropriato, anziché rimuovere le autorizzazioni per tutti gli utenti, la maggior parte
dei quali utilizza i dati in modo responsabile, è possibile creare un nuovo ruolo, ad
esempio trouble_makers, e applicare l’autorizzazione DENY per le operazioni INSERT,
UPDATE e DELETE a tutte le tabelle associate a tale ruolo. Gli utenti che si comportano
in modo inappropriato vengono inseriti nel ruolo trouble_makers indipendentemente
dalle autorizzazioni personali, di gruppo o di ruolo di cui dispongono.
La revoca di un’autorizzazione è diversa dalla negazione. L’autorizzazione REVOKE
elimina un’autorizzazione GRANT o DENY concessa in precedenza, mentre l’autorizzazione
DENY impedisce l’accesso anche nel caso in cui siano state concesse autorizzazioni
specifiche.
In questa sezione viene mostrato un esempio di utilizzo di ciascun metodo sia in Visual
Basic, sia in Transact-SQL. Il seguente codice Transact-SQL concede agli utenti Bob e
Jane l’autorizzazione SELECT per la tabella authors e all’utente Jane viene concessa
anche l’autorizzazione INSERT per la tabella titles.
/* Grant permissions to SELECT. */
GRANT SELECT
ON authors
TO Bob, [REDMOND\Jane]
GO
/* Grant permissions to INSERT. */
GRANT INSERT
ON titles
TO [REDMOND\Jane]
GO
Nell’esempio precedente l’istruzione GRANT viene utilizzata per concedere autorizzazioni
sia a un utente definito esplicitamente a livello di database (Bob), sia a un utente di
Windows (Jane).
30
Di seguito è riportato lo stesso esempio in Visual Basic.
‘ Declare variables.
Dim oServer As SQLDMO.SQLServer
‘ Create a server object and connect.
Set oServer = CreateObject(“SQLDMO.SQLServer”)
oServer.Connect (“SERVERNAME”)
‘ Grant Jane and Bob permissions to select from the authors table.
oServer.Databases(“pubs”).Tables(“authors”).Grant SQLDMOPriv_Select, “Bob”
oServer.Databases(“pubs”).Tables(“authors”).Grant SQLDMOPriv_Select, _
“[REDMOND\Jane]
‘ Grant Jane permissions to select from the authors table.
oServer.Databases(“pubs”).Tables(“authors”).Grant SQLDMOPriv_Select, _
“[REDMOND\Jane]”
Negli esempi precedenti la differenza tra la concessione dell’accesso mediante l’utilizzo
del nome di dominio completo dell’utente e la concessione dell’accesso a un utente già
autorizzato ad accedere direttamente al database è minima. Proprio per questo, negli
esempi che seguono viene mostrato solo il codice relativo agli utenti già impostati per
il database.
La seguente istruzione Transact-SQL permette di negare l’autorizzazione SELECT a un
utente.
/* Deny permissions to SELECT. */
DENY SELECT
ON authors
TO Bob
GO
And again using Visual Basic:
‘ Declare variables.
Dim oServer As SQLDMO.SQLServer
‘ Create a server object and connect.
Set oServer = CreateObject(“SQLDMO.SQLServer”)
oServer.Connect (“SERVERNAME”)
‘ Deny Bob permissions to select from authors table.
oServer.Databases(“pubs”).Tables(“authors”).Deny SQLDMOPriv_Select, “Bob”
31
L’esempio di codice Transact-SQL che segue mostra invece come revocare le
autorizzazioni concesse a un utente.
/* Revoke permissions to SELECT. */
REVOKE SELECT
ON authors
FROM Bob
GO
Here is the Visual Basic code:
‘ Declare variables.
Dim oServer As SQLDMO.SQLServer
‘ Create a server object and connect.
Set oServer = CreateObject(“SQLDMO.SQLServer”)
oServer.Connect (“SERVERNAME”)
‘ Revoke Bob permissions to select from the authors table.
oServer.Databases(“pubs”).Tables(“authors”).Revoke SQLDMOPriv_Select,
“Bob”
Catene di proprietà
Per sviluppare un ambiente SQL Server 2000 sicuro è essenziale comprendere
a fondo cosa sono le catene di proprietà. Le catene di proprietà vengono definite
durante la verifica delle autorizzazioni relative agli oggetti. Ad esempio, quando
un utente accede a una vista, vengono controllale le autorizzazioni per la vista,
ma occorre anche stabilire come devono essere controllate le autorizzazioni relative
alla tabella sottostante.
SQL Server 2000 controlla sempre le autorizzazioni per gli oggetti quando rileva
una catena di proprietà interrotta, ossia quando il proprietario dell’oggetto è diverso
da quello degli oggetti sottostanti. Se ad esempio l’utente Mary crea una vista
basata su una tabella creata dall’utente Bob, la catena di proprietà si interrompe.
I punti di interruzione delle catene di proprietà indicano pertanto i punti in cui
è necessario eseguire un ulteriore controllo delle autorizzazioni, oltre a quello già
eseguito per l’oggetto al quale è stato originariamente effettuato l’accesso. Questo
consente di ottenere un modello estremamente pratico.
Per meglio illustrare il concetto di catena di proprietà, conviene ricorrere a un
esempio. Si supponga che Bob sia proprietario di una tabella e che per proteggere
l’accesso a tale tabella conceda l’autorizzazione SELECT solo all’utente Mary. Per
svolgere il suo lavoro, Mary crea una vista della tabella e l’utente Sue, osservando
Mary, chiede di utilizzare la stessa vista. Mary decide di concedere a Sue l’accesso
alla vista, ma ciò è in contrasto con le intenzioni di Bob, che non desidera
consentire a Sue di visualizzare i dati della tabella. In questo caso la catena di
proprietà è interrotta, poiché la tabella appartiene a Bob e la vista appartiene
32
a Mary. Poiché la proprietà di una vista non implica la proprietà degli oggetti
sottostanti, quando Sue tenta di utilizzare la vista e SQL Server verifica le
autorizzazioni per stabilire se Sue sia autorizzata ad accedervi, poiché la catena
di proprietà è interrotta vengono controllate anche le autorizzazioni relative alla
tabella.
Se Sue non è autorizzata ad accedere alla tabella, non può utilizzare la vista, perché
la catena di proprietà è interrotta. In pratica, una catena di proprietà interrotta
impedisce agli utenti di accedere ai dati senza averne l’autorizzazione.
Se invece la vista appartenesse a Bob e quest’ultimo decidesse di negare a Sue
l’accesso alla tabella, ma di concederle l’accesso alla vista, Sue potrebbe acce dere
alla vista. Infatti, poiché le autorizzazioni vengono controllate solo quando Sue
accede alla vista e in questo caso non è presente alcuna interruzione della catena
di proprietà, le autorizzazioni per la tabella sottostante non vengono controllate.
Pertanto, poiché Bob ha creato entrambi gli oggetti, concedendo l’accesso alla vista
autorizza implicitamente Sue ad accedere agli oggetti sottostanti.
SQL Server 2000 sfrutta le potenzialità offerte dalle catene di proprietà ad esempio
nell’implementazione delle password. Gli utenti non possono aggiornare
direttamente le tabelle di sistema, soprattutto quelle contenute nel database
master. Quando si utilizza SQL Server 2000 in modalità mista, le coppie nome
utente/password vengono memorizzate nella tabella di sistema sysxlogins.
Poiché gli utenti devono avere la possibilità di modificare le password a intervalli
regolari, in SQL Server 2000 è stata implementata una stored procedure per
modificare la password, che può essere eseguita da qualsiasi utente. In questo
modo, gli utenti non possono accedere alla tabella sysxlogins, ma sono autorizzati
a eseguire la stored procedure sp_password. Poiché il proprietario della stored
procedure sp_password coincide con quello della tabella di sistema sysxlogins,
la catena di proprietà non viene interrotta e le autorizzazioni vengono controllate
solo per la stored procedure.
Grazie alle catene di proprietà, è pertanto possibile implementare in SQL Server
2000 un sistema di protezione che attribuisce al proprietario dei dati originali il
controllo completo sulla concessione delle autorizzazioni di accesso ai propri dati.
Inoltre, poiché se la catena di proprietà non viene interrotta non è necessario
verificare le autorizzazioni, si ottiene anche un miglioramento delle pres tazioni.
33
Implementazione della protezione a livello
di server
Utilizzo di identificatori di protezione (SID)
SQL Server 2000 verifica se all’identificatore di protezione (SID, Security Identifier)
dell’utente, o ai SID di appartenenza a un gruppo, è stato espressamente negato
l’accesso al server, poiché in questo caso l’utente non può accedere al server. Se
invece l’accesso non è stato espressamente negato, il server verifica se l’accesso
è stato concesso direttamente all’utente o se deriva dalla sua appartenenza a un
gruppo. Se l’accesso è stato concesso, la connessione a SQL Server 2000 viene
mantenuta e l’utente può utilizzare il database predefinito appropriato, per il quale
deve disporre di un’apposita autorizzazione di accesso. Vengono quindi controllati i
diritti di accesso relativi a tutti gli oggetti a cui l’utente tenta di accedere. Se invece
per un determinato insieme di credenziali l’accesso non è consentito, la connessione
al server viene interrotta.
Quando a un utente o a un gruppo di Windows NT 4.0 viene concesso o negato
l’accesso a SQL Server 2000, le relative informazioni vengono archiviate nella tabella
di sistema sysxlogins. L’accesso al server non viene più controllato attraverso le
autorizzazioni per una determinata chiave del Registro di sistema, ma gli utenti che si
connettono tramite una connessione trusted vengono identificati da SQL Server 2000
tramite i relativi SID e i SID di appartenenza ai gruppi.
Eliminazione dei SUID (Server User ID)
In SQL Server 2000 la tabella di sistema sysxlogins del database master non
contiene più la colonna SUID (Server User ID), che in SQL Server 6.5 e versioni
precedenti veniva utilizzata per tenere traccia della protezione. In SQL Server 7.0,
questa colonna era presente anche in molte altre tabelle di sistema.
La colonna <name> è stata invece rimossa dalle seguenti tabelle di sistema:

Sysdatabases

Syslogins

Sysremotelogins

Sysusers

Sysprocesses
È stata completamente rimossa anche la vista sysalternates, mentre le funzioni
SUSER_ID() e SUSER_NAME() sono state dichiarate obsolete e, se chiamate,
restituiscono sempre NULL.
34
Generazione di GUID per utenti non trusted
Per le connessioni non trusted, come quelle create quando SQL Server 2000 è installato
in Windows 98, i SID di Windows non sono disponibili. In questo caso, SQL Server 2000
genera un identificatore univoco globale (GUID, Globally Unique Identifier) di 16 byte,
che viene utilizzato internamente come avviene per i SID di Windows associati agli
utenti e ai gruppi di Windows. Il funzionamento del sistema di protezione negli ambienti
trusted e non trusted è pertanto identico.
Ridenominazione di account di Windows
relativi a utenti o gruppi
Se un utente o un gruppo di Windows viene rinominato mediante lo strumento User
Manager for Domains di Windows NT 4.0 o con l’utilità Utenti e computer di Active
Directory, tale modifica non viene rilevata da SQL Server 2000. Per ottimizzare le
prestazioni, in SQL Server 2000 il nome completo dell’utente o del gruppo viene
memorizzato nella tabella sysxlogins, poiché l’esecuzione di query sul domain
controller per ottenere queste informazioni può richiedere molto tempo, in particolare
se le ricerche sono molte o il domain controller utilizza una connessione WAN lenta.
Eventuali differenze nei nomi di utenti e gruppi tra SQL Server 2000 e Windows non
determinano problemi di protezione. Infatti, poiché SQL Server utilizza internamente
solo i SID, il set di autorizzazioni per l’utente o il gruppo modificato continua a
funzionare correttamente.
Quando si utilizzano le funzioni SUSER_SNAME() e SUSER_SID(), che restituiscono
rispettivamente il nome e il SID dell’utente, per effettuare la risoluzione dei nomi viene
eseguita una query sulla tabella sysxlogins e tale query viene inoltrata all’autorità di
protezione locale (LSA, Local Security Authority) di Windows8 solo se la tabella
sysxlogins non contiene il nome utente o il SID.
Per questa ragione, i nomi utente visualizzati nei messaggi di sistema potrebbero non
essere aggiornati.
8
Per ulteriori informazioni, vedere Windows NT Resource Kit.
35
Tabella di sistema sysxlogins
Nella tabella di sysxlogins sono riportate le autorizzazioni di accesso degli utenti
o l’eventuale assenza di autorizzazione9. Questa tabella è presente solo nel database
master.
In SQL Server 2000 sono disponibili tre viste basate sulla tabella sysxlogins:

La vista syslogins, che fornisce la compatibilità con le versioni precedenti
e interpreta al tempo stesso la colonna status, in modo da semplificarne
la comprensione.

La vista sysremotelogins, che fornisce la compatibilità con le versioni precedenti
e semplifica l’accesso alle informazioni relative agli account di accesso remoto.

La vista sysoledbusers, che contiene informazioni sugli account di accesso remoto.
Colonna xstatus
La colonna xstatus contiene varie impostazioni relative allo stato, come l’appartenenza
ai ruoli del server. I valori di stato disponibili sono riportati nella tabella che segue
(figura 7).
Valore
Bit10
Note
Denylogin
1
--
Hasaccess
2
--
Isntname
3
Se ha valore 1, significa che si tratta di un
account
di Windows
Isntgroup
3
Solo se il bit di stato 4 non è impostato
Isntuser
4
Deve essere impostato anche il bit di stato 3
Sysadmin
5
Ruolo del server
Securityadmin
6
Ruolo del server
Serveradmin
7
Ruolo del server
Setupadmin
8
Ruolo del server
Processadmin
9
Ruolo del server
Diskadmin
10
Ruolo del server
Dbcreator
11
Ruolo del server
Bulkadmin
12
Ruolo del server
Figura 7: valori di stato per la protezione di SQL Server 2000.
In SQL Server 6.5 e versioni precedenti, queste informazioni erano archiviate nella
tabella di sistema syslogins. Per garantire la compatibilità con le versioni precedenti è
ancora possibile eseguire query su syslogins, che nella nuova versione costituisce una
vista della tabella sysxlogins. Questa vista non è in genere necessaria, poiché è
preferibile evitare di accedere direttamente alle tabelle di sistema. Le tabelle di sistema
possono essere modificate in qualsiasi momento.
9
10
36
Bit: posizione del bit di stato procedendo da destra a sinistra.
Colonne dbid e language
Il meccanismo utilizzato per recuperare le impostazioni relative alla lingua e al
database predefiniti dell’utente è poco conosciuto. Quando un utente si connette a
SQL Server 2000 il server cerca nella tabella sysxlogins la riga contenente il SID
oppure il GUID, se la connessione non è trusted, specifico dell’utente. Le impostazioni
relative alla lingua e al database predefiniti vengono ricavate dalla riga individuata.
Se tale riga non viene trovata, il server cerca i SID dei gruppi a cui l’utente
appartiene e utilizza la lingua e il database predefiniti impostati per il primo gruppo
trovato. Questa implementazione è specifica di ciascuna impostazione predefinita.
Se per il primo gruppo individuato è impostata la lingua predefinita ma il database
predefinito è NULL, SQL Server passa al gruppo successivo e tenta di ottenere il
database predefinito da tale gruppo.
Se ad esempio per l’utente Bob, appartenente ai gruppi SALES e MARKETING, la
lingua e il database predefiniti non sono stati espressamente configurati, il sistema
cerca le impostazioni predefinite dei gruppi SALES e MARKETING e utilizza le prime
impostazioni restituite.
Pertanto, se per un utente che appartiene a più gruppi la lingua e il database
predefiniti non sono stati impostati, non è possibile garantire la scelta univoca di
tali impostazioni.
È tuttavia possibile assegnare la lingua e il database predefiniti a un utente senza
concedergli espressamente i diritti di accesso. L’utente è infatti autorizzato ad
accedere a SQL Server in virtù dell’appartenenza a determinati gruppi, ma le relative
impostazioni predefinite vengono prelevate dalla voce della tabella di sistema
sysxlogins associata all’utente. In questo caso, per la voce della tabella sysxlogins
specifica dell’utente il flag hasaccess della tabella sysxlogins viene impostato
su zero.
Stato hasaccess
Lo stato hasaccess della tabella di sistema sysxlogins consente di configurare le
impostazioni predefinite per un utente specifico senza concedere implicitamente
l’accesso a tale utente. La tabella sysxlogins viene in genere utilizzata per concedere
diritti di accesso a determinati utenti o gruppi. Se il bit di stato hasaccess ha valore
zero, all’utente non viene concesso esplicitamente l’accesso, ma se si connette come
membro di un gruppo disporrà delle impostazioni predefinite appropriate.
Lo stato hasaccess è importante anche per un altro motivo, che può essere chiarito
con un esempio. Se Bob, che appartiene al gruppo REDMOND\SALES, non è
espressamente autorizzato ad accedere a SQL Server 2000, nella tabella sysxlogins
non sono presenti voci corrispondenti a tale utente, ma quest’ultimo può comunque
effettuare l’accesso, perché il gruppo REDMOND\SALES dispone delle autorizzazioni
necessarie. Se Bob viene aggiunto a un ruolo predefinito del server, non ottiene
automaticamente l’autorizzazione ad accedere direttamente a SQL Server, ma
continua a effettuare l’accesso tramite il gruppo SALES. In questo caso, nella tabella
sysxlogins viene aggiunta una nuova riga per Bob, ma il flag hasaccess viene
impostato su zero in modo da concedere l’appartenenza al ruolo appropriato del
server, senza tuttavia concedere implicitamente l’accesso al server.
La tabella sysxlogins può contenere voci che non implicano la concessione esplicita
dell’accesso a un utente o a un gruppo anche quando è impostato il flag denylogin.
37
Stato denylogin
Lo stato denylogin consente di contrassegnare un utente o un gruppo in modo che
gli venga esplicitamente negato l’accesso a SQL Server 2000. Per impedire a un utente
o a un gruppo specifico di accedere a SQL Server, è ad esempio possibile utilizzare la
seguente istruzione Transact-SQL:
Exec sp_denylogin ‘REDMOND\Bob’
che non corrisponde a:
Exec sp_revokelogin ‘REDMOND\Bob’
Infatti, mentre la prima istruzione nega l’accesso a SQL Server, la seconda revoca
l’accesso all’account specificato. Se l’utente è membro del gruppo MARKETING,
che dispone dell’accesso, la seconda istruzione non impedisce a Bob di continuare
ad accedere al server tramite il gruppo MARKETING, mentre la prima nega l’accesso
a tale utente anche se quest’ultimo appartiene a gruppi a cui è stato concesso.
Nota: nei sistemi operativi Windows, per impedire a un determinato utente di
accedere a una risorsa è sufficiente un’istruzione DENY.
Vista sysremotelogins
La vista sysremotelogins viene fornita per compatibilità con le versioni precedenti.
In SQL Server 6.5 e versioni precedenti, infatti, il mapping degli account di accesso
remoto era impostato in una tabella di nome sysremotelogins.
Vista sysoledbuser
Quando un utente tenta di eseguire una query su un server remoto, il server locale
deve accedere al server collegato per conto dell’utente.
Per aggiungere ai server remoti nuovi account collegati viene utilizzata la stored
procedure sp_addlinkedsrvlogin e le informazioni corrispondenti vengono archiviate
nella tabella sysxlogins. Per eseguire la stored procedure è necessario specificare
come parametri il nome del server remoto, il nome utente locale, il nome utente
remoto e la password remota.
38
Implementazione della protezione a livello
di oggetto
Controllo delle autorizzazioni
Per identificare gli utenti e i gruppi di Windows, SQL Server 2000 utilizza i SID.
Tuttavia, data la lunghezza dei SID, fino a 85 byte, all’interno dei singoli database SQL
Server 2000 esegue il mapping dei SID sugli ID nella tabella sysusers. Gli ID utente
mappati vengono quindi utilizzati nella tabella sysobjects per identificare i proprietari
delle varie tabelle, nella tabella syspermissions per impostare le autorizzazioni per gli
oggetti e nella tabella systypes per identificare i proprietari dei tipi definiti dall’utente.
Quando un utente si connette a SQL Server 2000, il server crea in memoria una
struttura di stato del processo (PSS, Process Status Structure) 11, che contiene il SID
dell’utente, i SID di gruppo e altre informazioni relative allo stato e alla protezione.
Questa struttura è uno snapshot creato al momento della connessione dell’utente, mai
aggiornato e specifico della sessione di connessione al server. A un singolo utente che
stabilisca più sessioni con SQL Server 2000 corrispondono pertanto più strutture PSS.
Se l’utente accede a un database, SQL Server controllata la tabella sysusers per
stabilire se all’utente sia stato negato l’accesso, direttamente oppure perché appartiene
a un gruppo a cui è stato negato. Se all’utente è stato negato l’accesso, tale restrizione
verrà subito applicata, in caso contrario verrà eseguito un ulteriore controllo nella
tabella sysusers, questa volta utilizzando tutti gli ID utente associati all’utente. Una
volta stabilito che l’utente è autorizzato ad accedere al database, viene analizzata la
tabella sysmembers per consentire l’impostazione di tutte le appartenenze ai ruoli per
l’utente. L’utente può ad esempio essere membro di un ruolo, membro di un gruppo di
Windows o utilizzare l’alias di un altro utente. Vengono individuati gli ID utente di tutte
le appartenenze applicabili, in modo da utilizzare le autorizzazioni appropriate per
l’utente. Diversamente dalle strutture PSS, queste informazioni non sono persistenti.
Quando l’utente inizia ad accedere agli oggetti del database, le autorizzazioni applicabili
vengono determinate cercando nella tabella syspermissions le voci con ID utente
corrispondenti, in base a quanto stabilito in precedenza. Vengono controllate per prime
le autorizzazioni DENY, poiché se sono presenti l’utente non può accedere all’oggetto
richiesto. Se non vengono individuate autorizzazioni DENY e sono presenti voci che
autorizzano l’utente ad accedere all’oggetto richiesto, l’accesso viene invece consentito.
Le autorizzazioni di accesso effettive vengono quindi memorizzate nella cache, per
evitare di ripetere l’intero processo di controllo in caso di accesso ripetuto.
A questa struttura viene fatto riferimento in numerosi messaggi di errore generati da
SQL Server 7.0.
11
39
Costo della modifica delle autorizzazioni
Come spiegato in precedenza, in SQL Server 2000 le autorizzazioni relative agli oggetti
vengono memorizzate nella cache della sessione, per evitare di ripetere l’intero
processo di controllo in caso di accesso ripetuto agli stessi oggetti. Diversamente dalla
struttura PSS, in cui le informazioni di protezione non vengono più modificate dopo la
creazione, la cache delle autorizzazioni viene continuamente aggiornata utilizzando il
metodo del controllo delle versioni.
Durante il controllo iniziale delle autorizzazioni viene definito un numero di versione.
Quando le autorizzazioni per un oggetto vengono modificate, SQL Server 2000
incrementa un contatore di versione, che viene controllato a ogni accesso all’oggetto.
Se tale contatore è diverso da quello memorizzato nella cache, il contenuto della cache
viene eliminato e le autorizzazioni effettive vengono ridefinite.
Le impostazioni di protezione memorizzate nella cache vengono utilizzate ogni volta che
l’utente accede a un determinato oggetto, purché il contatore della versione sia rimasto
invariato. Se il contatore risulta modificato, l’operazione da eseguire richiede un
overhead limitato.
Ridenominazione di account di Windows
relativi a utenti o gruppi
In SQL Server 2000 è possibile concedere ai gruppi e agli utenti di Windows le
autorizzazioni necessarie per accedere direttamente agli oggetti di un database. In
questo caso, il SID e i nomi degli utenti e dei gruppi di Windows vengono memorizzati
nella tabella sysusers.12
Quando l’amministratore di Windows rinomina un gruppo o un utente di Windows, la
modifica del nome non viene propagata a SQL Server 2000.
Sebbene questo possa sembrare un problema, consente in realtà di evitare una
notevole confusione.
Infatti, come nelle versioni precedenti, anche in SQL Server 2000 amministratori e
sviluppatori creano numerosi script Transact-SQL, trigger, stored procedure e così via.
Si supponga ad esempio che l’utente Susie Jones crei una tabella in un database. Il
nome di accesso di Susie è SUSIEJ e la tabella viene denominata
SUSIEJ.SALESDEMO. Susie concede ad altri utenti le autorizzazioni di accesso alla
propria tabella e molti colleghi creano viste e stored procedure basate su tale tabella. Si
supponga ora che, in seguito al matrimonio di Susie con Bob Taylor, il nome utente
venga modificato in SUSIET. Se la modifica venisse rilevata da SQL Server 2000, la
tabella di Susie verrebbe automaticamente rinominata in SUSIET.SALESDEMO e
costituirebbe quindi un oggetto completamente diverso.
Di conseguenza, le viste, le stored procedure e tutto il codice normalmente utilizzato
per accedere alla tabella smetterebbero di funzionare.
La ridenominazione degli account reali in Windows non viene automaticamente
propagata in SQL Server 2000 proprio per garantire una maggiore stabilità.
Per informazioni sul problema della ridenominazione in relazione ai nomi di accesso,
vedere la precedente sezione “Ridenominazione di account di Windows relativi a utenti
o gruppi” del presente documento.
12
40
Rimozione della tabella di sistema
sysprocedures
In SQL Server 6.5 e versioni precedenti, quando veniva creata una stored procedure il
testo della query veniva memorizzato nella tabella di sistema syscomments e nella
tabella di sistema sysprocedures veniva salvata una struttura di query normalizzata.
Durante il processo di normalizzazione, le istruzioni SQL venivano analizzate in modo
da ottenere formati più efficienti e gli oggetti a cui veniva fatto riferimento venivano
risolti nelle relative rappresentazioni interne. Alla successiva esecuzione della stored
procedure, la struttura veniva recuperata dalla tabella sysprocedures e utilizzata
come base per un piano di esecuzione ottimizzato, che veniva a sua volta memorizzato
nella cache delle procedure.13
Anche se apparentemente non esiste alcun legame tra questo processo e la protezione,
alcuni sviluppatori di software14 rimuovevano il testo SQL originale da syscomments
allo scopo di proteggere il codice sorgente. In effetti, il testo SQL originale non veniva
in genere riutilizzato fino al successivo aggiornamento del server a una nuova versione
di SQL Server o all’applicazione di un service pack. Per nascondere in modo più
efficiente il testo SQL originale agli utenti a cui non si desidera consentire l’accesso,
nella versione 6.0 di SQL Server Microsoft ha introdotto l’opzione WITH ENCRYPTION,
che consente di crittografare il testo SQL originale al momento della creazione della
stored procedure.
In SQL Server 7.0 e SQL Server 2000, invece, se un amministratore elimina le voci
appropriate dalla tabella syscomments, la stored procedure non può essere eseguita,
poiché in SQL Server 2000 la tabella sysprocedures è stata rimossa e il testo SQL
viene recuperato direttamente dalla tabella syscomments prima dell’esecuzione.
Opzione WITH GRANT
WITH GRANT è un’opzione facoltativa che può essere utilizzata con l’istruzione GRANT.
Tale opzione, che può essere applicata solo alle autorizzazioni per gli oggetti, consente
al destinatario dell’istruzione GRANT di trasferire ad altri tale autorizzazione.
Se ad esempio Bob ha utilizzato l’opzione WITH GRANT per concedere autorizzazioni
SELECT a Jane, quest’ultima potrà concedere autorizzazioni SELECT ad altri utenti.
Se Bob decide di revocare le autorizzazioni SELECT a Jane, può utilizzare l’opzione
CASCADE per revocare anche le autorizzazioni SELECT concesse da Jane ad altri utenti.
Questo approccio veniva utilizzato anche per le viste, le impostazioni predefinite,
le regole, i trigger e i vincoli CHECK e DEFAULT.
13
14
41
In particolare nelle versioni precedenti a SQL Server 6.0.
Tabella di sistema sysusers
Per alcuni aspetti, la tabella sysusers svolge per il database la stessa funzione svolta
dalla tabella sysxlogins per il server. La tabella sysusers, presente in ogni database,
contiene infatti le informazioni relative agli utenti a cui è concesso o negato l’accesso al
database.
Colonna hasdbaccess
La colonna hasdbaccess funziona in modo analogo alla colonna hasaccess della
tabella sysxlogins. In questo caso, il flag viene impostato su zero quando un utente
crea oggetti senza disporre di diritti di accesso al database concessi in modo esplicito,
viene autorizzato in modo esplicito oppure viene aggiunto a un ruolo in modo esplicito.
Gli oggetti creati da un determinato utente appartengono sempre a quest’ultimo, e non
al gruppo attraverso il quale l’utente ha effettuato l’accesso al database,15 a meno che
un utente appartenente a un ruolo o a un gruppo di Windows non indichi esplicitamente
il ruolo o il gruppo come proprietario dell’oggetto al momento della creazione di
quest’ultimo.16 In tal caso, affinché per l’oggetto venga impostato il proprietario
corretto, è necessario creare una voce per l’utente nella tabella sysusers. La voce
viene creata automaticamente, ma poiché il flag hasaccess è impostato su zero,
l’utente non ottiene l’accesso esplicito al database.
La colonna hasdbaccess è impostata su zero anche per i ruoli, ugualmente elencati
nella tabella sysusers.
Tabella di sistema sysmembers
La tabella di sistema sysmembers, una delle più piccole, contiene solo due colonne
e viene utilizzata per registrare l’appartenenza degli utenti ai ruoli del database.
Questa tabella contiene una riga per ogni membro di un ruolo del database.
Per migliorare le prestazioni legate ai ruoli, in SQL Server 2000 la prima
appartenenza di un determinato utente a un ruolo viene inserita nella colonna gid
della tabella sysusers. In questo modo, quando SQL Server 2000 tenta di identificare
tutti i ruoli a cui appartiene un determinato utente, se la colonna gid della tabella
sysusers ha valore zero non è necessario eseguire una query sulla tabella
sysmembers. Se invece il valore della colonna è diverso da zero, significa che la
voce specifica un ruolo ed è necessario eseguire una query sulla tabella sysmembers
per ottenere l’elenco completo dei ruoli a cui l’utente appartiene.
Questo è importante, perché un utente può essere membro di più gruppi. In questo
caso non è infatti possibile determinare automaticamente il gruppo da impostare come
proprietario dell’oggetto.
15
16
Di seguito è riportato un esempio di sintassi valida:
CREATE TABLE [builtin\administrators].test_table(acolumn VARCHAR(2))
42
Tabella di sistema syspermissions
La tabella di sistema syspermissions, presente in tutti i database, è stata introdotta
in SQL Server 7.0. Nelle versioni precedenti tutte le autorizzazioni venivano gestite
utilizzando la tabella di sistema sysprotects. La tabella syspermissions viene
attualmente utilizzata per tenere traccia delle autorizzazioni concesse o negate agli
utenti. Per ulteriori informazioni sulla compatibilità con la tabella sysprotects delle
versioni precedenti, vedere la sezione “Tabella di sistema sysprotects”.
La tabella di sistema syspermissions contiene un numero di colonne piuttosto
limitato. La colonna id fa riferimento agli ID di oggetto per cui sono state concesse
o negate le autorizzazioni. Per le autorizzazioni relative alle istruzioni, questa colonna
è impostata su zero.
Le colonne grantor e grantee indicano l’utente che concede le autorizzazioni e
il beneficiario, identificati specificando l’ID del ruolo, dell’utente di Windows o del
gruppo di Windows, secondo quanto riportato nella tabella sysusers.
La colonna actadd fa riferimento alle autorizzazioni concesse per tutte le colonne
dell’oggetto, se si tratta di una tabella, mentre la colonna actmod fa riferimento
alle autorizzazioni negate per tutte le colonne dell’oggetto, sempre nel caso di una
tabella.
Le restanti colonne vengono utilizzate solo se vengono implementate autorizzazioni
a livello di colonna. La colonna seladd viene utilizzata per le autorizzazioni SELECT
concesse e contiene una mappa di bit delle colonne per le quali è stato concesso
questo tipo di autorizzazione. Poiché gli ID delle colonne non vengono mai riutilizzati,
l’approccio basato sulla mappa di bit risulta estremamente efficiente. La colonna
selmod contiene invece le autorizzazioni SELECT negate.
Le due colonne successive vengono utilizzate in modo analogo alle precedenti, ma
riguardano le autorizzazioni UPDATE.
Le ultime due colonne si riferiscono alle autorizzazioni REFERENCES e vengono
implementate come le quattro precedenti.
Tabella di sistema sysprotects
L’implementazione della tabella di sistema sysprotects è stata modificata rispetto alle
versioni precedenti. In SQL Server 6.5 e versioni precedenti, nella tabella sysprotects
venivano memorizzate le autorizzazioni per gli oggetti, mentre in SQL Server 7.0 e SQL
Server 2000 queste informazioni vengono memorizzate nella tabella syspermissions.
In genere, nei casi in cui è stata modificata l’implementazione di una tabella di sistema
Microsoft ha fornito una vista per garantire la compatibilità con le versioni precedenti.
Ad esempio, nel caso della tabella master..sysxlogins per garantire la compatibilità
con le versioni precedenti viene ora fornita la vista syslogins.
Nel caso della tabella di sistema sysprotects, tuttavia, poiché la tabella di sistema
sottostante è stata modificata in modo più radicale, non è stato possibile creare una
vista in grado di fornire la compatibilità con le versioni precedenti in modo efficiente.
Per questo motivo, anziché implementare la vista sysprotects Microsoft ha preferito
creare una speciale tabella di nome sysprotects, che viene rilevata dal sistema come
una tabella qualsiasi, ma che in realtà viene creata dinamicamente secondo le
esigenze.
43
Poiché non dispone di pagine di dati persistenti, la tabella sysprotects ha pertanto un
funzionamento analogo a quello delle viste, che viene implementato dal motore di
database, e l’oggetto sysprotects appare come una tabella contenuta nella tabella
sysobjects.
Autorizzazioni Named Pipes
e Multiprotocol
Per comprendere il funzionamento della protezione interna di SQL Server 2000,
è importante comprendere un concetto chiave spesso trascurato. Sebbene non
costituisca una novità di SQL Server 2000, tale concetto viene illustrato in questo
contesto per fornire una trattazione più completa.
La libreria di rete Named Pipes rappresenta un meccanismo di comunicazione tra
processi (IPC, Inter Process Communications) che viene implementato mediante
la condivisione IPC$ in Windows. Quando un client si connette a SQL Server tramite
la libreria di rete Named Pipes, viene stabilita una connessione alla condivisione IPC$
e, in questa fase, viene eseguita anche l’autenticazione. Questo aspetto non era stato
approfondito durante la descrizione delle nuove funzionalità di protezione. Dopo
l’autenticazione del client da parte di Windows, che viene eseguita come per l’accesso
a qualsiasi altra risorsa, viene creata una sessione Named Pipes basata sulla
condivisione IPC$. Tale operazione viene completata prima di tentare il passaggio
della connessione a SQL Server.
Tutti gli utenti che effettuano la connessione a SQL Server 2000 mediante la libreria
di rete Named Pipes devono pertanto disporre di un account di Windows e delle
autorizzazioni di Windows necessarie per l’accesso alla condivisione IPC$.
Se non si desidera eseguire questo tipo di autenticazione, è necessario utilizzare
un’altra libreria di rete, come TCP/IP Sockets o Multiprotocol, poiché tali connessioni
non vengono convalidate nella condivisione IPC$ di Windows NT. TCP/IP Sockets è
la libreria di rete predefinita di SQL Server 2000.
Se si utilizza la libreria di rete Multiprotocol, l’autenticazione di Windows viene
comunque eseguita prima del passaggio della connessione a SQL Server 2000, poiché
i servizi RPC (Remote Procedure Call) di runtime effettuano l’autenticazione del client
quando viene richiesta la connessione. Pertanto, come per la libreria di rete Named
Pipes, per Multiprotocol è necessario un account di Windows valido.
Si noti tuttavia che la libreria di rete Multiprotocol non consente di eseguire la
connessione alle istanze denominate di SQL Server 2000 e non è più necessaria,
poiché tutte le librerie di rete supportano la crittografia.
Per gestire gli utenti che non dispongono di un account di Windows e desiderano
connettersi mediante le librerie di rete Named Pipes o Multiprotocol, è possibile
attivare l’account guest di Windows. Quando richiedono una sessione, questi utenti
possono connettersi a Windows utilizzando l’account utente guest e tentare l’accesso
a SQL Server. Tuttavia, poiché l’attivazione dell’account guest comporta una
riduzione del livello di protezione dell’intero ambiente Windows, questa soluzione è
in genere sconsigliata. È stata illustrata in questo contesto solo come soluzione da
adottare in caso di estrema necessità.
44
Aggiornamento da SQL Server 7.0
L’architettura di protezione non è stata modificata nel passaggio da SQL Server 7.0
a SQL Server 2000. Per informazioni sulle nuove funzionalità di protezione di SQL
Server 2000, vedere la sezione “Nuove funzionalità di protezione di SQL Server 2000”
del presente documento.
Aggiornamento da SQL Server 6.5
Il modello di protezione di SQL Server 6.5, diverso da quello di SQL Server 6.0, è stato
ulteriormente modificato in SQL Server 2000 allo scopo di rendere più pratico
l’ambiente di lavoro di SQL Server. A causa di questa modifica, quando si esegue
l’aggiornamento è necessario controllare accuratamente le autorizzazioni.
Considerazioni sull’aggiornamento
Le informazioni fornite in questa sezione sono applicabili solo all’aggiornamento dalla
modalità integrata o mista di SQL Server 6.5. L’aggiornamento da un computer che
esegue SQL Server 6.5 in modalità standard non comporta problemi di sicurezza.
Microsoft consiglia tuttavia di utilizzare nell’ambiente aggiornato le nuove funzionalità
di protezione offerte dalla modalità di autenticazione di Windows. Per garantire il
corretto aggiornamento delle impostazioni di protezione di SQL Server 6.x è necessario
pianificare accuratamente l’aggiornamento e preparare l’ambiente di sicurezza.
Processo di aggiornamento
Il processo di aggiornamento può essere eseguito direttamente in un computer oppure
in modalità remota da un altro computer. Da un punto di vista logico, l’aggiornamento
di un singolo computer equivale a un aggiornamento con due computer in cui i
computer di origine e di destinazione coincidono. Questi due computer sono detti server
di origine e server di destinazione. Nel server di origine deve essere installato SQL
Server 6.0 o SQL Server 6.5, mentre nel server di destinazione deve essere installato
SQL Server 2000.
Durante l’aggiornamento della versione viene eseguito un programma che apre la
chiave del Registro di sistema integrata in SQL Server 6.5, nel computer di origine, e
vengono letti i SID di tutti gli account a cui è stato concesso l’accesso integrato. Gli
account per cui è configurata la protezione integrata nel server di origine possono
essere costituiti da gruppi globali o locali di Windows o da utenti di Windows. Gli utenti
e i gruppi globali possono appartenere a un dominio locale, se SQL Server 2000 viene
eseguito in un member server, oppure possono essere costituiti da account di un
dominio trusted. Se SQL Server 2000 è installato in un domain controller, i gruppi locali
possono essere costituiti da gruppi locali del dominio a cui appartiene il domain
controller oppure da gruppi locali del member server.
Durante i processi di drill-down e di mapping degli account, gli account a cui sono state
concesse autorizzazioni amministrative nel server di origine vengono ignorati.
Nota: nel computer che esegue SQL Server 2000, per ciascun account di Windows
configurato per l’utilizzo della protezione integrata in SQL Server 6.5 viene eseguita
l’istruzione sp_grantlogin. Poiché lo strumento SQL Security Manager incluso in SQL
Server 6.5 eseguiva l’istruzione xp_grantlogin, il processo di aggiornamento
riproduce le operazioni effettuate nella versione precedente.
45
Analisi dell’output del processo
di aggiornamento
I problemi di protezione che emergono in seguito all’aggiornamento derivano in genere
dal fatto che, poiché in SQL Server 6.5 la protezione integrata veniva implementata
attraverso la protezione di una chiave del Registro di sistema, potevano accedere al
server solo gli utenti che avevano accesso a tale chiave. Per ulteriori informazioni,
vedere la sezione “Utilizzo di identificatori di protezione (SID)” del presente documento.
Le autorizzazioni relative alla chiave del Registro di sistema erano collegate agli
account di accesso utente memorizzati nella tabella syslogins.
In SQL Server 2000 questo metodo di protezione non viene più utilizzato, poiché
l’accesso al server viene concesso in base ai SID degli utenti o dei gruppi di Windows.
Di conseguenza, il processo di aggiornamento non è sempre in grado di identificare i
requisiti di protezione originali. Questo avviene in genere quando l’ambiente di
protezione di SQL Server non è aggiornato o l’aggiornamento è destinato a un
ambiente diverso.
La tabella che segue (figura 8) mostra come appaiono gli account di accesso in SQL
Server Enterprise Manager dopo un aggiornamento.
Nome
Tipo
Accesso
al server
Database
predefinito
utente1
Standard
Autorizzato
Master
1
a#utente2
Standard
Autorizzato
Master
2
BUILTIN\Administrators
Gruppo
Windows
Autorizzato
Master
DOM3\SQLUsers
Gruppo
Windows
Autorizzato
Master
4
DOM3_utente#3
Standard
Autorizzato
Master
5
DOM3_Administrator
Standard
Autorizzato
Master
6
REDMOND\a utente4
Utente
Windows
Tramite
gruppo
Master
7
REDMOND\utente5
Utente
Windows
Tramite
gruppo
Master
8
Utente
dbo
Riga
3
Figura 8: account di accesso visualizzati in SQL Server Enterprise Manager dopo l’aggiornamento
a SQL Server 2000.
Il contenuto della tabella è illustrato nelle sezioni successive.
Eliminazione degli utenti
Le righe 1 e 2 della tabella precedente vengono create quando gli utenti in questione
non vengono trovati nella directory degli utenti di Windows. In particolare, se la stored
procedure di sistema xp_logininfo non restituisce il nome utente, l’account viene
convertito in un account di accesso standard, come quelli riportati nelle prime due righe
della tabella. Il carattere “#” presente nella riga 2 rappresenta uno spazio, poiché in
SQL Server 6.5 e versioni precedenti i caratteri speciali non erano supportati.
46
Account dell’amministratore
Il gruppo locale BUILTIN\Administrators riportato nella riga 3 della tabella è stato
associato all’alias dell’utente dbo del database master.
Utenti dei domini trusted
La riga 4 della tabella fa riferimento al gruppo DOM3\SQLUsers, un gruppo globale di
un dominio trusted. I membri di questo gruppo dispongono di diritti di accesso di
gruppo, oltre ai diritti di accesso concessi a livello di utente nell’ambito della protezione
standard, come avviene in SQL Server 6.5 e versioni precedenti.
In questo modo è stata garantita la compatibilità con la protezione standard delle
versioni precedenti.
Si consideri ora l’account Administrator indicato nella riga 6. All’account
dell’amministratore di Windows del dominio DOM3 erano stati concessi diritti di
accesso utente prima dell’aggiornamento. Tali diritti sono stati mantenuti. Tutti gli
accessi a livello di utente verranno elaborati allo stesso modo.
Utenti del dominio predefinito corrente
Gli utenti del dominio predefinito corrente, in base alla configurazione di SQL Server 6.x
in vigore prima dell’aggiornamento, vengono aggiornati come indicato nelle righe 7 e 8.
Si notino il tipo di account e la presenza dello spazio nella riga 7. SQL Server 2000
supporta infatti l’uso di caratteri speciali nei nomi di account.
Preparazione dell’ambiente di protezione
di SQL Server 6.5
Microsoft consiglia di eliminare completamente le impostazioni di protezione prima
di eseguire l’aggiornamento. Per garantire la sincronizzazione fra tutti gli account di
Windows e SQL Server, è necessario eseguire SQL Security Manager. Se si prepara
adeguatamente dell’ambiente, le probabilità di completare correttamente
l’aggiornamento aumentano.
Monitoraggio delle singole fasi dell’aggiornamento
Monitorare il processo di aggiornamento e prevedere l’esito dell’aggiornamento dei
gruppi e degli account utente è facile, poiché la procedura di aggiornamento guidato
di SQL Server consente di sospendere il processo dopo ogni passaggio. Selezionando
l’opzione di interruzione dopo ciascun passaggio è possibile analizzare l’output delle
prime fasi dell’aggiornamento della protezione, contenuto nei file loginmap.sid e
loginmap.txt. Se il contenuto di questi file di testo non risulta corretto, è possibile
modificarlo prima di proseguire.
Nota: la modifica dei file loginmap.sid e loginmap.txt durante l’aggiornamento non
è supportata da Microsoft.
47
Problemi connessi all’aggiornamento a un nuovo dominio
Se si esegue l’aggiornamento da SQL Server 6.x mediante il metodo basato su nastro,
è necessario evitare di eseguire il backup del database in un dominio per poi effettuare
l’aggiornamento in un altro dominio, poiché la stored procedure xp_logininfo potrebbe
non trovare più gli account definiti nel dominio originale e, nel caso li trovasse, non si
tratterebbe comunque degli stessi account, ma solo di account con lo stesso nome.
I diritti di accesso verrebbero infatti gestiti come se gli account fossero stati eliminati.
Per ulteriori informazioni, vedere “Eliminazione degli utenti”.
Eliminazione della necessità di eseguire il mapping
dei caratteri
Non è necessario eseguire il mapping dei caratteri, perché SQL Server 2000 supporta
l’uso di spazi e barre rovesciate nei nomi degli account.
In SQL Server 6.5 e versioni precedenti, per gestire i nomi degli account di Windows NT
contenenti caratteri speciali, come la barra rovesciata (\), era invece necessario
configurare il mapping dei caratteri. Per questo scopo, in SQL Server 6.5 e versioni
precedenti erano disponibili i seguenti caratteri di mapping: “#”, “_” e “$”.
Evitare di utilizzare l’account sa
In SQL Server 6.5 e versioni precedenti, per eseguire la maggior parte delle attività
amministrative era necessario accedere a SQL Server utilizzando l’account
dell’amministratore di sistema (sa). Per questo motivo, l’accesso amministrativo veniva
spesso fornito a un numero di utenti elevato.
In SQL Server 2000 si consiglia di assegnare al ruolo predefinito del server sysadmin
tutti gli utenti di Windows NT a cui vengono concessi diritti di tipo sa.
Per ulteriori informazioni, vedere la sezione “Problemi connessi all’utilizzo dell’account
sa” del presente documento.
Problemi connessi all’utilizzo degli alias
Per garantire la compatibilità con le versioni precedenti SQL Server 2000 supporta l’uso
degli alias degli account utente all’interno dei database, ma nella nuova versione è
preferibile utilizzare i ruoli, che offrono funzionalità analoghe ma sono più potenti. Per
ulteriori informazioni, vedere la sezione “Ruoli definiti dall’utente” del presente
documento.
48
Protezione dell’installazione
di SQL Server 2000
Le informazioni presentate in questa sezione sono applicabili esclusivamente alle
installazioni di SQL Server 2000 in Windows NT o Windows 2000, poiché gli ambienti
Windows 98 e Windows Me non dispongono delle funzionalità di protezione illustrate.
In questa sezione si presuppone che SQL Server 2000 sia stato configurato con la
modalità di autenticazione di Windows, come previsto dall’installazione predefinita, che
offre il livello di protezione massimo.
Problemi connessi all’utilizzo dell’account sa
Per concedere l’accesso a SQL Server a tutti gli amministratori di SQL Server è
consigliabile utilizzare l’appartenenza ai gruppi di Windows, definendo questi ultimi
come membri del ruolo sysadmin del server. Questo approccio presenta un piccolo
svantaggio perché, avendo la possibilità di aggiungere utenti ai gruppi di Windows, gli
amministratori di Windows possono attribuire le autorizzazioni sysadmin di SQL Server
2000 a qualsiasi utente.
Se in un determinato sito si desidera evitare che gli amministratori di Windows possano
ottenere o fornire ad altri l’accesso sysadmin a SQL Server, è necessario assegnare al
ruolo sysadmin solo singoli account di Windows.
In ogni caso, è preferibile evitare di utilizzare l’account sa per l’amministrazione
quotidiana e assegnare a tale account una password difficilmente violabile, da
conservare in cassaforte e utilizzare solo in caso di emergenza.
Se si esegue SQL Server 2000 in modalità di autenticazione di Windows, come
suggerito nel presente documento, non è possibile accedere mediante l’account sa,
poiché sono consentite solo connessioni trusted.
Nota: sebbene l’account sa non possa essere utilizzato per accedere a SQL Server
2000 quando si utilizza la modalità di autenticazione mista, è comunque importante per
assegnare una password a tale account, poiché basta una piccola modifica al Registro
di sistema per passare dalla modalità di autenticazione alla modalità mista. 17 Se
l’account sa non dispone di password, come previsto dall’installazione predefinita, può
essere utilizzato da un utente non autorizzato o dall’amministratore di Windows per
accedere al server. Per informazioni su come ridurre la probabilità di un attacco di
questo tipo, vedere la sezione “Registro di sistema”.
17
La modalità di accesso è configurata nella seguente chiave del Registro di sistema:
HKLM/Software/microsoft/MSSQLServer/MSSQLServer/LoginMode
Il valore è 0 corrisponde alla modalità mista, mentre il valore 1
corrisponde alla modalità di autenticazione di Windows.
49
Account di servizio
SQL Server 2000 è costituito da tre servizi di Windows:

MSSQLServer oppure MSSQL$InstanceName (per le istanze denominate).
È il motore che fornisce le funzionalità principali di SQL Server.

SQLServerAgent oppure SQLAgent$InstanceName (per un’istanza denominata).
Fornisce le funzionalità per la pianificazione dei comandi e delle repliche regolari,
un metodo per la gestione degli errori, la possibilità di contattare gli operatori di
SQL Server in caso di errore e altre funzioni di supporto.

Servizio Microsoft Search. Fornisce la funzionalità di ricerca full-text. Questo
servizio deve essere sempre configurato in modo da utilizzare l’account di sistema
locale.
I servizi SQL Server e Agente SQL Server possono essere invece configurati in modo
da utilizzare uno dei seguenti tipi di account di Windows:

Account di servizio locale

Account utente locale

Account utente di dominio
Il tipo di account da utilizzare dipende dalle funzionalità di SQL Server 2000 richieste.
È possibile configurare entrambi i servizi in modo da utilizzare lo stesso account utente
di Windows.
Per modificare un account di servizio dopo l’installazione del server, è necessario
utilizzare SQL Server Enterprise Manager. Infatti, sebbene gli account dei servizi SQL
Server e Agente SQL Server possano essere modificati anche dal Pannello di controllo,
questo metodo è sconsigliato poiché non consente di mantenere la sincronizzazione dei
dettagli della configurazione per il servizio Microsoft Search.
Le modifiche eventualmente apportate alle informazioni dell’account vengono applicate
al successivo avvio del servizio. È possibile configurare i servizi SQL Server e Agente
SQL Server in modo da utilizzare account di Windows diversi, ma questa procedura è in
genere sconsigliata. In caso di modifica dell’account di servizio, le modifiche devono
essere apportate a entrambi i servizi, poiché vengono configurati separatamente.
Per ridurre gli interventi amministrativi negli ambienti multiserver, è possibile utilizzare
un unico account utente di dominio per tutti i server SQL Server 2000 dell’azienda.
50
Account di sistema locale
Se SQL Server non è configurato per la replica e non richiede l’accesso a risorse di rete,
è possibile eseguire SQL Server 2000 utilizzando l’account di sistema locale.
Per la corretta esecuzione delle attività del servizio, l’account di sistema locale utilizzato
da SQL Server 2000 deve disporre delle autorizzazioni elencate di seguito, che vengono
assegnate automaticamente dal programma di installazione.

Controllo completo sulla directory di SQL Server, che per impostazione predefinita è
\Programmi\Microsoft SQL Server\MSSQL.

Controllo completo su tutti i file di database con estensione mdf, ndf e ldf.

Controllo completo sulle seguenti chiavi del Registro di sistema e sulle relative
sottochiavi:

HKEY_LOCAL_MACHINE\Software\
Microsoft\MSSQLServer

HKEY_LOCAL_MACHINE\System\
CurrentControlset\Services\MSSQLServer

Per le istanze denominate le chiavi sono:

HKEY_LOCAL_MACHINE\Software\
Microsoft\Microsoft SQL Server\NomeIstanza

HKEY_LOCAL_MACHINE\System\
CurrentControlset\Services\MSSQL$NomeIstanza
Account utente locale
Se SQL Server 2000 è configurato per l’utilizzo di un account utente locale, vengono
applicate le stesse restrizioni impostate per il sistema locale, con il seguente requisito
aggiuntivo, concesso per impostazione predefinita dal programma di installazione:

L’account utente deve disporre dell’autorizzazione Accesso come servizio.
Account utente di dominio
La configurazione di SQL Server 2000 con un account utente di dominio garantisce il
massimo livello di flessibilità, poiché consente di usufruire, fra le altre, delle seguenti
funzionalità:

Replica

Backup e ripristino da unità di rete

Join eterogenei che coinvolgono origini dati remote

Funzioni di posta elettronica dell’Agente SQL Server e di SQL Mail
Per la corretta esecuzione delle attività di SQL Server 2000 è necessario che l’account
utente di dominio venga configurato come l’account utente locale precedentemente
illustrato. Alcune funzionalità estese, tuttavia, sono disponibili solo se si aggiungono
ulteriori autorizzazioni, come indicato nella tabella che segue (figura 9).
51
Servizio
Autorizzazione
Funzionalità
SQL Server
Autorizzazioni di scrittura in rete.
Possibilità di eseguire operazioni
di lettura e scrittura per il
caricamento dei dati, il backup
remoto e così via.
SQL Server
Agire come parte del sistema
operativo e sostituire un token a
livello di processo.
Esecuzione di xp_cmdshell
da parte di un utente diverso
dall’amministratore di SQL Server.
Agente SQL
Server
Membro del gruppo locale
Administrators.
Creazione di processi CmdExec
e ActiveScript di proprietà di utenti
diversi dall’amministratore
di SQL Server.
Agente SQL
Server
Membro del gruppo locale
Administrators.
Utilizzo della funzione di riavvio
automatico.
Agente SQL
Server
Membro del gruppo locale
Administrators.
Utilizzo dei processi eseguiti quando
il computer è inattivo.
Figura 9: autorizzazioni richieste per l’uso delle funzionalità estese di SQL Server 2000.
Per fornire a SQL Server 2000 il massimo livello di funzionalità, si consiglia di utilizzare
un account utente di dominio membro del gruppo Administrators locale.
File system
Windows offre un’eccellente infrastruttura per la protezione degli oggetti del sistema
operativo, come i file. Microsoft consiglia di applicare l’autorizzazione NTFS per i file ai
file di dati e di log di tutti i database. L’account utente che deve essere utilizzato da
SQL Server 2000 deve invece disporre di autorizzazioni di controllo completo per i file
di database, mentre tutti i file di SQL Server 2000, inclusi i file eseguibili e le librerie a
collegamento dinamico (DLL, Dynamic Link Library), devono essere configurati in modo
da impedirne la manipolazione da parte degli utenti. Le autorizzazioni per questi file
devono essere impostate in modo da attribuire autorizzazioni di controllo completo
all’account utente utilizzato da SQL Server, al gruppo Administrators e all’account di
sistema locale. È preferibile non impostare altre autorizzazioni.
Il programma di installazione di SQL Server 2000 concede automaticamente le
autorizzazioni di controllo completo per i file associati a SQL Server sia agli account
di servizio, sia al gruppo locale degli amministratori.
Registro di sistema
Per proteggere l’installazione di SQL Server 2000 da eventuali attacchi al sistema
di protezione da parte degli utenti autorizzati ad accedere fisicamente al server, è
opportuno impostare le autorizzazioni di Windows appropriate per le chiavi del
Registro di sistema utilizzate per la configurazione di SQL Server 2000, in particolare,
per la chiave HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\MSSQLSERVER e le
relative sottochiavi, per un’istanza predefinita, oppure per la chiave
HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\MICROSOFT SQL
SERVER\NOMEISTANZA e le relative sottochiavi, per le istanze denominate. Si
consiglia pertanto di rimuovere dal gruppo everyone le autorizzazioni relative a tale
chiave e di aggiungere autorizzazioni di controllo completo al gruppo
Administrators, all’account di sistema locale e all’account di servizio di SQL Server.
Per gli account di servizio selezionati durante il processo di installazione, queste
operazioni vengono eseguite automaticamente dal programma di installazione.
52
L’impostazione delle autorizzazioni relative alle chiavi del Registro di sistema è
particolarmente importante quando gli amministratori di SQL Server desiderano
impedire agli amministratori di Windows di accedere a SQL Server. In questo caso,
poiché gli amministratori di SQL Server devono assumere la proprietà della chiave
appropriata del Registro di sistema e rimuovere le autorizzazioni dal gruppo
Administrators, è essenziale che l’account di servizio di SQL Server disponga
di autorizzazioni di controllo completo. Sebbene non impedisca l’accesso da parte
degli amministratori, questo metodo consente agli amministratori di SQL Server
di scoprire se la sicurezza è stata compromessa dagli amministratori di Windows.
Gli amministratori possono sempre assumere la proprietà, ma non assegnarla.
Per ulteriori informazioni sull’accesso a SQL Server da parte degli amministratori
di Windows, vedere la sezione “Problemi connessi all’utilizzo dell’account sa” del
presente documento.
Controllo
SQL Server 2000 consente di utilizzare il log eventi di Windows per controllare l’accesso
al server. Per configurare il livello di controllo è possibile utilizzare SQL Server
Enterprise Manager o la stored procedure estesa xp_loginconfig.
Le impostazioni di controllo disponibili sono elencate di seguito.

Nessuno. Non vengono registrate informazioni di controllo.

Esito positivo. Vengono registrati solo gli accessi con esito positivo.

Esito negativo. Vengono registrati solo gli accessi con esito negativo.

Tutti. Vengono registrati tutti gli accessi, indipendentemente dall’esito.
Le informazioni di controllo vengono scritte nel log degli errori di SQL Server 2000.
Profiling per il controllo
In SQL Server 2000 è disponibile uno strumento di profiling estremamente potente,
SQL Profiler, che consente di analizzare numerosi eventi interni di SQL Server e
fornisce funzionalità complete per il controllo della protezione.
SQL Profiler acquisisce e analizza tutte le azioni eseguite in SQL Server. Le informazioni
acquisite possono essere visualizzate in tempo reale sullo schermo, salvate in un file di
testo oppure inserite in una tabella di SQL Server.
SQL Profiler consente di acquisire praticamente tutti gli eventi di SQL Server, inclusi i
seguenti:

Attività dell’utente finale: comandi SQL, connessioni e disconnessioni, attivazione
dei ruoli applicazione.

Attività DBA: DDL (ad eccezione di GRANT, REVOKE e DENY ed eventi di
protezione) e configurazione del server o di un database.

Eventi di protezione: GRANT, REVOKE e DENY, accesso utente o ruolo, aggiunta,
rimozione o configurazione.

Eventi delle utilità: comandi backup, restore, bulk insert, bcp e DBCC.

Eventi del server: chiusura, sospensione e avvio.

Eventi di controllo: aggiunta, modifica e interruzione del controllo.
53
Queste informazioni sono di grande aiuto per stabilire quali operazioni sono state
eseguite, quando e da chi. Per ulteriori informazioni sull’attivazione del controllo, ad
esempio sulla creazione di una stored procedure da eseguire all’avvio del sistema,
vedere la documentazione in linea di SQL Server 2000.
In alternativa, è possibile utilizzare la modalità di controllo C2, che prevede
l’acquisizione di tutti gli eventi associati al controllo e di tutte le colonne di dati relative
a tali eventi. Poiché può generare in breve tempo volumi di dati estremamente elevati,
si consiglia di utilizzare questa modalità solo se si installa SQL Server 2000 in una
configurazione C2. Per ulteriori informazioni, vedere la documentazione in linea di SQL
Server 2000.
Backup e ripristino
Protezione di file e supporti di backup
Per un backup sicuro, si consiglia di creare i file di backup con SQL Server 2000, per
poi utilizzare il programma di backup di Windows NT per eseguire il backup di tali file
sui supporti applicandovi una password, di modo che possano essere ripristinati solo da
utenti che conoscono tale password. SQL Server 2000 supporta l’impostazione di una
password direttamente su un set di backup.
Si consiglia di collocare i file di dati di backup in una partizione NTFS in cui le
autorizzazioni per le directory siano impostate in modo da impedire l’accesso ai file da
parte degli utenti comuni.
Se è possibile proteggere fisicamente i supporti di backup, la creazione di copie di
backup standard con SQL Server 2000 non comporta rischi di sicurezza. Infatti, poiché i
dati veri e propri non sono crittografati, possono essere letti anche se i supporti sono
protetti da password, a meno che non siano protetti anche fisicamente.
Ripristino in un altro server
Per quanto riguarda il ripristino del database in un altro server, verranno illustrati tre
scenari specifici. Il primo è applicabile quando il server di origine e il server di
destinazione del database utilizzano la modalità di autenticazione mista.
Il secondo e il terzo scenario sono applicabili quando viene utilizzata l’autenticazione di
Windows ma, mentre nel secondo scenario il database viene ripristinato nello stesso
dominio, nel terzo viene ripristinato in un server di un altro dominio.
Modalità mista
Quando si ripristina un database in un server protetto con la modalità mista, non è
possibile applicare la protezione a livello di database, perché gli accessi memorizzati
nella tabella sysxlogins del database master e i diritti utente per l’accesso a un
determinato database vengono memorizzati nella tabella sysusers di tale database.
Tra le voci delle tabelle sysxlogins e sysusers relative a un determinato utente esiste
pertanto una connessione logica, costituita da un GUID di 16 byte. Per ulteriori
informazioni, vedere la sezione “Generazione di GUID per utenti non trusted” del
presente documento.
54
A causa di questa implementazione basata sui GUID, se si utilizza la modalità mista e si
ripristina un database in un computer SQL Server 2000 diverso da quello in cui è stato
concesso l’accesso al database, il collegamento tra la tabella sysxlogins e la tabella
sysusers viene interrotto e nessuno potrà più accedere al database, a parte i membri
del gruppo sysadmin. Sarà quindi necessario ricreare tutte le appartenenze ai ruoli e
le autorizzazioni degli utenti.
Autenticazione di Windows (ripristino all’interno
dello stesso dominio)
Se il database viene ripristinato in un altro computer SQL Server 2000 dello stesso
dominio, le autorizzazioni impostare nel database non subiscono alcuna modifica.
L’unico problema può essere costituito dalla necessità di concedere agli utenti le
autorizzazioni di accesso al server. L’autorizzazione di accesso al server viene
implementata in tutte le istanze di SQL Server.
Si supponga ad esempio che Bob sia membro del gruppo SALES e che tale gruppo sia
autorizzato ad accedere a SQLSERVER1. Se a Bob viene concesso il diritto di accesso al
database delle vendite, quando tale database viene ripristinato in SQLSERVER2 le
autorizzazioni di Bob sono ancora presenti, ma Bob non può utilizzare il database
perché il gruppo SALES non è autorizzato ad accedere al nuovo server. Se tuttavia
l’amministratore concede al gruppo EVERYONE i diritti di accesso al server, Bob può
ancora utilizzare il database, perché l’accesso al server costituiva l’unico ostacolo
all’utilizzo del database sales.
Pertanto, quando si ripristina un database in un altro server dello stesso dominio, le
autorizzazioni a livello di database rimangono invariate, ma può essere necessario
concedere le autorizzazioni di accesso al nuovo server.
Autenticazione di Windows (ripristino all’interno
di un altro dominio)
Se il database viene ripristinato in un altro dominio, possono presentarsi vari scenari, a
seconda degli utenti che desiderano accedere al database.
Utenti dei domini trusted
Se tra il dominio di origine e il nuovo dominio sussiste una relazione di trust, grazie alla
quale il dominio di origine viene riconosciuto come trusted da quello nuovo, gli utenti
del dominio di origine autorizzati ad accedere a SQL Server manterranno
completamente le autorizzazioni relative ai database, mentre gli utenti degli altri
domini trusted e gli utenti del nuovo dominio non disporranno di diritti di accesso ai
database.
Utenti del nuovo dominio
Gli utenti del nuovo dominio non sono autorizzati ad accedere ai database, perché i
relativi SID non sono presenti nelle tabelle sysusers dei database.
L’unica eccezione è costituita dagli account BUILTIN di Windows, che utilizzano gli
stessi SID in tutti i server. Le autorizzazioni concesse agli account BUILTIN, come
il gruppo locale Administrators, rimangono pertanto invariate. In questo caso si
presuppone che gli account BUILTIN dispongano di diritti di accesso e che SQL Server
sia installato in un domain controller.
55
Utenti di qualsiasi dominio con nome utente e password
invariati
Nella maggior parte delle implementazioni della protezione Windows, quando
è richiesto l’accesso a una risorsa non inclusa nel dominio specifico dell’utente
quest’ultimo può accedere a tale risorsa solo se esiste un account utente con
la stessa combinazione di nome utente e password. In questo caso, il funzionamento
è trasparente.
Se per la connessione al server vengono utilizzate named pipe, è innanzitutto
necessario stabilire una connessione a una condivisione di file. Questo metodo
funziona anche se l’utente desidera utilizzare un account con un altro nome, purché
utilizzi un computer dotato di Windows. Se a un utente che tenta di connettersi
a una risorsa di file da un computer Windows NT 4.0 o Windows 2000 viene negata
la connessione, e tale utente non utilizza attualmente altre credenziali sul computer
di destinazione, è possibile fornire un nuovo nome utente e una nuova password di
accesso.
Connessione e disconnessione di file
di database
I problemi associati alla connessione e alla disconnessione di file di database sono
analoghi a quelli illustrati nella sezione “Ripristino in un altro server” del presente
documento, ma in questo caso è necessario creare il database prima di ripristinare i dati.
Configurazione generali della protezione
di Windows
Poiché SQL Server 2000 si basa sull’architettura di protezione di Windows, tutti i
principi di sicurezza di Windows possono essere applicati anche ai server Windows che
eseguono SQL Server 2000.
Disattivazione dell’account Guest di Windows
Quando SQL Server 2000 viene eseguito in modalità di autenticazione di Windows,
utilizza Windows per tutte le operazioni di autenticazione dei client. Viene quindi
implementata la stessa infrastruttura di protezione di Windows, con i relativi vantaggi
e svantaggi. Sebbene gli svantaggi non siano molti, l’utilizzo dell’account Guest di
Windows costituisce un problema accuratamente documentato in molti articoli sulla
sicurezza pubblicati da Microsoft e da altri fornitori. Si consiglia pertanto di disattivare
l’account Guest, se necessario. Per ulteriori informazioni, vedere la risorsa TechNet
indicata nella sezione “Siti Web” dell’appendice A.
Limitazione dell’accesso fisico
Come per ogni altro server basato su Windows, se possibile è consigliabile limitare
l’accesso fisico. Infatti, se un utente non autorizzato riuscisse ad accedere fisicamente
al server, potrebbe avviarlo da un disco floppy e ottenere l’accesso al file system di
Windows NT. È pertanto necessario proteggere fisicamente i server di database di
produzione mission-critical.
56
Conclusioni
Con SQL Server 2000, gli amministratori di database dispongono di tutte le funzionalità
necessarie per configurare e gestire server di database sicuri e perfettamente integrati
con il sistema di protezione di Windows.
Sono inoltre disponibili strumenti per i programmatori che consentono di sviluppare
applicazioni sicure senza aumentare i tempi e le difficoltà di sviluppo.
57
Appendice A: Ulteriori informazioni
Manuali
Inside Microsoft® SQL Server™ 2000, di Kalen Delaney. Copyright 2000, Microsoft
Press. ISBN: 88-8331-178-7
Sams Teach Yourself Microsoft SQL Server 2000 in 21 Days, di Richard Waymire e Rick
Sawtell. Copyright 2000, Sams Publishing. ISBN 0-672-31969-1.
Siti Web
www.microsoft.com/italy/sql: home page di SQL Server
http://support.microsoft.com/support/sql: home page del servizio di supporto di SQL
Server
www.microsoft.com/italy/technet/: sito di risorse TechNet
www.microsoft.com/italy/msdn/: sito di risorse MSDN®
www.microsoft.com/italy/security/: principale sito Microsoft per le informazioni sulla
protezione
White Paper
http://msdn.microsoft.com/sqlserver: centro dedicato agli sviluppatori SQL Server,
contenente download e white paper tecnici aggiornati.
www.microsoft.com/italy/sql/techinfo/: elenco completo dei white paper disponibili nel
sito Web di SQL Server.
58