Condividi tramite


Protezione in Resource Governor

In Resource Governor vengono utilizzati meccanismi di protezione di SQL Server esistenti, ad esempio autenticazione, livelli di autorizzazione e catene di proprietà. In questo argomento vengono identificati aspetti della configurazione e dell'utilizzo di Resource Governor che è necessario valutare per garantire che vengano presi in considerazione potenziali problemi di protezione.

Considerazioni

Per garantire la maggior protezione possibile durante l'utilizzo di Resource Governor, è necessario tenere in considerazione i seguenti elementi relativi alla progettazione e all'implementazione di tale funzionalità:

  • Autorizzazioni

  • Nomi dei pool di risorse e dei gruppi del carico di lavoro

  • Funzione di classificazione definita dall'utente

Autorizzazioni

Per modificare o visualizzare le impostazioni di Resource Governor, sono necessarie le autorizzazioni seguenti:

  • Per modificare la configurazione di Resource Governor, un utente deve disporre dell'autorizzazione CONTROL SERVER. Le autorizzazioni vengono controllate al momento dell'esecuzione di qualsiasi istruzione DDL di Resource Governor.

  • Per visualizzare la configurazione attiva specificata dalle viste a gestione dinamica, un utente deve disporre dell'autorizzazione VIEW SERVER STATE.

È consigliabile concedere solo ad amministratori di database esperti la possibilità di creare o modificare la configurazione di Resource Governor.

Nomi dei pool di risorse e dei gruppi del carico di lavoro

Tutti i nomi dei pool di risorse e dei gruppi del carico di lavoro sono visibili. Quando si creano pool e gruppi, è necessario scegliere nomi che non rivelino informazioni sulla natura delle applicazioni eseguite nel server. Un gruppo del carico di lavoro denominato RetribuzioniAzienda, ad esempio, fornisce un'indicazione ovvia relativa alla natura e alla criticità delle applicazioni che utilizzano il gruppo del carico di lavoro.

Funzione di classificazione definita dall'utente

La funzione di classificazione definita dall'utente è archiviata nel database master.

Nella progettazione e nell'implementazione, tale funzione è analoga ai trigger LOGON e viene eseguita dopo questi ultimi come parte del processo di accesso. La funzione viene eseguita nel contesto relativo all'account di accesso della sessione che effettua una richiesta e la classificazione deve terminare prima che una sessione venga effettivamente stabilita. Per questo motivo, tutti i messaggi generati all'interno della funzione di classificazione che verrebbero normalmente visualizzati all'utente, ad esempio i messaggi di errore e i messaggi restitui dall'istruzione PRINT, vengono invece indirizzati al log degli errori di SQL Server.

Nota di attenzioneAttenzione

Sebbene in questa versione di Resource Governor venga implementata l'associazione a schema per limitare le chiamate che possono essere eseguite dall'interno della funzione di classificazione definita dall'utente, tutti i dati restituiti dalla funzione non sono necessariamente protetti. Per ulteriori informazioni, vedere Considerazioni per la scrittura di una funzione di classificazione.

Si notino gli aspetti seguenti del comportamento della funzione di classificazione definita dall'utente:

  • Per impostazione predefinita, Resource Governor esegue questa funzione come parte della classificazione nel contesto dell'utente relativo all'account di accesso o come un utente designato se nella funzione è specificato EXECUTE AS.

  • Quando Resource Governor esegue questa funzione come parte della classificazione, non controlla l'autorizzazione EXECUTE nella funzione di classificazione definita dall'utente. Tutti gli oggetti cui la funzione fa riferimento vengono sottoposti tuttavia ai controlli delle autorizzazioni standard, che possono consentire l'accesso in base alla catena di proprietà.

  • La registrazione di una funzione come funzione di classificazione di Resource Governor non influisce sui livelli di autorizzazione se tale funzione viene utilizzata al di fuori dell'ambito della classificazione di Resource Governor.

Catene di proprietà in Resource Governor

Per concedere a un solo utente l'accesso a uno schema quando è in esecuzione la classificazione di Resource Governor, è possibile utilizzare il concatenamento della proprietà predefinito basato sullo schema oppure utilizzare EXECUTE AS. Nell'esempio di codice e nei commenti seguenti viene illustrato il funzionamento del concatenamento della proprietà in Resource Governor.

[!NOTA]

Nell'esempio seguente si presuppone che gli account di accesso SQL siano abilitati.

Nel codice seguente vengono creati utenti dello schema (SchemaUser1, SchemaUser2) che possono accedere a master.

use master
go

CREATE LOGIN SchemaUser1 WITH PASSWORD='your password here';
CREATE USER SchemaUser1 FOR LOGIN [SchemaUser1];
CREATE LOGIN SchemaUser2 WITH PASSWORD='your password here';
CREATE USER SchemaUser2 FOR LOGIN [SchemaUser2];
go

Nel codice seguente viene creato un utente (NormalUser1) con le autorizzazioni di accesso predefinite.

CREATE LOGIN NormalUser1 WITH PASSWORD='your password here';
CREATE USER NormalUser1 FOR LOGIN [NormalUser1];
go

