Esistono più istanze in cui desideriamo verificare l'autorizzazione su un oggetto a protezione diretta per un'entità. Prima di andare avanti, vediamo quali sono i principali, le funzioni di protezione e le autorizzazioni.
Secondo la documentazione Microsoft,
- Protezioni garantite nel contesto di SQL Server sono risorse specifiche a cui il sistema di autorizzazione di Motore di database di SQL Server controlla l'accesso. Sono divisi in tre categorie:Server, Database e Schema. In generale, qualsiasi oggetto di SQL Server o database può essere protetto.
- Autorizzazioni sono controlli tramite i quali assegniamo o neghiamo un determinato livello di accesso a una protezione.
- Principale è un'entità che riceve l'autorizzazione per un oggetto protetto. I principali più comuni sono gli accessi e gli utenti del database.
SQL Server dispone di una funzione di sicurezza incorporata HAS_Permis_BY_Name questo ci aiuterà a capire se un principal identificato ha o meno un'autorizzazione specifica su un determinato oggetto a garanzia. Questa funzione di sistema restituisce 1 se l'autorizzazione effettiva è assegnata a quell'entità su un determinato oggetto a protezione diretta e restituisce 0 se l'autorizzazione effettiva non è assegnata. Otterrai il valore NULL se l'autorizzazione effettiva o la classe a protezione diretta non sono valide.
La funzione di sistema HAS_Permis_BY_Name è anche molto utile per controllare i permessi per il tuo login. In questo articolo ti mostrerò una procedura dettagliata per verificare l'autorizzazione specifica su una protezione per il mio principale e altri principali.
La sintassi T-SQL di questa funzione di sistema è la seguente:
--T-SQL syntax
HAS_PERMS_BY_NAME (securable, securable_class, permission)
Saranno necessari tre parametri obbligatori per eseguire questa funzione di sicurezza di SQL Server del sistema.
- Inserisci il nome della protezione di cui si desidera verificare l'autorizzazione. Se un oggetto protetto è esso stesso un server, dovresti usare NULL.
- Il secondo parametro è securable_class che è il nome della classe. Se non sei sicuro, puoi utilizzare un'altra funzione di sistema sys.fn_builtin_permissions per ottenere l'elenco completo delle classi sicure e dei loro permessi disponibili.
- Il terzo parametro è l'autorizzazione dove è necessario inserire l'autorizzazione effettiva per la quale si desidera verificare la protezione sicura specificata.
Ora, lascia che ti mostri tutte le classi sicure disponibili eseguendo la funzione di sistema sys.fn_builtin_permissions. Ho usato DISTINCT per visualizzare le righe per classe protetta.
--Display all securable_class
SELECT distinct class_desc FROM sys.fn_builtin_permissions(default)
Qui puoi ottenere un elenco della classe protetta.
Se vuoi controllare tutte le possibili autorizzazioni per qualsiasi classe protetta, puoi anche usare questa funzione di sistema. Esegui l'istruzione T-SQL seguente:
--Display each permission for all securable class
SELECT class_desc,permission_name FROM sys.fn_builtin_permissions(default);
Possiamo vedere l'elenco nell'immagine qui sotto. Il class_desc è una classe sicura e permission_name è un tipo di autorizzazione. Se non sei sicuro della classe protetta e delle autorizzazioni da verificare per qualsiasi protezione, puoi utilizzare questa funzione di sistema.
HAS_Permis_BY_Name USE Casi
Ti mostrerò 5 casi d'uso per il controllo di varie autorizzazioni per il mio accesso all'istanza di SQL Server e per un accesso aggiuntivo denominato manvendra .
- Verifica le autorizzazioni a livello di server o istanza
- Controlla le autorizzazioni a livello di database
- Verifica le autorizzazioni a livello di oggetto
- Verifica le autorizzazioni di accesso
- Controlla altre autorizzazioni come catalogo full-text, schema ecc.
Iniziamo con il primo caso d'uso per verificare le autorizzazioni a livello di istanza.
CASO D'USO 1:controllare SQL Server o l'autorizzazione a livello di istanza
Questo caso d'uso mostrerà come controllare varie autorizzazioni per un'entità server\accesso. È possibile eseguire l'istruzione T-SQL precedente utilizzando la funzione di sistema sys.fn_builtin_permissions. È possibile utilizzare la clausola WHERE in questa funzione per elencare solo le autorizzazioni a livello di server. Qui ti mostrerò le autorizzazioni per il mio login connesso.
- Visualizza lo stato del server
- Crea ruolo server
- Collega qualsiasi database
Se stai cercando un'autorizzazione a livello di server, dovresti sempre passare NULL come argomento protetto. In questo esempio, NULL sarà protetto come livello di server e i nomi di autorizzazione precedenti avranno un argomento di autorizzazione. Esegui l'istruzione T-SQL seguente per verificare le autorizzazioni a livello di server.
--Display server level permission for your own login using which you have established the database connection
SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE') AS [VIEW SERVER STATE],
HAS_PERMS_BY_NAME(null, null, 'CREATE SERVER ROLE') AS [CREATE SERVER ROLE],
HAS_PERMS_BY_NAME(null, null, 'CONNECT ANY DATABASE') AS [CONNECT ANY DATABASE]
L'output è mostrato nell'immagine sottostante. T-SQL ha restituito 1 per tutte le autorizzazioni per il mio accesso. Significa che ho i permessi per tutte e tre le operazioni. Posso visualizzare lo stato del server, posso creare un ruolo del server e posso anche connettermi a qualsiasi database su questo server o istanza.
Lascia che ti mostri se un login chiamato "manvendra" ha i permessi per le 3 operazioni precedenti. Utilizzeremo l'istruzione T-SQL EXECUTE AS LOGIN per verificare il livello di accesso. Assicurati di avere l'autorizzazione IMPERSONATE su quell'accesso per il quale stai controllando le autorizzazioni. Eseguire la stessa istruzione T-SQL come sopra dopo l'istruzione EXECUTE AS LOGIN.
--Display server level permission for another login ‘manvendra’
EXECUTE AS LOGIN = ‘manvendra’
GO
SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE') AS [VIEW SERVER STATE],
HAS_PERMS_BY_NAME(null, null, 'CREATE SERVER ROLE') AS [CREATE SERVER ROLE],
HAS_PERMS_BY_NAME(null, null, 'CONNECT ANY DATABASE') AS [CONNECT ANY DATABASE]
Qui possiamo vedere che il login "manvendra" non ha accesso a nessuna di queste 3 attività a livello di server poiché il loro output ha restituito 0.
CASO D'USO 2:verifica delle autorizzazioni a livello di database
Nella sezione precedente ho spiegato come controllare varie autorizzazioni per qualsiasi principale a livello di server o istanza. Ora ti mostrerò come controllare varie autorizzazioni per qualsiasi principale a livello di database. Vedi la seguente dichiarazione:
--Display each permission for securable class ‘DATABASE’
SELECT class_desc,permission_name FROM sys.fn_builtin_permissions(default)
WHERE class_desc = ‘DATABASE’
Puoi vedere che ci sono 82 autorizzazioni disponibili a livello di database nello screenshot qui sotto.
Ho scelto le autorizzazioni seguenti per verificare se il mio accesso o un accesso aggiuntivo "manvendra" dispone dell'autorizzazione per eseguire queste attività.
- QUALSIASI
- CREA tabella
- CREA PROCEDURA
- INSERIRE
- SELEZIONA
Qui, securable sarà il nome del database su cui vuoi controllare i permessi, la classe securable sarà "Database" e il permesso sarà il nome dei permessi sopra. Esegui l'istruzione T-SQL seguente per verificare le varie autorizzazioni.
--Display few specific permissions for your own connected login on a DATABASE
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY') AS [DB Access],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE') AS [CREATE TABLE],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE PROCEDURE') AS [CREATE PROCEDURE],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'INSERT') AS [INSERT Access],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'SELECT') AS [SELECT Access]
L'output ha restituito 1 per ogni autorizzazione. Significa che ho il permesso di eseguire tutte le attività di cui sopra nel contesto del database corrente.
Esegui l'istruzione T-SQL seguente per verificare le stesse autorizzazioni per l'accesso a "manvendra" nel contesto del database attualmente selezionato.
--Display few specific permissions for login ‘manvendra’ on current database
EXECUTE AS LOGIN ='manvendra'
GO
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY') AS [DB Access],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE') AS [CREATE TABLE],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE PROCEDURE') AS [CREATE PROCEDURE],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'INSERT') AS [INSERT Access],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'SELECT') AS [SELECT Access]
L'output mostra che l'accesso "manvendra" ha autorizzazioni molto limitate su questo database. Questo accesso può connettersi solo al database e le altre autorizzazioni non sono consentite.
Qui, ho cambiato il contesto del database e ho scelto il database "AdventureWorksDW2019-TSQL" come argomento sicuro ed ho eseguito l'istruzione seguente per l'accesso "manvendra".
--Display few specific permissions for login ‘manvendra’ on database ‘AdventureWorksDW2019-TSQL’
EXECUTE AS LOGIN ='manvendra'
GO
SELECT HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'ANY') AS [DB Access],
HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'CREATE TABLE') AS [CREATE TABLE],
HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'CREATE PROCEDURE') AS [CREATE PROCEDURE],
HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'INSERT') AS [INSERT Access],
HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'SELECT') AS [SELECT Access]
Lo stesso login "manvendra" ha l'autorizzazione per INSERT e SELECT operazioni su questo database "AdventureWorks2019-TSQL"
Allo stesso modo, possiamo eseguire l'istruzione T-SQL sopra per verificare l'autorizzazione per database distinti per il nostro accesso. L'output mostra che ho accesso a tutte le autorizzazioni.
Puoi andare avanti e controllare altre autorizzazioni a livello di database per qualsiasi entità utilizzando la funzione di sicurezza di SQL Server di sistema sopra.
CASO D'USO 3:verifica delle autorizzazioni a LIVELLO DI OGGETTO
Questo caso d'uso illustra l'utilizzo di autorizzazioni a livello di oggetto all'interno di un database. Ancora una volta, puoi eseguire l'istruzione T-SQL seguente per elencare tutte le autorizzazioni disponibili per la classe a protezione diretta "OBJECT". Ho utilizzato la clausola WHERE nella funzione di sistema sys.fn_builtin_permissions per visualizzare l'elenco dei permessi a livello di oggetto.
--Check all object level permissions
SELECT class_desc,permission_name FROM sys.fn_builtin_permissions(default)
WHERE class_desc ='OBJECT'
Di seguito è riportato l'elenco delle autorizzazioni per la classe protetta Object.
Ora controllerò le autorizzazioni seguenti su un oggetto specifico per qualsiasi account di accesso e vedrò se quell'account ha accesso per eseguire le operazioni seguenti.
- INSERIRE
- SELEZIONA
- ELIMINA
- VISUALIZZA DEFINIZIONE
Ho usato un oggetto database "dbo.dimAccount" come sicuro, OBJECT come classe sicura e le autorizzazioni sopra come argomento di autorizzazione. Esegui le istruzioni seguenti per visualizzare i dettagli dell'autorizzazione.
--Check some specific object level permissions for your own login
SELECT HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'INSERT') AS [Insert Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'SELECT') AS [Select Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'DELETE') AS [DELETE Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'VIEW DEFINITION') AS [VIEW DEFINITION Access]
Dato che sono un amministratore di sistema in questa istanza, il mio account restituisce 1 per qualsiasi autorizzazione che sto verificando a qualsiasi livello. Significa che ho i permessi completi e questo può essere verificato eseguendo anche le istruzioni seguenti.
Esegui la seguente dichiarazione per verificare le autorizzazioni per l'accesso "manvendra".
--Check some specific object level permissions for another login ‘manvendra’
EXECUTE AS USER ='manvendra'
GO
USE [AdventureWorksDW2019-TSQL]
GO
SELECT HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'INSERT') AS [Insert Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'SELECT') AS [Select Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'DELETE') AS [DELETE Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'VIEW DEFINITION') AS [VIEW DEFINITION Access]
Possiamo vedere che il login "manvendra" ha accesso alle autorizzazioni INSERT, SELECT e DELETE ma questo account non ha il permesso di VISUALIZZARE LA DEFINIZIONE di questo oggetto nel database "AdventureWorksDW2019-TSQL".
Consentitemi di applicare l'accesso DENY all'operazione DELETE per questo account "manvendra" sull'oggetto "DimAccount" nel database AdventureWorksDW2019-TSQL. Puoi vederlo nell'immagine qui sotto.
Possiamo vedere che l'output indica che login 'manvendra' ha accesso solo alle istruzioni INSERT e SELECT e non ha il permesso per l'istruzione DELETE.
Controlla vari livelli di accesso per qualsiasi login su qualsiasi oggetto di database utilizzando la funzione di sistema sopra.
CASO D'USO 4:verifica l'autorizzazione di accesso
Questo caso d'uso ti aiuterà a capire come controllare le varie autorizzazioni per gli accessi. Puoi ottenere tutti questi tipi di dettagli utilizzando questa funzione di sicurezza di SQL Server HAS_PERMS_BY_NAME.
Possiamo elencare tutte le autorizzazioni disponibili per un accesso specifico eseguendo l'istruzione T-SQL di seguito.
--List all available permission for securable class ‘LOGIN’
SELECT class_desc, permission_name FROM sys.fn_builtin_permissions(default)
WHERE class_desc ='LOGIN'
Di seguito è riportato l'elenco dei nomi di autorizzazione per la classe protetta 'LOGIN'.
Verificherò se ho l'autorizzazione ALTER o VIEW DEFINITION su login sa eseguendo le istruzioni T-SQL seguenti. Ho usato login sa come argomento protetto, LOGIN come argomento di classe sicura e ALTER &VIEW DEFINITION come argomento di autorizzazione in questa funzione di sistema.
--Check ALTER & VIEW DEFINITION permission on securable sa
SELECT HAS_PERMS_BY_NAME('sa', 'LOGIN', 'ALTER'),
HAS_PERMS_BY_NAME('sa', 'LOGIN', 'VIEW DEFINITION')
Come amministratore di sistema, avrò questi livelli di accesso e anche l'output viene convalidato restituendo il loro valore come 1.
Verifichiamo se il login 'manvendra' ha il permesso di ALTER o VIEW definizione del login sa.
--Check ALTER & VIEW DEFINITION permission on securable sa for principal ‘manvendra’
EXECUTE AS USER ='manvendra'
GO
SELECT HAS_PERMS_BY_NAME('sa', 'LOGIN', 'ALTER'),
HAS_PERMS_BY_NAME('sa', 'LOGIN', 'VIEW DEFINITION')
L'output restituito come zero (0), il che significa che login 'manvendra' non dispone dell'autorizzazione per ALTER o VIEW DEFINITION login sa.
Utilizzare questa funzione di sistema per controllare e comprendere i livelli di accesso per vari accessi.
CASO D'USO 5:verifica altre autorizzazioni
Qui tratterò alcune altre classi sicure come SCHEMA e FULLTEXT CATALOG, ENDPOINT, AVAILABILITY GROUP, ecc.
Elenchiamo innanzitutto tutte le autorizzazioni disponibili per le classi sicure SCHEMA e FULLTEXT CATALOG eseguendo la seguente istruzione:
--List all available permission for securable class ‘SCHEMA’ & ‘FTCatalog’. FTCatalog is full text catalog.
SELECT class_desc, permission_name FROM sys.fn_builtin_permissions(default)
WHERE class_desc='SCHEMA' OR
class_desc= 'FULLTEXT CATALOG'
Il passaggio successivo consiste nell'identificare quale autorizzazione stiamo cercando per verificare il nostro principale. Controllerò le autorizzazioni DELETE e ALTER per la classe protetta SCHEMA e l'autorizzazione ALTER e VIEW DEFINITION sulla classe FULLTEXT CATALOG protetta.
Abbiamo bisogno di passare i rispettivi elementi di protezione come ho passato dbo per la classe securable SCHEMA e FTCatalog per la classe securable FULLTEXT CATALOG nell'istruzione seguente.
Esegui l'istruzione T-SQL seguente per ottenere l'autorizzazione per il tuo accesso.
--List below permissions for securable class ‘SCHEMA’ & ‘FTCatalog’.
SELECT HAS_PERMS_BY_NAME('dbo', 'SCHEMA', 'DELETE') AS [Schema Deletion Access],
HAS_PERMS_BY_NAME('dbo', 'SCHEMA', 'ALTER') AS [Schema Alter Access],
HAS_PERMS_BY_NAME('[FTCatalog]', 'FULLTEXT CATALOG', 'ALTER') AS [FTC Alter Access],
HAS_PERMS_BY_NAME('[FTCatalog]', 'FULLTEXT CATALOG', 'VIEW DEFINITION') AS [VIEW DEFINITION]
L'output seguente mostra che l'accesso "manvendra" ha accesso solo all'eliminazione SCHEMA e il resto degli accessi è stato negato o revocato.
Conclusione
In questo articolo ho spiegato la procedura passo passo per controllare le varie autorizzazioni per più classi a protezione diretta per qualsiasi principale. È inoltre possibile utilizzare questa funzione di sicurezza di SQL Server del sistema per soddisfare i requisiti di controllo delle autorizzazioni. Condividi questo articolo e fornisci il tuo feedback nella sezione commenti in modo che possiamo migliorare.