Esistono particolari rischi per la sicurezza o le prestazioni nell'uso del CLR in SQL Server?
Esistono particolari rischi per la sicurezza o le prestazioni nell'uso del CLR in SQL Server?
Risposte:
La domanda, come ha sottolineato Remus, è troppo generica per ottenere una risposta poiché la risposta dipende dal contesto di quale funzionalità deve essere utilizzata e come verrà utilizzata.
Per quanto riguarda "Sicurezza":
Se stai chiedendo qualcosa che può essere fatto in un assieme contrassegnato da PERMISSION_SET = SAFE
, allora non ci sono problemi che io abbia mai potuto trovare. E SQLCLR è "più sicuro" dell'uso xp_cmdshell
o dei meravigliosi proc (che erano sarcasmi) sp_OA*
(o anche delle Extended Stored Procedures, ma speriamo che nessuno ne stia creando più).
Se desideri una panoramica di cosa significhi "SICURO" in termini pratici, consulta questo articolo: Scala per SQLCLR Livello 3: Sicurezza (assemblee generali e SAFE) (è richiesta la registrazione gratuita).
Se stai chiedendo qualcosa che può essere fatto in un assieme contrassegnato da PERMISSION_SET = EXTERNAL_ACCESS
, allora ci sono sicuramente dei rischi, a seconda di quale funzionalità viene utilizzata. Se scrivi una routine per leggere directory e nomi di file (cioè di sola lettura), allora è solo una questione di ciò che dovrebbe essere visto e non visto. Se si sta scrivendo un codice che consente di eliminare un file, il rischio aumenta. Ma cosa si può fare con quelle risorse esterne è controllato da:
Se stai chiedendo qualcosa che può essere fatto in un assieme contrassegnato da PERMISSION_SET = UNSAFE
, che è abbastanza aperto. Molte funzionalità sono considerate utilizzabili solo negli assiemi UNSAFE perché sono problemi di stabilità e / o comportamento coerente più che di sicurezza o prestazioni. Ad esempio, in un assembly UNSAFE è possibile avere una variabile statica scrivibile. Questo in genere non è una buona cosa da fare poiché le classi SQLCLR sono condivise in tutte le sessioni. Se la tua intenzione è quella di condividere i dati in memoria in tutte le sessioni e hai pianificato le condizioni di gara (e fatto molti test), allora dovresti stare bene perché ti aspetti questo comportamento. Ma se volevi semplicemente che una variabile statica scrivibile memorizzasse nella cache un valore per una determinata sessione in modo da non doverlo cercare di nuovo o calcolarlo di nuovo, e non eri consapevole che altre sessioni stanno leggendo quel valore e probabilmente sovrascrivendolo, beh, sarebbe un problema.
Ma se sei preoccupato per qualcuno che scrive nel Registro di sistema, ma non hai ancora alcun codice che scriva effettivamente nel Registro di sistema, probabilmente non devi preoccuparti di questo ;-).
Se desideri una panoramica di come EXTERNAL_ACCESS e UNSAFE funzionano in termini pratici e la differenza tra impostazione TRUSTWORTHY ON
(non preferita) e utilizzo di un accesso asimmetrico basato su chiave o certificato, consulta questo articolo: Scala per SQLCLR Livello 4: Sicurezza (assemblee ESTERNE e UNSAFE) (è richiesta la registrazione gratuita).
Per quanto riguarda "Performance":
Questa è tutta una questione di ciò che stai cercando di fare e di come lo fai. Ci sono alcune cose che sono molto più veloci in SQLCLR e altre che sono più lente. Ma proprio come con T-SQL, è possibile svolgere un compito piuttosto semplice e / o efficiente e renderlo complicato e / o inefficiente facendo le cose in modo errato. Ma l'utilizzo di SQL CLR non è intrinsecamente, per sua stessa natura, più lento.
Assemblee SQLCLR possono essere installati con tre livelli di accesso di sicurezza: SAFE | EXTERNAL_ACCESS | UNSAFE
. Questo è ampiamente documentato, consultare CREATE ASSEMBLY
e progettare assiemi :
Gestione della sicurezza degli assembly
È possibile controllare quanto un assembly può accedere alle risorse protette da .NET Code Access Security quando esegue il codice gestito. A tale scopo, specifica uno dei tre set di autorizzazioni quando crei o modifichi un assembly: SAFE, EXTERNAL_ACCESS o UNSAFE.
SAFE
SICURO è il set di autorizzazioni predefinito ed è il più restrittivo. Il codice eseguito da un assembly con autorizzazioni SAFE non può accedere a risorse di sistema esterne come file, rete, variabili di ambiente o registro. Il codice SAFE può accedere ai dati dai database locali di SQL Server o eseguire calcoli e logiche aziendali che non comportano l'accesso a risorse esterne ai database locali.
La maggior parte degli assembly esegue attività di calcolo e gestione dei dati senza dover accedere a risorse esterne a SQL Server. Pertanto, si consiglia SAFE come set di autorizzazioni di assemblaggio.
EXTERNAL_ACCESS
EXTERNAL_ACCESS consente agli assembly di accedere a determinate risorse di sistema esterne come file, reti, servizi Web, variabili ambientali e registro. Solo gli accessi a SQL Server con autorizzazioni EXTERNAL ACCESS possono creare assembly EXTERNAL_ACCESS. Gli assembly SAFE ed EXTERNAL_ACCESS possono contenere solo codice verificabile in modo sicuro. Ciò significa che questi assembly possono accedere alle classi solo attraverso punti di ingresso ben definiti validi per la definizione del tipo. Pertanto, non possono accedere arbitrariamente a buffer di memoria non di proprietà del codice. Inoltre, non possono eseguire operazioni che potrebbero avere effetti negativi sulla solidità del processo di SQL Server.
UNSAFE
UNSAFE offre agli assembly un accesso illimitato alle risorse, sia all'interno che all'esterno di SQL Server. Il codice in esecuzione all'interno di un assembly UNSAFE può chiamare codice non gestito. Inoltre, la specifica di UNSAFE consente al codice nell'assieme di eseguire operazioni considerate non sicure dal verificatore CLR. Queste operazioni possono potenzialmente accedere ai buffer di memoria nello spazio del processo di SQL Server in modo incontrollato. Gli assembly UNSAFE possono potenzialmente sovvertire il sistema di sicurezza di SQL Server o Common Language Runtime. Le autorizzazioni UNSAFE devono essere concesse solo a assembly altamente affidabili da sviluppatori o amministratori esperti. Solo i membri del ruolo predefinito del server sysadmin possono creare assembly UNSAFE.
Esistono ulteriori restrizioni sugli attributi CLR consentiti e sono supportati solo un sottoinsieme di .Net Framework Assembly. Ancora una volta, consultare la documentazione collegata.
Per quanto riguarda le prestazioni, la cosa più importante è ricordare che SQL Server è un ambiente multi-tasking cooperativo, mentre CLR no. Il codice SQLCLR deve chiamare Thread.BeginThreadAffinity()
ogni volta che si blocca la CPU per qualsiasi durata (incluso il blocco). Adam Machanic ha un'ottima presentazione sull'argomento, guarda Data, più velocemente: le tecniche di prestazione di Microsoft SQL Server con SQLCLR .
L'argomento è vasto e la domanda vaga. SQLCLR può eseguire alcune attività uniche che nessun'altra funzionalità può eguagliare. E SQLCLR è solo un'altra arma nell'arsenale di SQL Server con cui puoi spararti ai piedi, con prestazioni o sicurezza. Leggi la documentazione