Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Comprendere la funzione di sicurezza di SQL Server HAS_Permis_BY_Name e i relativi casi USE

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,

  1. 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.
  2. Autorizzazioni sono controlli tramite i quali assegniamo o neghiamo un determinato livello di accesso a una protezione.
  3. 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 .

  1. Verifica le autorizzazioni a livello di server o istanza
  2. Controlla le autorizzazioni a livello di database
  3. Verifica le autorizzazioni a livello di oggetto
  4. Verifica le autorizzazioni di accesso
  5. 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.