Dela via


CLR-integrering kodåtkomstsäkerhet

gäller för: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: Den här principen gäller för all hanterad kod som körs på den dator där SQL Server är installerat.

  • Användarprincip: Den här principen gäller för hanterad kod som hanteras av en process. För SQL Server är användarprincipen specifik för det Windows-konto som SQL Server-tjänsten körs på.

  • Värdprincip: Den här principen konfigureras av värden för CLR (i det här fallet SQL Server) som gäller för hanterad kod som körs på den värden.

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.

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. Det finns tre behörighetsuppsättningar: SAFE, EXTERNAL_ACCESSoch UNSAFE (anges med alternativet PERMISSION_SETCREATE 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.

SÄKER

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:

Tillåtelse 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:

Tillåtelse 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.

OSÄKER

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.

Viktig

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:

Om
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.

Funktionalitet SAFE EXTERNAL_ACCESS UNSAFE
Behörigheter för kodåtkomstsäkerhet Kör endast Kör + åtkomst till externa resurser Obegränsad (inklusive P/Invoke)
Begränsningar för programmeringsmodell Ja Ja Inga begränsningar
Verifierbarhetskrav Ja Ja Nej
Lokal dataåtkomst Ja Ja Ja
Möjlighet att anropa intern kod Nej Nej Ja