Sdílet prostřednictvím


Design assemblies

Applies to:SQL Server

Tento článek popisuje následující faktory, které byste měli zvážit při návrhu sestavení:

  • Packaging assemblies
  • Správa zabezpečení sestavení
  • Omezení sestavení

Package assemblies

Sestavení může obsahovat funkce pro více než jednu rutinu SQL Serveru nebo typ ve svých třídách a metodách. Ve většině případů dává smysl zabalit funkce rutin, které provádějí související funkce ve stejném sestavení, zejména pokud tyto rutiny sdílejí třídy, jejichž metody vzájemně volají. Například třídy, které provádějí úlohy správy zadávání dat pro triggery CLR (Common Language Runtime) a uložené procedury CLR lze zabalit do stejného sestavení. Důvodem je to, že metody pro tyto třídy jsou pravděpodobnější, že se navzájem volají než metody méně souvisejících úkolů.

Při balení kódu do sestavení zvažte:

  • Uživatelem definované typy a indexy CLR, které závisí na uživatelem definovaných funkcích CLR, můžou způsobit, že trvalá data budou v databázi, která závisí na sestavení. Úprava kódu sestavení je často složitější, pokud existují trvalá data, která závisí na sestavení v databázi. Proto je lepší oddělit kód, na kterém se trvalé závislosti dat spoléhají (například uživatelem definované typy a indexy pomocí uživatelem definovaných funkcí) od kódu, který tyto trvalé závislosti dat neobsahuje. For more information, see Implement assemblies and ALTER ASSEMBLY.

  • Pokud část spravovaného kódu vyžaduje vyšší oprávnění, je lepší tento kód oddělit do samostatného sestavení od kódu, který nevyžaduje vyšší oprávnění.

Zabezpečení přístupu kódu se už nepodporuje.

CLR používá zabezpečení přístupu kódu (CAS) v rozhraní .NET Framework, které se už nepodporuje jako hranice zabezpečení. Sestavení CLR vytvořené s PERMISSION_SET = SAFE může mít přístup k externím systémovým prostředkům, volat nespravovaný kód a získat oprávnění správce systému. V SQL Serveru 2017 (14.x) a novějších verzích, možnost sp_configure, přísné zabezpečení CLR, vylepšuje zabezpečení sestavení CLR. clr strict security je ve výchozím nastavení povolen a se sestaveními SAFE a EXTERNAL_ACCESS zachází, jako by byla označena UNSAFE. Možnost clr strict security může být zakázaná kvůli zpětné kompatibilitě, ale nedoporučuje se.

Doporučujeme podepsat všechna sestavení certifikátem nebo asymetrickým klíčem s odpovídajícím přihlašovacím jménem, kterému bylo uděleno oprávnění UNSAFE ASSEMBLY v databázi master. Správci SQL Serveru mohou také přidat sestavení do seznamu sestavení, kterým má databázový stroj důvěřovat. For more information, see sys.sp_add_trusted_assembly.

Správa zabezpečení sestavení

Můžete řídit, kolik sestavení má přístup k prostředkům chráněným zabezpečením přístupu kódu .NET při spuštění spravovaného kódu. Provedete to zadáním jedné ze tří sad oprávnění při vytváření nebo úpravě sestavení: SAFE, EXTERNAL_ACCESSnebo UNSAFE.

SAFE permission

SAFE je výchozí sada oprávnění a je to nejvíce omezující. Kód spuštěný sestavením s oprávněními SAFE nemůže přistupovat k externím systémovým prostředkům, jako jsou soubory, síť, proměnné prostředí nebo registr. SAFE kód může přistupovat k datům z místních databází SQL Serveru nebo provádět výpočty a obchodní logiku, které nezahrnují přístup k prostředkům mimo místní databáze.

Většina sestavení provádí úlohy výpočtu a správy dat bez přístupu k prostředkům mimo SQL Server. Proto doporučujeme SAFE jako sadu oprávnění sestavení.

EXTERNAL_ACCESS permission

EXTERNAL_ACCESS umožňuje sestavením přistupovat k určitým externím systémovým prostředkům, jako jsou soubory, sítě, webové služby, proměnné prostředí a registr. Vytvářet EXTERNAL ACCESS sestavení můžou pouze přihlášení SQL Serveru s oprávněními EXTERNAL_ACCESS.

