Dela via


Åtkomstsäkerhet för CLR-integreringskod

Applies to:SQL Server

Common Language Runtime (CLR) stöder en säkerhetsmodell som kallas kodåtkomstsäkerhet för hanterad kod. I den här modellen beviljas behörigheter till sammansättningar baserat på kodens identitet. Mer information finns i Code Access Security.

Den säkerhetsprincip som avgör vilka behörigheter som beviljas för sammansättningar definieras på tre olika platser:

  • Machine policy: This policy is in effect for all managed code running in the machine on which SQL Server is installed.

  • User policy: This policy is in effect for managed code hosted by a process. För SQL Server är användarprincipen specifik för det Windows-konto som SQL Server-tjänsten körs på.

  • Host policy: This policy is set up by the host of the CLR (in this case, SQL Server) that is in effect for managed code running in that host.

Säkerhetsmekanismen för kodåtkomst som stöds av CLR baseras på antagandet att körningen kan vara värd för både fullständigt betrodd och delvis betrodd kod. De resurser som skyddas av CLR-kodåtkomstsäkerhet omsluts vanligtvis av programmeringsgränssnitt för hanterade program som kräver motsvarande behörighet innan åtkomst till resursen tillåts. Kravet på behörigheten uppfylls endast om alla anropare (på sammansättningsnivå) i anropsstacken har motsvarande resursbehörighet.

Den uppsättning säkerhetsbehörigheter för kodåtkomst som beviljas till hanterad kod när de körs i SQL Server är skärningspunkten för den uppsättning behörigheter som beviljats av de föregående tre principnivåerna. Även om SQL Server ger en uppsättning behörigheter till en sammansättning som läses in i SQL Server kan den eventuella uppsättningen behörigheter som ges till användarkod begränsas ytterligare av användar- och datornivåprinciperna.

Kodåtkomstsäkerhet stöds inte längre

CLR använder Code Access Security (CAS) i .NET Framework, som inte längre stöds som en säkerhetsgräns. En CLR-sammansättning som skapats med PERMISSION_SET = SAFE kan komma åt externa systemresurser, anropa ohanterad kod och hämta sysadmin-privilegier. I SQL Server 2017 (14.x) och senare versioner förbättrar alternativet sp_configure, strikt säkerhet, säkerheten för CLR-sammansättningar. clr strict security är aktiverat som standard och behandlar SAFE och EXTERNAL_ACCESS sammansättningar som om de hade markerats UNSAFE. Alternativet clr strict security kan inaktiveras för bakåtkompatibilitet, men rekommenderas inte.

Vi rekommenderar att du signerar alla sammansättningar med ett certifikat eller en asymmetrisk nyckel, med en motsvarande inloggning som har beviljats UNSAFE ASSEMBLY behörighet i master-databasen. SQL Server-administratörer kan också lägga till sammansättningar i en lista över sammansättningar som databasmotorn bör lita på. For more information, see sys.sp_add_trusted_assembly.

Behörighetsuppsättningar för SQL Server-värdprincipnivå

Den uppsättning säkerhetsbehörigheter för kodåtkomst som beviljas för sammansättningar av SQL Server-värdprincipnivån bestäms av den behörighetsuppsättning som angavs när sammansättningen skapades. There are three permission sets: SAFE, EXTERNAL_ACCESS, and UNSAFE (specified using the PERMISSION_SET option of CREATE ASSEMBLY).

SQL Server tillhandahåller en säkerhetsprincipnivå på värdnivå till CLR när du är värd för den. Den här principen är en extra principnivå under de två principnivåer som alltid gäller. Den här principen anges för varje programdomän som skapas av SQL Server. Den här principen är inte avsedd för den standardprogramdomän som skulle gälla när SQL Server skapar en instans av CLR.

SQL Server-principen på värdnivå är en kombination av en fast SQL Server-princip för systemsammansättningar och användardefinierade principer för användarsammansättningar.

Den fasta principen för CLR-sammansättningar och SQL Server-systemsammansättningar ger dem fullständigt förtroende.

Den användardefinierade delen av SQL Server-värdprincipen baseras på sammansättningsägaren som anger en av tre behörighets bucketar för varje sammansättning. Mer information om följande säkerhetsbehörigheter finns i .NET Framework SDK.

SAFE

Endast intern beräkning och lokal dataåtkomst tillåts. SAFE är den mest restriktiva behörighetsuppsättningen. Kod som körs av en sammansättning med SAFE behörigheter kan inte komma åt externa systemresurser som filer, nätverk, miljövariabler eller registret.

SAFE sammansättningar har följande behörigheter och värden:

Permission Värden/beskrivning
SecurityPermission Execution: Behörighet att köra hanterad kod.
SqlClientPermission Context connection = true, context connection = yes: Endast kontextanslutningen kan användas och anslutningssträngen kan bara ange värdet context connection=true eller context connection=yes.

AllowBlankPassword = false: Tomma lösenord tillåts inte.

EXTERNAL_ACCESS

EXTERNAL_ACCESS sammansättningar har samma behörigheter som SAFE sammansättningar, med ytterligare möjlighet att komma åt externa systemresurser som filer, nätverk, miljövariabler och registret.

EXTERNAL_ACCESS sammansättningar har också följande behörigheter och värden:

