Protezione dall'accesso di codice dell'integrazione con CLR
Common Language Runtime (CLR) supporta un modello di protezione definito protezione dall'accesso di codice per il codice gestito che prevede che le autorizzazioni vengano concesse agli assembly in base all'identità del codice. Per ulteriori informazioni, vedere la sezione relativa alla protezione dall'accesso di codice in .NET Framework SDK (Software Development Kit).
I criteri di protezione che determinano le autorizzazioni concesse agli assembly vengono definiti in tre punti diversi:
Criteri del computer: criteri attivi per tutto il codice gestito in esecuzione sul computer nel quale viene installato SQL Server.
Criteri utente: criteri attivi per il codice gestito ospitato da un processo. Per SQL Server, i criteri utente sono specifici dell'account di Windows su cui è in esecuzione il servizio di SQL Server.
Criteri host: criteri impostati dall'host di CLR (in questo caso, SQL Server), attivi per il codice gestito in esecuzione su quell'host.
Il meccanismo di protezione dall'accesso di codice supportato da CLR si basa sul presupposto che il runtime possa ospitare codice completamente o parzialmente attendibile. La protezione delle risorse mediante la protezione dell'accesso di codice di CRL in genere viene eseguita tramite wrapping di API gestite, che richiedono l'autorizzazione corrispondente prima di consentire l'accesso alla risorsa. La richiesta di autorizzazioneviene soddisfatta solo se tutti i chiamanti a livello di assembly nello stack di chiamate dispongono dell'autorizzazione corrispondente per la risorsa.
Il set di autorizzazioni della protezione dell'accesso di codice concesse al codice gestito durante l'esecuzione all'interno di SQL Server rappresenta l'intersezione del set di autorizzazioni concesse dai tre livelli di criteri sopra descritti. Anche se SQL Server concede un set di autorizzazioni a un assembly caricato in SQL Server, il set di autorizzazioni effettivo concesso al codice utente potrebbe essere limitato ulteriormente dai criteri utente e a livello di computer.
Set di autorizzazioni a livello di criteri host di SQL Server
Il set di autorizzazioni della protezione dall'accesso di codice concesso agli assembly dal livello di criteri host di SQL Server è determinato dal set di autorizzazioni specificato durante la creazione dell'assembly. Sono disponibili tre set di autorizzazioni: SAFE, EXTERNAL_ACCESS e UNSAFE (specificati mediante l'opzione PERMISSION_SET di CREATE ASSEMBLY (Transact-SQL)).
SQL Server offre criteri di protezione a livello host per CLR, quando ospita tale ambiente. Questo livello di criteri aggiuntivo è sottostante ai due livelli sempre attivi e viene impostato per ogni dominio applicazione creato da SQL Server. Non è indicato per il dominio applicazione predefinito che sarebbe attivo quando SQL Server crea un'istanza di CLR.
I criteri a livello host di SQL Server sono una combinazione dei criteri fissi di SQL Server per gli assembly di sistema e dei criteri specificati dall'utente per gli assembly utente.
I criteri fissi per gli assembly CLR e gli assembly di sistema di SQL Server concedono loro l'attendibilità totale.
La parte dei criteri host di SQL Server specificata dall'utente è basata su uno dei tre bucket di autorizzazione specificati per ogni assembly dal relativo proprietario. Per ulteriori informazioni sulle autorizzazioni di protezione elencate in basso, vedere .NET Framework SDK.
SAFE
Sono consentiti solo l'accesso ai dati locali e il calcolo interno. SAFE è il set di autorizzazioni più restrittivo. Il codice eseguito da un assembly con autorizzazioni SAFE non può accedere a risorse di sistema esterne come file, la rete, variabili di ambiente o il Registro di sistema.
Gli assembly SAFE dispongono delle autorizzazioni e dei valori seguenti:
Autorizzazione |
Valori/Descrizione |
---|---|
SecurityPermission |
Execution: autorizzazione a eseguire il codice gestito. |
SqlClientPermission |
Context connection = true, context connection = yes: è possibile utilizzare solo la connessione di contesto e la stringa di connessione può specificare solo un valore "context connection=true" o "context connection=yes". AllowBlankPassword = false: le password vuote non sono supportate. |
EXTERNAL_ACCESS
Gli assembly EXTERNAL_ACCESS dispongono delle stesse autorizzazioni degli assembly SAFE e possono inoltre accedere a risorse di sistema esterne come file, reti, variabili di ambiente e al Registro di sistema.
Gli assembly EXTERNAL_ACCESS dispongono anche delle autorizzazioni e dei valori seguenti:
Autorizzazione |
Valori/Descrizione |
---|---|
DistributedTransactionPermission |
Unrestricted: le transazioni distribuite sono consentite. |
DNSPermission |
Unrestricted: autorizzazione a richiedere informazioni ai server DNS (Domain Name Server). |
EnvironmentPermission |
Unrestricted: l'accesso completo alle variabili di sistema e di ambiente dell'utente è consentito. |
EventLogPermission |
Administer: consente di eseguire diverse operazioni. Esse sono: creare un'origine eventi, leggere i log esistenti, eliminare i log o le origini eventi, rispondere alle immissioni, cancellare un log eventi, mettersi in attesa di eventi e accedere a una raccolta di tutti i log eventi. |
FileIOPermission |
Unrestricted: l'accesso completo a file e cartelle è consentito. |
KeyContainerPermission |
Unrestricted: l'accesso completo ai contenitori di chiavi è consentito. |
NetworkInformationPermission |
Access: l'esecuzione del ping è consentita. |
RegistryPermission |
Concede diritti di lettura a HKEY_CLASSES_ROOT, HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIG e HKEY_USERS. |
SecurityPermission |
Assertion: capacità di asserire che tutti i chiamanti del codice dispongono dell'autorizzazione necessaria per l'operazione. ControlPrincipal: capacità di manipolare l'oggetto Principal. Execution: autorizzazione a eseguire il codice gestito. SerializationFormatter: capacità di fornire servizi di serializzazione. |
SmtpPermission |
Access: le connessioni in uscita alla porta 25 dell'host SMTP sono consentite. |
SocketPermission |
Connect: le connessioni in uscita (tutte le porte, tutti i protocolli) su un indirizzo di trasporto sono consentite. |
SqlClientPermission |
Unrestricted: l'accesso completo all'origine dati è consentito. |
StorePermission |
Unrestricted: l'accesso completo agli archivi certificati X.509 è consentito. |
WebPermission |
Connect: le connessioni in uscita a risorse Web sono consentite. |
UNSAFE
UNSAFE concede agli assembly libero accesso a risorse interne ed esterne a SQL Server. Il codice eseguito all'interno di un assembly UNSAFE può chiamare anche il codice non gestito.
Agli assembly UNSAFE viene concessa l'autorizzazione FullTrust.
Nota sulla protezione |
---|
SAFE rappresenta l'impostazione di autorizzazione consigliata per gli assembly che eseguono attività di calcolo e di gestione di dati senza accedere alle risorse all'esterno di SQL Server. EXTERNAL_ACCESS è consigliata per gli assembly che accedono a risorse all'esterno di SQL Server. Gli assembly EXTERNAL_ACCESS vengono eseguiti come account del servizio SQL Server, per impostazione predefinita. Il codice di EXTERNAL_ACCESS può rappresentare in modo esplicito il contesto di protezione dell'autenticazione di Windows del chiamante. Dal momento che per impostazione predefinita l'esecuzione avviene mediante l'account di servizio di SQL Server, è necessario concedere l'autorizzazione all'esecuzione di EXTERNAL_ACCESS esclusivamente agli account di accesso considerati attendibili per l'esecuzione come account di servizio. Dal punto di vista della protezione, gli assembly EXTERNAL_ACCESS e UNSAFE sono identici. Gli assembly EXTERNAL_ACCESS offrono tuttavia una protezione e un'affidabilità maggiore rispetto agli assembly UNSAFE. Se si seleziona UNSAFE, infatti, il codice contenuto nell'assembly può eseguire operazioni non valide sullo spazio di processo di SQL Server e pertanto compromettere l'affidabilità e la scalabilità di SQL Server. Per ulteriori informazioni sulla creazione di assembly CLR in SQL Server, vedere Gestione degli assembly dell'integrazione con CLR. |
Accesso a risorse esterne
Se un tipo definito dall'utente, una stored procedure o un altro tipo di assembly del costrutto viene registrato con il set di autorizzazioni SAFE, il codice gestito in esecuzione nel costrutto non è in grado di accedere alle risorse esterne. Se tuttavia i set di autorizzazioni EXTERNAL_ACCESS o UNSAFE vengono specificati, e il codice gestito tenta di accedere a risorse esterne, SQL Server applica le regole seguenti:
Situazione |
Risultato |
---|---|
Il contesto di esecuzione corrisponde a un account di accesso di SQL Server. |
I tentativi di accesso a risorse esterne vengono negati e viene generata un'eccezione di protezione. |
Il contesto di esecuzione corrisponde a un account di accesso di Windows e rappresenta il chiamante originale. |
L'accesso alla risorsa esterna viene effettuato nel contesto di protezione dell'account di servizio di SQL Server. |
Il chiamante non è il chiamante originale. |
L'accesso viene negato e viene generata un'eccezione di protezione. |
Il contesto di esecuzione corrisponde a un account di accesso di Windows e rappresenta il chiamante originale, mentre il chiamante è stato rappresentato. |
L'accesso verrà effettuato nel contesto di protezione del chiamante anziché in quello dell'account del servizio. |
Riepilogo del set di autorizzazioni
Nel grafico seguente sono riepilogate le restrizioni e le autorizzazioni concesse ai set di autorizzazioni SAFE, EXTERNAL_ACCESS e UNSAFE.
SAFE |
EXTERNAL_ACCESS |
UNSAFE |
|
Code Access Security Permissions |
Sola esecuzione |
Esecuzione + accesso a risorse esterne |
Senza restrizioni (incluso P/Invoke) |
Programming model restrictions |
Sì |
Sì |
Nessuna restrizione |
Verifiability requirement |
Sì |
Sì |
No |
Local data access |
Sì |
Sì |
Sì |
Ability to call native code |
No |
No |
Sì |