SAFE sestavení EXTERNAL_ACCESS mohou obsahovat pouze kód, který je ověřitelně bezpečný. To znamená, že tato sestavení mají přístup pouze k třídám prostřednictvím jasně definovaných vstupních bodů, které jsou platné pro definici typu. Proto nemůžou libovolně přistupovat k vyrovnávacím pamětím paměti, které kód nevlastní. Navíc nemůžou provádět operace, které by mohly mít nepříznivý vliv na robustnost procesu SQL Serveru.

UNSAFE permission

UNSAFE dává sestavením neomezený přístup k prostředkům, a to jak v rámci SQL Serveru, tak i mimo sql Server. Kód spuštěný z UNSAFE sestavení může volat nespravovaný kód.

Zadání UNSAFE také umožňuje kódu v sestavení provádět operace, které jsou považovány za nebezpečné typu pomocí ověřovatele CLR. Tyto operace můžou potenciálně přistupovat k vyrovnávací paměti v procesním prostoru SQL Serveru nekontrolovatelným způsobem. UNSAFE sestavení mohou také potenciálně podvrátit systém zabezpečení SQL Serveru nebo modulu CLR (Common Language Runtime). UNSAFE oprávnění by měla být udělena pouze vysoce důvěryhodným sestavením zkušeným vývojářům nebo správcům. Only members of the sysadmin fixed server role can create UNSAFE assemblies.

Omezení sestavení

SQL Server zavádí určitá omezení spravovaného kódu v sestaveních, aby se zajistilo, že se můžou spouštět spolehlivým a škálovatelným způsobem. To znamená, že určité operace, které mohou ohrozit odolnost serveru, nejsou povoleny v SAFE a EXTERNAL_ACCESS sestavení.

Nepovolené vlastní atributy

Sestavení nemohou být opatřena poznámkami s následujícími vlastními atributy:

System.ContextStaticAttribute
System.MTAThreadAttribute
System.Runtime.CompilerServices.MethodImplAttribute
System.Runtime.CompilerServices.CompilationRelaxationsAttribute
System.Runtime.Remoting.Contexts.ContextAttribute
System.Runtime.Remoting.Contexts.SynchronizationAttribute
System.Runtime.InteropServices.DllImportAttribute
System.Security.Permissions.CodeAccessSecurityAttribute
System.STAThreadAttribute
System.ThreadStaticAttribute

Kromě toho SAFE a EXTERNAL_ACCESS sestavení nelze anotovat následujícími vlastními atributy:

System.Security.SuppressUnmanagedCodeSecurityAttribute
System.Security.UnverifiableCodeAttribute

Nepovolené rozhraní API rozhraní .NET Framework

Z HostProtectionAttributes a sestavení SAFE nelze volat jakékoli rozhraní API rozhraní .NET Framework s poznámkami s jednou z nepovolených EXTERNAL_ACCESS.

HostProtectionAttribute.SelfAffectingProcessMgmt
HostProtectionAttribute.SelfAffectingThreading
HostProtectionAttribute.Synchronization
HostProtectionAttribute.SharedState
HostProtectionAttribute.ExternalProcessMgmt
HostProtectionAttribute.ExternalThreading
HostProtectionAttribute.SecurityInfrastructure
HostProtectionAttribute.MayLeakOnAbort
HostProtectionAttribute.UI

Podporovaná sestavení rozhraní .NET Framework

Jakékoli sestavení, na které odkazuje vaše vlastní sestavení, musí být načteno do SQL Serveru pomocí CREATE ASSEMBLY. Následující sestavení rozhraní .NET Framework jsou již načtena do SQL Serveru, a proto lze odkazovat vlastními sestaveními, aniž by bylo nutné používat CREATE ASSEMBLY.

  • mscorlib.dll
  • CustomMarshalers.dll
  • Microsoft.VisualBasic.dll
  • Microsoft.VisualC.dll
  • System.Configuration.dll
  • System.Core.dll
  • System.Data.OracleClient.dll
  • System.Data.SqlXml.dll
  • System.Data.dll
  • System.Deployment.dll
  • System.Security.dll
  • System.Transactions.dll
  • System.Web.Services.dll
  • System.Xml.Linq.dll
  • system.Xml.dll
  • System.dll