Sicherheits- oder Leistungsrisiken bei Verwendung von SQL CLR [geschlossen]


11

Gibt es besondere Sicherheits- oder Leistungsrisiken bei der Verwendung der CLR in SQL Server?


Nein, SQLCLR-Code kann in einer Datenbank nicht mehr als ein gleichwertiges T-SQL-Codemodul, das unter demselben Sicherheitskontext ausgeführt wird. Das ignorante Verbot von CLR verhindert auch die SSISDB-Bereitstellung, wodurch die Sicherheit durch weniger RDP-Konten, Dateisystemverwaltung und weniger Rechteanforderungen, Backup-Vererbung innerhalb der Wartungspläne, vollständige Paketverschlüsselung über TDE drastisch verbessert wird, ganz zu schweigen von SSIS-Paketbereitstellungen und Wartung über den Umgebungsabschnitt der SSISDB und das Fehlen vieler C # -Funktionen in SSIS, die CLR erfordern.
Bryan Swan

1
Ich habe dafür gestimmt, diese Frage erneut zu eröffnen, weil ich glaube, dass sie für die Community von Bedeutung ist. Die aktuelle Frage ist eine gültige Frage, da die Einstiegsstufe für einen DBA in die CLS-Sicherheitseinstellungen ziemlich hoch ist. Die gut geschriebene Antwort von @SolomonRutzky bietet eine gute Einführung in die Sicherheitseinstellungen von CLR, die Microsoft auf dieser vereinfachenden Ebene nicht bereitstellt.
John aka hot2use

Antworten:


10

Die Frage ist, wie Remus betonte, zu allgemein, um eine Antwort zu erhalten, da die Antwort vom Kontext abhängt, welche Funktionen verwendet werden sollen und wie sie verwendet werden.

In Bezug auf "Sicherheit":

Wenn Sie nach etwas fragen, das in einer mit gekennzeichneten Baugruppe ausgeführt werden kann PERMISSION_SET = SAFE, gibt es keine Probleme, die ich jemals finden konnte. Und SQLCLR ist "sicherer" als die Verwendung xp_cmdshelloder die wunderbaren (das war Sarkasmus) sp_OA*Procs (oder sogar Extended Stored Procedures, aber hoffentlich erstellt niemand mehr diese).

Wenn Sie wissen möchten, was "SAFE" in der Praxis bedeutet, lesen Sie bitte diesen Artikel: Treppe zu SQLCLR Level 3: Sicherheit (Allgemeine und SAFE-Baugruppen) (kostenlose Registrierung erforderlich).

Wenn Sie nach etwas fragen, das in einer mit gekennzeichneten Baugruppe ausgeführt PERMISSION_SET = EXTERNAL_ACCESSwerden kann, bestehen wiederum Risiken, je nachdem, welche Funktionen verwendet werden. Wenn Sie eine Routine zum Lesen von Verzeichnissen und Dateinamen schreiben (dh schreibgeschützt), ist es nur eine Frage dessen, was gesehen und nicht gesehen werden sollte. Wenn Sie Code schreiben, mit dem eine Datei gelöscht werden kann, steigt das Risiko. Was mit diesen externen Ressourcen getan werden kann , wird jedoch gesteuert durch:

  • ob Sie Identitätswechsel verwenden oder nicht:
    • Kein Identitätswechsel bedeutet, dass der Zugriff auf externe Ressourcen über das Konto "Anmelden als" des SQL Server-Dienstes erfolgt. Unabhängig davon, auf welches Konto dieser Zugriff hat, kann Ihre SQLCLR-Funktion dies tun.
    • Die Verwendung des Identitätswechsels bedeutet, dass die Anmeldung in SQL Server, auf der die Funktion ausgeführt wird, wenn diese Anmeldung einer Windows-Anmeldung entspricht, alles tun kann, was diese bestimmte Windows-Anmeldung zulässt. Wenn es sich bei der Anmeldung in SQL Server um eine SQL Server-Anmeldung handelt, wird beim Versuch, Identitätswechsel zu verwenden, eine Fehlermeldung angezeigt.
  • Welche Berechtigungen sind für die externe Ressource eingerichtet? Für den Dateisystemzugriff wird dies über ACLs auf NTFS-Laufwerken gesteuert.

Wenn Sie nach etwas fragen, das in einer mit gekennzeichneten Baugruppe ausgeführt werden kann PERMISSION_SET = UNSAFE, das ist ziemlich offen. Viele Funktionen können nur in UNSAFE-Assemblys verwendet werden, da es sich eher um Stabilitäts- und / oder konsistente Verhaltensprobleme als um Sicherheit oder Leistung handelt. In einer UNSAFE-Assembly ist es beispielsweise möglich, eine beschreibbare statische Variable zu haben. Dies ist normalerweise keine gute Sache, da die SQLCLR-Klassen für alle Sitzungen gemeinsam genutzt werden. Wenn Sie beabsichtigen, Daten im Speicher über alle Sitzungen hinweg gemeinsam zu nutzen und die Rennbedingungen geplant haben (und zahlreiche Tests durchgeführt haben), sollten Sie in Ordnung sein, da Sie dieses Verhalten erwarten. Wenn Sie jedoch einfach wollten, dass eine beschreibbare statische Variable einen Wert für eine bestimmte Sitzung zwischenspeichert, damit sie nicht erneut nachgeschlagen oder erneut berechnet werden muss, und nicht wissen, dass andere Sitzungen diesen Wert lesen und möglicherweise überschreiben, das wäre ein Problem.

Aber wenn Sie sich Sorgen machen, dass jemand in die Registrierung schreibt, aber noch keinen Code hat, der tatsächlich in die Registrierung schreibt, müssen Sie sich wahrscheinlich keine Sorgen machen ;-).

