Come creare un ruolo del server di sola lettura su SQL Server 2012?


15

Concedo l'autorizzazione "Visualizza qualsiasi database" durante la creazione di un nuovo ruolo del server, ma ho realizzato che questa autorizzazione consente solo all'utente di visualizzare i database di sistema.

Sto cercando di creare un ruolo del server di sola lettura e in grado di leggere qualsiasi database.

Esiste un modo per creare un ruolo del server definito dall'utente per leggere i database degli utenti? O devo farlo tramite la mappatura utente per utente?

Risposte:


16

Pubblicare questo come risposta solo perché è troppo lungo per un commento e perché presto sarà rilevante per gli altri utenti.

SQL Server 2014 aggiunge alcune nuove autorizzazioni a livello di server che aiuteranno esattamente questo tipo di scenario: sono state progettate tenendo conto del controllo, ma questo tipo di requisiti sembra adattarsi anche a quella fattura. È possibile semplicemente aggiungere le seguenti due autorizzazioni a un accesso a livello di server:

CONNECT ANY DATABASE

SELECT ALL USER SECURABLES

Il primo, come sembra, consente al login di connettersi a qualsiasi database. La cosa bella di questo è che lo consentirà anche per i database creati in futuro (a condizione che non si imposti il ​​rifiuto esplicito, ecco come è possibile proteggere determinati database utente dagli accessi che dispongono di questa autorizzazione). Quest'ultimo consente al login di eseguire operazioni di lettura su qualsiasi database a cui hanno accesso, in modo che possano SELECTda tabelle, viste, UDF ecc. Ma non saranno in grado di eseguire alcuna UPDATEoperazione (non ho testato se questa autorizzazione comprende quando un stored procedure esegue DML). Funzionano perfettamente in combinazione se si desidera fornire un accesso di accesso in lettura completamente aperto all'intero server o, per essere più precisi, è possibile concedere CONNECTprivilegi tradizionali a determinati database e la SELECT ALL USER SECURABLESvolontà giustafunziona solo per quei database in cui l'accesso ha accesso esplicito.

Le modifiche alla sicurezza del 2014 sono documentate qui - bene, parzialmente; si sono dimenticati dell'autorizzazione a livello di database, ALTER ANY DATABASE EVENT SESSIONanche se qui non è rilevante.


Grazie per questa risposta estesa per i server in arrivo. Essendo che questa operazione / controllo sia a livello di server. Ci sono commenti su se il livello di compatibilità DB. Quindi, se DB CL è 2012, la funzionalità 2014 continuerà a funzionare?
SnapJag

Il livello di compatibilità di @SnapJag non ha alcuna influenza sulle funzionalità di sicurezza, riguarda principalmente il modo in cui viene analizzato T-SQL e come l'ottimizzatore genera piani di query.
Aaron Bertrand

@AaronBertrand Sai se esiste un'autorizzazione che possiamo impostare su ruoli a livello di server per consentire gli aggiornamenti anche su qualsiasi database? (il ruolo fisso sysadmin può essere sicuro, ma possiamo farlo per un ruolo del server definito dall'utente?)
MaxiWheat

@MaxiWheat No, non riesco a pensare a un modo banale per farlo, scusa.
Aaron Bertrand

FWIW questo non funzionerà per il database SQL di Azure. CONCESSIONE CONNESSIONE DI QUALSIASI DATABASE A [NameOfUserOrGroup] Classe "server" che non è supportata in questa versione di SQL Server.
Dzejms,

8

Non esiste un'autorizzazione "leggi qualsiasi database" a livello di server e ai ruoli a livello di server non possono essere concesse autorizzazioni a livello di database

Quindi sì, dovrai mappare gli utenti ai database individualmente. Se stai utilizzando Active Directory, puoi creare un gruppo di Windows, quindi dare a quel gruppo un accesso a SQL Server, quindi applicare db_datareader in tutti i database per quel gruppo (dovrai comunque creare utenti in ciascun database).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.