Permission Värden/beskrivning
DistributedTransactionPermission Unrestricted: Distribuerade transaktioner tillåts.
DNSPermission Unrestricted: Behörighet att begära information från domännamnsservrar.
EnvironmentPermission Unrestricted: Fullständig åtkomst till system- och användarmiljövariabler tillåts.
EventLogPermission Administer: Följande åtgärder tillåts: skapa en händelsekälla, läsa befintliga loggar, ta bort händelsekällor eller loggar, svara på poster, rensa en händelselogg, lyssna på händelser och få åtkomst till en samling med alla händelseloggar.
FileIOPermission Unrestricted: Fullständig åtkomst till filer och mappar tillåts.
KeyContainerPermission Unrestricted: Fullständig åtkomst till nyckelcontainrar tillåts.
NetworkInformationPermission Access: Pingning tillåts.
RegistryPermission Tillåter läsbehörighet för HKEY_CLASSES_ROOT, HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIGoch HKEY_USERS.
SecurityPermission Assertion: Möjlighet att hävda att alla anropare av den här koden har den behörighet som behövs för åtgärden.

ControlPrincipal: Möjlighet att ändra huvudobjektet.

Execution: Behörighet att köra hanterad kod.

SerializationFormatter: Möjlighet att tillhandahålla serialiseringstjänster.
SmtpPermission Access: Utgående anslutningar till SMTP-värdport 25 tillåts.
SocketPermission Connect: Utgående anslutningar (alla portar, alla protokoll) på en transportadress tillåts.
SqlClientPermission Unrestricted: Fullständig åtkomst till datakällan tillåts.
StorePermission Unrestricted: Fullständig åtkomst till X.509-certifikatarkiv tillåts.
WebPermission Connect: Utgående anslutningar till webbresurser tillåts.

UNSAFE

UNSAFE tillåter obegränsad åtkomst till resurser, både inom och utanför SQL Server. Kod som körs inifrån en UNSAFE sammansättning kan också anropa ohanterad kod.

UNSAFE sammansättningar ges FullTrust.

SAFE är den rekommenderade behörighetsinställningen för sammansättningar som utför beräknings- och datahanteringsuppgifter utan att komma åt resurser utanför SQL Server.

EXTERNAL_ACCESS rekommenderas för sammansättningar som har åtkomst till resurser utanför SQL Server. EXTERNAL_ACCESS sammansättningar körs som standard som SQL Server-tjänstkonto. Det är möjligt att EXTERNAL_ACCESS kod uttryckligen personifierar anroparens säkerhetskontext för Windows-autentisering. Eftersom standardvärdet är att köra som SQL Server-tjänstkonto bör behörighet att köra EXTERNAL_ACCESS endast ges till inloggningar som är betrodda att köra som tjänstkonto.

Ur ett säkerhetsperspektiv är EXTERNAL_ACCESS och UNSAFE sammansättningar identiska. Men EXTERNAL_ACCESS sammansättningar ger olika tillförlitlighets- och robusthetsskydd som inte finns i UNSAFE sammansättningar.

Om du anger UNSAFE kan koden i sammansättningen utföra olagliga åtgärder mot SQL Server-processutrymmet och kan därför potentiellt äventyra SQL Server:s robusthet och skalbarhet. Mer information om hur du skapar CLR-sammansättningar i SQL Server finns i Hantera CLR-integreringssammansättningar.

Important

SQL Server innehåller CLR-sammansättningar som databasmotorn använder för att tillhandahålla vissa funktioner. Den Microsoft.SQLServer.Types sammansättning som ingår i SQL Server-installationen visas i metadata som en UNSAFE sammansättning. Detta är avsiktligt. Dessa sammansättningar anses vara betrodda & säkra som standard.

Få åtkomst till externa resurser

Om en användardefinierad typ (UDT), lagrad procedur eller annan typ av konstruktionssammansättning har registrerats med SAFE behörighetsuppsättning, kan inte den hanterade kod som körs i konstruktionen komma åt externa resurser. Men om behörighetsuppsättningarna EXTERNAL_ACCESS eller UNSAFE anges och hanterad kod försöker komma åt externa resurser tillämpar SQL Server följande regler:

If Then
Körningskontexten motsvarar en SQL Server-inloggning. Försök att komma åt externa resurser nekas och ett säkerhetsfel genereras.
Körningskontexten motsvarar en Windows-inloggning och körningskontexten är den ursprungliga anroparen. Den externa resursen nås under säkerhetskontexten för SQL Server-tjänstkontot.
Anroparen är inte den ursprungliga anroparen. Åtkomst nekas och ett säkerhetsfel genereras.
Körningskontexten motsvarar en Windows-inloggning och körningskontexten är den ursprungliga anroparen och anroparen personifieras. Åtkomst använder anroparens säkerhetskontext och inte tjänstkontot.

Sammanfattning av behörighetsuppsättning

I följande diagram sammanfattas de begränsningar och behörigheter som beviljats till behörighetsuppsättningarna SAFE, EXTERNAL_ACCESSoch UNSAFE.

Functionality SAFE EXTERNAL_ACCESS UNSAFE
Behörigheter för kodåtkomstsäkerhet Execute only Kör + åtkomst till externa resurser Obegränsad (inklusive P/Invoke)
Begränsningar för programmeringsmodell Yes Yes No restrictions
Verifiability requirement Yes Yes No
Lokal dataåtkomst Yes Yes Yes
Möjlighet att anropa intern kod No No Yes