Angesichts der Tatsache, dass es wahrscheinlich genauso viele unbegründete Befürchtungen gibt wie unbekannte Risiken, würde ich denken, dass es schwierig ist, wirklich zu sagen, warum eine Richtlinie besteht, ohne zu fragen, wer die Richtlinie erstellt hat, warum sie betroffen ist.
Allerdings würde ich vermuten, dass es wahrscheinlich etwas damit zu tun hat, was BULK INSERT
/ SqlBulkCopy
/ BCP / OPENROWSET(BULK ...)
jemandem erlauben soll, nämlich:
- disable Bedingungen (
CHECK
, DEFAULT
, und FOREIGN KEY
ich glaube)
- Trigger deaktivieren (Wenn Audit-Trigger vorhanden sind, wird deren Umgehung wahrscheinlich als unerwünscht angesehen. Weitere Erläuterungen zu diesem speziellen Problem finden Sie in der Antwort von @DVK. )
Die verschiedenen Optionen werden in der folgenden Dokumentation beschrieben:
Ich habe nicht die Tabellensperre Ausgabe von @RDFozz bemerkt erwähnen , da das ist nicht spezifisch BULK INSERT
: Jeder kann Tabelle eines TABLOCK / XLOCK oder stellen Sie die TRANSACTION ISOLATION LEVEL
zu SERIALIZABLE
.
AKTUALISIEREN
Ich bin auf zwei zusätzliche Informationen gestoßen, die helfen könnten, dies einzugrenzen:
Die Themen in der Lage zu deaktivieren Trigger deaktivieren Einschränkungen und Satz IDENTITY_INSERT ON
könnten nicht ein überwältigender Grund zu sehen sein ADMINISTER BULK OPERATIONS
, ADMINISTER DATABASE BULK OPERATIONS
(beginnend mit SQL Server 2017) oder der bulkadmin
Server - Rolle als Bedrohung. Der Grund dafür ist, dass der Benutzer ALTER TABLE
Berechtigungen für diese Tabelle oder für das Schema, in dem die Tabelle vorhanden ist, haben muss, um eine der drei oben genannten Aktionen ausführen zu können . Die Verkettung der Eigentumsrechte deckt keine DDL-Änderungen ab. Wenn der Benutzer keine hat ALTER TABLE
, ist die Fähigkeit, diese drei Dinge zu tun, kein Problem.
Was bisher noch nicht besprochen wurde und was letztendlich das Sicherheitsproblem sein könnte, ist, dass sowohl externe Ressourcen BULK INSERT
als auch OPENROWSET(BULK...
Zugriff auf externe Ressourcen außerhalb von SQL Server möglich sind. Wenn Sie über eine Windows-Anmeldung auf SQL Server zugreifen, wird die Identität dieses Windows-Kontos angenommen (auch wenn Sie den Sicherheitskontext mithilfe EXECUTE AS LOGIN='...'
von ändern), um den Dateisystemzugriff auszuführen. Dies bedeutet, dass Sie nur Dateien lesen können, für die Sie die Berechtigung zum Lesen erhalten haben. Daran ist nichts auszusetzen.
ABER, wenn Sie über eine SQL Server-Anmeldung auf SQL Server zugreifen, erfolgt der externe Zugriff im Kontext des SQL Server-Dienstkontos. Dies bedeutet, dass jemand mit dieser Berechtigung Dateien lesen kann, auf die er andernfalls keinen Zugriff haben sollte, und in Ordnern, auf die er keinen Zugriff haben sollte.
Wenn SQL Server als Konto eingerichtet wurde, das nur für SQL Server erstellt wurde (die bevorzugte Methode), konnte ein solcher Benutzer mindestens nur die Dateien lesen, auf die das Konto "SQL Server" Zugriff hat. Dies ist zwar ein begrenztes Problem, ermöglicht jedoch das Lesen von Dateien wie SQL Server-Protokolldateien (und ich habe das folgende Beispiel getestet und es funktioniert):
SELECT tmp.[Col1]
FROM OPENROWSET(BULK
N'C:\Program Files\Microsoft SQL Server\MSSQLxx.InstanceName\MSSQL\Log\ERRORLOG.1',
SINGLE_NCLOB) tmp([Col1]);
Die meisten Benutzer haben keinen Zugriff auf den Ordner MSSQL \ Log. Auf diese Weise können vorhandene Sicherheitsbeschränkungen umgangen werden.
Und wenn SQL Server als Local System
Konto ausgeführt wird, besteht der Verdacht, dass der Umfang des Problems nur zunimmt und dass ein Benutzer mit dieser Berechtigung in der Lage ist, eine Vielzahl von systembezogenen Dateien zu lesen.
UND, dies ist wahrscheinlich der Grund, warum die anderen Methoden zum Ausführen von Massenimporten - BCP und SqlBulkCopy
- nicht die bulkadmin
Berechtigung / Rolle erfordern : Sie werden außerhalb von SQL Server initiiert und behandeln Dateisystemberechtigungen selbstständig. In diesen Fällen liest SQL Server die Datei nie (oder erreicht sie außerhalb von SQL Server), sondern empfängt nur die zu importierenden Daten aus der Datei, die vom externen Prozess gelesen wird.
Abgesehen von möglichen Implikationen wurde in der Frage gesagt:
Für die Vorteile einer Anwendung ist BULK INSERT weitaus effizienter, schneller, ..
OK mach weiter...
und entlastet den Programmierer von der Notwendigkeit, Dateien außerhalb von SQL zu analysieren.
Whoa Nelly. Hören wir gleich hier auf. T-SQL ist normalerweise nicht die beste Wahl für das Parsing. Es ist oft am besten, das Parsen vor dem Einfügen von Dingen in die DB durchzuführen. Eine Möglichkeit, dies zu tun, ist die Verwendung von TVPs (Table-Valued Parameters). Bitte beachten Sie meine Antwort auf eine andere Frage (hier auf DBA.StackExchange), die sich mit dem Thema Voranalyse und Validierung sowie dem effizienten Massenimport dieser Daten befasst:
T-SQL: CSV-> Tabellen-Pipeline mit benutzerdefinierten geparsten numerischen Daten und Suchwerten