Assegnare i permessi in SQL Server.

Da Luca Bianchi

Capita frequentemente, nei newsgroup dedicati a SQL Server, che degli utenti chiedano informazioni su come creare un account da utilizzare nelle proprie applicazioni e come assegnare ad esso i permessi di cui ha bisogno. L'articolo si propone di fornire queste indicazioni utili a chi si è da poco avvicinato a SQL Server o a coloro che non abbiano la necessaria dimestichezza con questo tipo di attività amministrative.

SQL Server consente di utilizzare 2 metodi per l'autenticazione e l'accesso alle proprie risorse: l'autenticazione integrata con il sistema operativo oppure l'accesso per mezzo di un nome utente e una password che vengono verificati da SQL Server (autenticazione standard). È possibile configurare un server affinché possa accettare entrambi i metodi di autenticazione (Mixed mode) oppure soltanto le autenticazioni integrate (Windows only); non è possibile configurare SQL Server affinché accetti solo autenticazioni standard (tale feature era disponibile fino alla versione 6.5).Qualunque sia il metodo di autenticazione scelto, l'obiettivo da perseguire è quello di assegnare a ciascun utente i permessi minimi di cui necessita per eseguire le proprie attività. Per creare un nuovo utente di SQL Server, o per concedere l'accesso ad un login a livello di sistema operativo, è possibile utilizzare i comandi Transact-SQL oppure servirsi dell'interfaccia grafica di Enterprise Manager.

In entrambi i casi i passi logici da seguire sono

  • creare un login in grado di accedere a SQL Server

  • concedere al login l'accesso ad uno o più database

  • assegnare i permessi sulle risorse

È possibile creare un login utilizzando i comandi Transact-SQL sp_addlogin oppure sp_grantlogin a seconda che si voglia creare un account standard oppure concedere l'accesso ad un utente di dominio. Utilizzando Query Analyzer è possibile creare un nuovo login di nome "Raffaella" con password "TechNet" attraverso il comando

EXEC sp_addlogin 'Raffaella', 'TechNet'
Adesso l'utente Raffaella potrà accedere all'istanza di SQL Server, ma non ha ancora il permesso di utilizzare i database presenti nel server (salvo quelli in cui sia definito l'account guest). Per consentire ad un login l'accesso ad uno dei database è indispensabile renderlo User di un database. Con il seguente comando

USE MyDatabase
GO
EXEC sp_grantdbaccess 'Raffaella', 'Raffi'
viene indicato a SQL Server che il Login Raffaella può avere accesso al database MyDatabase all'interno del quale sarà identificata come Raffi. Giunti a questo punto il login Raffaella può accedere a SQL Server, può accedere anche al database MyDatabase ma non ha la possibilità di compiere alcuna operazione su di esso in quanto non sono stati ancora concessi permessi sulle risorse. In realtà tutti gli utenti di un database sono automaticamente ed irrevocabilmente membri del database role Public (esattamente come ogni account di un dominio è membro del gruppo globale Domain Users) e se al gruppo Public sono stati assegnati dei permessi, questi vengono ereditati da tutti gli User del database; è tuttavia opportuno, per ragioni di sicurezza, non assegnare autorizzazioni (o assegnarne di molto restrittive) al gruppo Public. È possibile concedere permessi sulle risorse in maniera esplicita ad un utente utilizzando l'istruzione GRANT. Possiamo ad esempio scrivere

GRANT SELECT, UPDATE ON dbo.MyTable TO Raffi
affinché l'utente Raffi sia in grado di interrogare e aggiornare la tabella dbo.MyTable. In alternativa possiamo rendere Raffi membro di un database role (predefinito o personalizzato) che abbia già dei permessi. Ad esempio possiamo aggiungere Raffi al database role predefinito db_datareader (che conferisce l'autorizzazione a leggere tutte le tabelle e viste del database) utilizzando l'istruzione

EXEC sp_addrolemember 'db_datareader', 'Raffi'
ma possiamo anche creare un nuovo ruolo a livello di database attraverso il comando

EXEC sp_addrole 'MyRole'
ed assegnare ad esso il permesso di lettura e aggiornamento della tabella dbo.MyTable per mezzo dell'istruzione

GRANT SELECT, UPDATE ON dbo.MyTable TO MyRole
e tutti gli utenti che faranno parte del gruppo erediteranno i permessi associati al gruppo stesso.
È preferibile non assegnare permessi direttamente agli user di un database ma creare dei database roles personalizzati a cui assegnare dei privilegi e rendere membri del database role tutti gli utenti che ne hanno necessità; in questo modo si evita di dover concedere le autorizzazioni sulle risorse a diversi utenti utilizzando un numero indefinito di istruzioni GRANT.
I passi compiuti per creare un login, renderlo user di un database e assegnare quindi dei permessi in maniera diretta o per mezzo dell'appartenenza ad un database role, possono essere eseguiti anche utilizzando l'interfaccia grafica di Enterprise Manager. Per creare un nuovo utente in EM è sufficiente accedere alla cartella Security, selezionare l'icona Logins, fare click con il tasto destro del mouse e scegliere la voce "New Login…". Verrà visualizzata la form di cui alla figura che segue.

permessi01

Le informazioni richieste nel tab General equivalgono ad impartire il comando sp_addlogin (oppure al comando sp_grantlogin nel caso in cui volessimo concedere l'accesso per mezzo della Windows Authentication). A questo punto dobbiamo concedere al login appena creato l'accesso ad uno o più database. Per eseguire questa attività possiamo utilizzare il tab "Database Access" della finestra di cui sopra oppure possiamo aprire la cartella Databases, selezionare il database in cui vogliamo aggiungere il nostro utente, fare click con il tasto destro del mouse sull'icona Users e scegliere la voce "New Database User…". Nella finestra "Database User Properties", nella combo box "Login Name", si selezioni il login che abbiamo appena creato (questa operazione equivale all'istruzione sp_grantdbaccess); nella parte inferiore è possibile rendere l'utente membro di uno o più dei database role, predefiniti o personalizzati, esistenti. Se volessimo concedere ad uno user dei permessi espliciti sugli oggetti dovremmo accedere alle proprietà dell'utente facendo doppio click su di esso e, scegliendo il pulsante "Permissions…", si aprirà la finestra mostrata nell'illustrazione che segue

permessi02

dove la selezione dei check box corrisponde ad impartire i relativi comandi GRANT per concedere le autorizzazioni attraverso istruzioni Transact-SQL. Dall'interfaccia grafica di Enterprise Manager è possibile aggiungere nuovi database role selezionando l'icona Roles presente in ciascun database, facendo click con il tasto destro del mouse e scegliendo la voce "New Database role…". In questa schermata è possibile sia aggiungere nuovi utenti al gruppo che definire i permessi facendo click sul tasto "Permissions…" alla cui pressione verrà visualizzata una finestra simile a quella per assegnare permessi agli utenti.
Quanto discusso in questo articolo non può essere considerato esaustivo per rendere sicuro un database server e la protezione degli oggetti è soltanto uno degli aspetti di cui tener conto per creare un ambiente affidabile. Ulteriori informazioni al riguardo possono essere reperite sul Book On Line di SQL Server oltre che sul sito Microsoft a partire dal link
https://www.microsoft.com/italy/sql