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

Rischi per la sicurezza dell'impostazione affidabile =attivo in sql server 2012

Il TRUSTWORTHY proprietà di un database (se impostato su ON ) dichiara essenzialmente a SQL Server che il codice contenuto all'interno di tale database e l'esecuzione in un contesto rappresentato, dovrebbe essere autorizzato a raggiungere l'esterno di tale database mantenendo il contesto di sicurezza rappresentato. Consente inoltre tutti Assemblee SQLCLR in quel database da impostare su EXTERNAL_ACCESS e UNSAFE , indipendentemente dal fatto che il codice raggiunga o meno l'esterno del server (esternamente significa:accesso alla rete, accesso al file system, accesso al registro, accesso all'ambiente, ecc.).

È un mezzo piuttosto generico per consentire ciò poiché copre tutto il codice all'interno del database. L'utilizzo di certificati e/o chiavi asimmetriche per firmare moduli, processi e/o assiemi, consente un controllo più granulare su quale codice dispone di quali autorizzazioni.

Impostazione di un database su TRUSTWORTHY consente inoltre a qualsiasi processo che inizia in questo Database di raggiungere il livello del Server e/o attraverso altri Database. Normalmente un processo è confinato/messo in quarantena nel database da cui è iniziato. Se il database è di proprietà del login "sa", qualsiasi processo avviato in quel database e in esecuzione come "dbo" avrà effettivamente i privilegi "sa" (sì!).

Piuttosto che provare a descrivere qui, nella quantità di dettagli necessari per comunicare completamente le specifiche sulla rappresentazione, estendendo tale rappresentazione, firmando moduli, ecc., Raccomando di esaminare le seguenti risorse su questo argomento:

Dovresti evitare di impostare il tuo database su TRUSTWORTHY per quanto possibile. Se devi davvero avere chiamate multithreading / asincrone E se hai il codice sorgente e stai compilando l'assembly, non riesco a pensare a un motivo per usare SET TRUSTWORTHY ON opzione. Dovresti invece firmare l'assembly con una password e usa i seguenti comandi per impostare il metodo preferito per consentire EXTERNAL_ACCESS e UNSAFE assemblee:

USE [master];
  CREATE ASYMMETRIC KEY [ClrPermissionsKey]
    AUTHORIZATION [dbo]
    FROM EXECUTABLE FILE = 'C:\path\to\my\assembly.dll';

CREATE LOGIN [ClrPermissionsLogin]
  FROM ASYMMETRIC KEY [ClrPermissionsKey];

GRANT UNSAFE ASSEMBLY TO [ClrPermissionsLogin];

Una volta che è a posto, puoi andare al database in cui è stato caricato ed eseguito il tuo assembly:

ALTER ASSEMBLY [MyAssembly] WITH PERMISSION_SET = UNSAFE;

Oppure potresti aver incluso WITH PERMISSION_SET = UNSAFE alla fine del CREATE ASSEMBLY comando.