Nel codice seguente vengono creati schemi (Schema1, Schema2) e ne viene eseguito il mapping agli utenti dello schema creati in precedenza. Nell'esempio viene inoltre creata una tabella (groupTable) per gli schemi.

CREATE SCHEMA Schema1 AUTHORIZATION SchemaUser1
CREATE TABLE groupTable (uname sysname, gname sysname);
CREATE SCHEMA Schema2 AUTHORIZATION SchemaUser2
CREATE TABLE groupTable (uname sysname, gname sysname);
go

Nel codice seguente vengono aggiunti valori a groupTable.

INSERT Schema1.groupTable VALUES(N'NormalUser1',N'Group1');
INSERT Schema2.groupTable VALUES(N'NormalUser1',N'Group2');
go

In questa fase Schema1 e Schema2 sono di proprietà di SchemaUser1 e SchemaUser2 rispettivamente. Nell'esempio di codice seguente viene creata una funzione che verrà utilizzata per accedere a Schema1 e a Schema2.

CREATE FUNCTION Schema1.classifier() RETURNS sysname WITH SCHEMABINDING AS
BEGIN
      DECLARE @n sysname
      SELECT @n = gname FROM Schema1.groupTable WHERE uname = SUSER_NAME()
      SELECT @n = gname FROM Schema2.groupTable WHERE uname = SUSER_NAME()
      RETURN @n
END
go

Nel codice seguente viene registrata la funzione precedente come funzione di classificazione definita dall'utente. Si noti che SchemaUser1 non dispone dell'autorizzazione di accesso a Schema2.

ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=Schema1.classifier);
ALTER RESOURCE GOVERNOR RECONFIGURE
go

Come prova, tentare di eseguire un accesso come NormalUser1 da un'altra connessione client. Aprire il Visualizzatore eventi di Windows. Nel registro applicazioni dovrebbe essere presente una voce relativa a un errore della funzione di classificazione. NormalUser1 eredita i diritti di accesso per Schema1.groupTable dal concatenamento della proprietà da Schema1.classifier, ma non dispone dell'autorizzazione per accedere a Schema2.groupTable.

Come seconda prova, concedere l'autorizzazione SELECT a SchemaUser1 per Schema2.groupTable. 

GRANT SELECT ON Schema2.groupTable TO SchemaUser1
go

Eseguire l'accesso come NormalUser1. Anche in questo caso nel registro eventi dovrebbe essere presente una voce relativa a un errore della funzione di classificazione. Tale errore si verifica poiché il server verifica se NormalUser1 dispone o meno dell'autorizzazione SELECT, che non è ereditata da SchemaUser1.

Nell'esempio di codice successivo viene creata un'altra funzione di classificazione. In questo esempio agli account di accesso viene concessa l'autorizzazione EXECUTE AS SchemaUser1.

CREATE FUNCTION Schema1.classifier2() RETURNS sysname WITH SCHEMABINDING, EXECUTE AS 'SchemaUser1' AS
BEGIN
      DECLARE @n sysname
      SELECT @n = gname FROM Schema1.groupTable WHERE uname = SUSER_NAME()
      SELECT @n = gname FROM Schema2.groupTable WHERE uname = SUSER_NAME()
      RETURN @n
END
go

ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=Schema1.classifier2);
ALTER RESOURCE GOVERNOR RECONFIGURE;
go

Poiché la nuova funzione viene eseguita nel contesto di SchemaUser1 e SchemaUser1 dispone dell'autorizzazione SELECT su Schema2.groupTable, la funzione Schema1.classifier2 () verrà eseguita correttamente per l'account di accesso NormalUser1.

Eseguire nuovamente l'accesso come NormalUser1 e verificare nel registro eventi la presenza di un errore della funzione di classificazione.

[!NOTA]

Poiché a NormalUser1 non viene concessa l'autorizzazione EXECUTE sulla funzione Schema1.classifier2, NormalUser1 non può eseguire la funzione come una query a hoc.

Per ulteriori informazioni, vedere Catene di proprietà.

Test della funzione di classificazione

Prima di utilizzare la funzione di classificazione per classificare le richieste in entrata, è necessario eseguirne il test e ottimizzarla. Una funzione scritta in modo non corretto può rendere il sistema inutilizzabile provocando il timeout e l'esposizione delle informazioni di configurazione. Per risolvere i problemi relativi a una funzione di classificazione mentre Resource Governor è abilitato, è possibile utilizzare una connessione amministrativa dedicata (DAC, Dedicated Administrator Connection) poiché tale connessione non è soggetta alla classificazione. È consigliabile che la connessione DAC sia abilitata nel server. Per ulteriori informazioni, vedere Utilizzo di una connessione amministrativa dedicata.

[!NOTA]

Se per la risoluzione dei problemi non è disponibile alcuna connessione DAC, è possibile riavviare il sistema in modalità utente singolo. Tale modalità non è soggetta alla classificazione, tuttavia non consente di eseguire la diagnosi della funzione di classificazione di Resource Governor mentre è in esecuzione.