CLR Strikte Sicherheit auf SQL Server 2017

9

MSDN auf dieser Artikel sagt:

  

CLR verwendet Code Access Security (CAS) im .NET Framework, das ist keine   länger als Sicherheitsgrenze unterstützt. Eine CLR-Assembly, die mit erstellt wurde   PERMISSION_SET = SAFE kann möglicherweise auf externe Systemressourcen zugreifen   Rufen Sie nicht verwalteten Code auf und erwerben Sie Systemadministratorberechtigungen. Mit ... anfangen   SQL Server 2017, eine sp_configure-Option namens clr strict security ist   eingeführt, um die Sicherheit von CLR-Baugruppen zu verbessern. clr streng   Die Sicherheit ist standardmäßig aktiviert und behandelt SAFE und EXTERNAL_ACCESS   Versammlungen, als ob sie als UNSAFE markiert wären. Die clr strenge Sicherheit   Option kann aus Gründen der Abwärtskompatibilität deaktiviert werden, dies ist jedoch nicht möglich   empfohlen. Microsoft empfiehlt, dass alle Assemblys von einem signiert werden   Zertifikat oder asymmetrischer Schlüssel mit einem entsprechenden Login   in der master-Datenbank die Berechtigung UNSAFE ASSEMBLY erteilt.

Wie kann eine mit PERMISSION_SET = SAFE erstellte CLR-Assembly möglicherweise auf externe Systemressourcen zugreifen, nicht verwalteten Code aufrufen und Systemadministratorberechtigungen erwerben?

Warum wird CAS nicht mehr als Sicherheitsgrenze unterstützt?

Wie ich verstehe, können CLR-Baugruppen nicht mehr sicher sein, was sehr bedauerlich ist.

    
Jesús López 20.05.2017, 07:23
quelle

2 Antworten

9
  

Wie kann eine CLR-Assembly, die mit PERMISSION_SET = SAFE erstellt wurde, möglicherweise auf externe Systemressourcen zugreifen, nicht verwalteten Code aufrufen und Systemadministratorberechtigungen erwerben?

Dies ist auf Sicherheitsänderungen in .NET Framework zurückzuführen, die in Version 4.5 (glaube ich) beginnen.

MSDN-Dokumentation für Grundlagen zu Codezugriffssicherheit :

  

Das .NET Framework bietet einen Mechanismus zum Erzwingen unterschiedlicher Vertrauensstufen bei unterschiedlichem Code, der in derselben Anwendung ausgeführt wird, der so genannten Code Access Security (CAS). Codezugriffssicherheit in .NET Framework sollte nicht als Mechanismus zum Erzwingen von Sicherheitsgrenzen auf der Grundlage von Code-Origination oder anderen Identitätsaspekten verwendet werden. Wir aktualisieren unsere Anleitung, um zu reflektieren, dass Code Access Security und Security-Transparent Code nicht als Sicherheitsgrenze mit teilweise vertrauenswürdigem Code, insbesondere Code unbekannter Herkunft, unterstützt wird. Wir raten davon ab, Code unbekannter Herkunft zu laden und auszuführen, ohne alternative Sicherheitsmaßnahmen zu treffen.

Und verweist dann auf die Seite für Sicherheitsänderungen im .NET Framework , die besagt:

  

Die wichtigste Sicherheitsänderung in .NET Framework 4.5 ist die starke Benennung.

Was dann auf die Dokumentation für Enhanced Strong Naming verweist welches besagt:

  

Starke Namensschlüssel bestehen aus einem Signaturschlüssel und einem Identitätsschlüssel. Die Assembly ist mit dem Signaturschlüssel signiert und wird durch den Identitätsschlüssel identifiziert. Vor .NET Framework 4.5 waren diese beiden Schlüssel identisch. Beginnend mit .NET Framework 4.5 bleibt der Identitätsschlüssel gleich wie in früheren Versionen von .NET Framework. Der Signaturschlüssel wurde jedoch durch einen stärkeren Hash-Algorithmus erweitert. Außerdem wird der Signaturschlüssel mit dem Identitätsschlüssel signiert, um eine Gegensignatur zu erstellen.

Auch in der Dokumentation zu Secure Coding Guidelines heißt es:

  

Code Access Security und Security - Transparenter Code wird nicht als Sicherheitsgrenze mit teilweise vertrauenswürdigem Code unterstützt. Wir raten davon ab, Code unbekannter Herkunft zu laden und auszuführen, ohne alternative Sicherheitsmaßnahmen zu treffen ...

Das Sicherheitsmodell für .NET hat sich also vor Jahren geändert, aber SQL Server (bis SQL Server 2017) darf weiterhin das alte Sicherheitsmodell verwenden. Es scheint, dass mit SQL Server 2017 entschieden wurde, das alte Sicherheitsmodell nicht mehr zu unterstützen.

Ich vermute, dass das Erlauben des alten Sicherheitsmodells war:

  • verhindert, dass SQL Server (zumindest die CLR-bezogenen Funktionen / Komponenten) auf den neueren Versionen von .NET Framework basiert und

  • verantwortlich für die abrupte Entfernung von SQLCLR als unterstütztes Feature aus der Azure SQL-Datenbank (die Unterstützung wurde Ende 2014 mit dem Start von v12 hinzugefügt, wurde aber am 15. April 2016 vollständig entfernt).

    >