Wenn Sie einen Überblick über die praktische Funktionsweise von EXTERNAL_ACCESS und UNSAFE sowie den Unterschied zwischen der Einstellung TRUSTWORTHY ON(nicht bevorzugt) und der Verwendung eines auf asymmetrischen Schlüsseln oder Zertifikaten basierenden Logins wünschen, lesen Sie bitte diesen Artikel: Treppe zu SQLCLR Level 4: Sicherheit (EXTERNE und UNSICHERE Baugruppen) (kostenlose Registrierung erforderlich).

In Bezug auf "Leistung":

Dies ist alles eine Frage dessen, was Sie versuchen und wie Sie es tun. Es gibt einige Dinge, die in SQLCLR viel schneller sind, und einige Dinge, die langsamer sind. Aber genau wie bei T-SQL ist es möglich, eine etwas einfache und / oder effiziente Aufgabe zu übernehmen und sie durch falsche Vorgehensweisen kompliziert und / oder ineffizient zu machen. Die Verwendung von SQL CLR ist jedoch von Natur aus nicht langsamer.


6

SQLCLR-Assemblys können mit drei Sicherheitszugriffsebenen installiert werden : SAFE | EXTERNAL_ACCESS | UNSAFE. Dies ist ausführlich dokumentiert, siehe BaugruppenCREATE ASSEMBLY und Entwerfen von Baugruppen :

Verwalten der Assembly-Sicherheit
Sie können steuern, wie stark eine Assembly auf Ressourcen zugreifen kann, die durch .NET Code Access Security geschützt sind, wenn verwalteter Code ausgeführt wird. Dazu geben Sie beim Erstellen oder Ändern einer Assembly einen von drei Berechtigungssätzen an: SAFE, EXTERNAL_ACCESS oder UNSAFE.

SAFE
SAFE ist der Standardberechtigungssatz und der restriktivste. Code, der von einer Assembly mit SAFE-Berechtigungen ausgeführt wird, kann nicht auf externe Systemressourcen wie Dateien, das Netzwerk, Umgebungsvariablen oder die Registrierung zugreifen. SAFE-Code kann auf Daten aus den lokalen SQL Server-Datenbanken zugreifen oder Berechnungen und Geschäftslogik ausführen, bei denen nicht auf Ressourcen außerhalb der lokalen Datenbanken zugegriffen wird.
Die meisten Assemblys führen Berechnungs- und Datenverwaltungsaufgaben aus, ohne auf Ressourcen außerhalb von SQL Server zugreifen zu müssen. Daher empfehlen wir SAFE als Assembly-Berechtigungssatz.

EXTERNAL_ACCESS
Mit EXTERNAL_ACCESS können Assemblys auf bestimmte externe Systemressourcen wie Dateien, Netzwerke, Webdienste, Umgebungsvariablen und die Registrierung zugreifen. Nur SQL Server-Anmeldungen mit EXTERNAL ACCESS-Berechtigungen können EXTERNAL_ACCESS-Assemblys erstellen. SAFE- und EXTERNAL_ACCESS-Assemblys können nur Code enthalten, der nachweislich typsicher ist. Dies bedeutet, dass diese Assemblys nur über genau definierte Einstiegspunkte auf Klassen zugreifen können, die für die Typdefinition gültig sind. Daher können sie nicht willkürlich auf Speicherpuffer zugreifen, die nicht dem Code gehören. Darüber hinaus können sie keine Vorgänge ausführen, die sich negativ auf die Robustheit des SQL Server-Prozesses auswirken könnten.

UNSAFE
UNSAFE ermöglicht Assemblys uneingeschränkten Zugriff auf Ressourcen innerhalb und außerhalb von SQL Server. Code, der in einer UNSAFE-Assembly ausgeführt wird, kann nicht verwalteten Code aufrufen. Wenn Sie UNSAFE angeben, kann der Code in der Assembly auch Vorgänge ausführen, die vom CLR-Prüfer als typsicher eingestuft werden. Diese Vorgänge können möglicherweise unkontrolliert auf Speicherpuffer im SQL Server-Prozessbereich zugreifen. UNSAFE-Assemblys können möglicherweise auch das Sicherheitssystem von SQL Server oder die Common Language Runtime untergraben. UNSAFE-Berechtigungen sollten nur hoch vertrauenswürdigen Assemblys von erfahrenen Entwicklern oder Administratoren erteilt werden. Nur Mitglieder der festen Serverrolle sysadmin können UNSAFE-Assemblys erstellen.

Es gibt weitere Einschränkungen für zulässige CLR-Attribute und nur eine Teilmenge der .Net Framework-Assemblys wird unterstützt. Weitere Informationen finden Sie in der verknüpften Dokumentation.

In Bezug auf die Leistung ist es am wichtigsten, sich daran zu erinnern, dass SQL Server eine kooperative Multitasking-Umgebung ist, CLR jedoch nicht. Der SQLCLR-Code muss immer dann aufgerufen werden, Thread.BeginThreadAffinity()wenn er die CPU für eine beliebige Dauer (einschließlich Blockierung) belastet . Adam Machanic hat eine hervorragende Präsentation zum Thema, Daten ansehen , Schneller: Microsoft SQL Server-Leistungstechniken mit SQLCLR .

Das Thema ist groß und die Frage vage. SQLCLR kann einige einzigartige Aufgaben ausführen, mit denen keine andere Funktion übereinstimmen kann. Und SQLCLR ist nur eine weitere Waffe im SQL Server-Arsenal, mit der Sie sich in den Fuß schießen können, Leistung oder Sicherheit. Lesen Sie die Dokumentation.


Danke für diesen Remus. Ich weiß, dass die Frage vage ist, aber gibt es diesbezüglich Sicherheitsprobleme? danke
SQLBen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.