Also, ja, das ist irgendwie scheiße. Was es bedeutet (zumindest im Moment) ist, dass man zuerst ein Zertifikat oder einen asymmetrischen Schlüssel (der zum Signieren von zu ladenden Assemblys verwendet wurde) in [master] erstellt, um dann ein Melden Sie sich an und erteilen Sie UNSAFE ASSEMBLY dem Login. Dies ist die gleiche Abfolge von Ereignissen, die man beim Laden von EXTERNAL_ACCESS und UNSAFE Assemblys durchführen muss, aber jetzt leider für die SAFE Assemblies.

Gegenwärtig gibt es keinen Mechanismus, der dies in einer vollständig tragbaren Weise handhabt (d. h. nicht auf externen Dateien beruht) und nicht von Visual Studio / SSDT ohne manuellen Eingriff gehandhabt werden kann. Das war irgendwie schon der Fall, aber zumindest war es möglich, ein Setup zu erstellen, das dies in einer vollständig portablen Art und Weise (dh vollständig innerhalb eines .sql-Skripts) bewältigt: siehe Stairway zu SQLCLR Level 7: Entwicklung und Sicherheit für Details (das ist ein Artikel, den ich geschrieben habe).

Es ist möglich, ein Zertifikat aus Hex-Bytes (dh FROM BINARY = 0x... ) zu erstellen, aber das funktioniert nicht mit Visual Studio (das auf MSBuild basiert) / SSDT, da die Verwendung von signtool und MSBuild sn benötigt .

Damit dies machbar gemacht wird, damit der Visual Studio / MSBuild / SSDT-Veröffentlichungsprozess funktioniert (was wiederum bedeuten würde, dass jeder in der Lage wäre, ein vollständig eigenständiges .sql-Skript zu erstellen, das den asymmetrischen Schlüssel erzeugen kann) ohne auf eine externe Datei angewiesen zu sein), muss der Befehl CREATE ASYMMETRIC KEY erweitert werden, damit er aus einer Binärzeichenfolge erstellt werden kann.Ich habe diesen Vorschlag für Microsoft Connect gemacht - Erlaube Asymmetrischen Schlüssel aus einer binären Hex-Byte-Zeichenfolge wie CREATE CERTIFICATE zu erstellen - also bitte unterstütze es: -).

Alternativ (im Moment, bis MS hoffentlich eine bessere Methode erstellt, wie zB meine Asymmetric Key-Vorschläge), können Sie eine der beiden Techniken ausprobieren, die ich in den folgenden Blogposts beschreibe (beide arbeiten vollständig mit SSDT):

Als letzter Ort können Sie den folgenden Ansatz in Betracht ziehen:

  1. VORÜBERGEHEND setzen Sie die [master] -Datenbank auf TRUSTWORTHY ON
  2. Erstellen Sie die Assembly in [master]
  3. Erstellen Sie den asymmetrischen Schlüssel aus der Assembly
  4. Löschen Sie die Baugruppe
  5. setze die [master] -Datenbank auf TRUSTWORTHY OFF
  6. Erstellen Sie die Anmeldung über den asymmetrischen Schlüssel
  7. Erteilen Sie UNSAFE ASSEMBLY an diesen Login

Bitte beachten Sie, dass ich nicht die neue Funktion "Trusted Assembly" als Option hinzugefügt habe. Der Grund, warum es nicht erwähnt wurde, liegt darin, dass es viel mehr Mängel als Vorteile hat, ganz zu schweigen davon, dass es überhaupt nicht notwendig ist, da die bestehenden Funktionen bereits die Situation "Trusted Assemblies" behandelten. Ausführliche Informationen dazu und eine Demonstration der korrekten Handhabung von bestehenden, unsignierten Assemblies finden Sie unter: .

    
Solomon Rutzky 20.05.2017, 13:46
quelle
1

Ich bin neulich darauf gestoßen, und es scheint, dass es nicht so schlimm ist, wie es sich anhört (abgesehen davon, dass Sie nicht mehr einfach eine SAFE-Assembly erstellen können, sondern sie unterschreiben müssen, oder TRUSTWORTHY verwenden). .

In meinen Tests:

  • Ich habe eine Assembly erstellt, die sowohl eine "SAFE" -Methode als auch eine "UNSAFE" -Methode hatte. (es verwendet Task).
  • Ich habe die Assembly als SAFE erstellt (nachdem ich sie erstellt und signiert habe) usw.)
  • Ich habe T-SQL-Wrapper-Funktionen für meine beiden Methoden erstellt.
  • Bei der Ausführung der "SAFE" -Funktion hat alles funktioniert.
  • Beim Ausführen von "UNSAFE" habe ich eine HostProtectionException erhalten.

Das bedeutet für mich, dass es immer noch einige Kontrollen gibt, was ausgeführt wird. Ich folgte dem nach:

  • Erneutes Erstellen der Assembly mit PERMISSION_SET = UNSAFE
  • Die Funktionen
  • wurden neu erstellt
  • Nun, als ich die UNSAFE-Funktion ausgeführt habe, hat alles wie erwartet funktioniert.

Ich bin mir also nicht so sicher, ob die Aussage in der Dokumentation von "clr strict security" zu 100% korrekt ist.

Ich habe einen Blogbeitrag über meine Erfahrungen geschrieben, und Sie können ihn hier finden, wenn Sie ihn selbst ausprobieren möchten: Ссылка

Niels

    
Niels Berglund 02.07.2017 07:17
quelle