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
Dies wurde in einer früheren Antwort erwähnt ("... Trigger deaktivieren "), erklärt jedoch nicht, warum eine Deaktivierung aus geschäftlicher Sicht unerwünscht wäre.
In vielen Unternehmen werden Trigger auf der Haupttabelle verwendet, um:
Integritätsbeschränkungen validieren (bei denen die Geschäftslogik komplizierter ist als normalerweise bei DB-Beschränkungen)
Noch wichtiger ist es, die Daten zu prüfen, insbesondere Daten in die entsprechende Prüftabelle einzufügen (oder die Prüffelder in der Haupttabelle zu aktualisieren).
Es ist ziemlich offensichtlich, was die Probleme mit ersteren sind (Ihre Anwendung kann fehlerhafte Daten einfügen, die sich negativ auf die nachgelagerte Verarbeitung auswirken). In letzterem Fall verfügen Sie über keine Überwachungsinformationen, wenn ein Auslöser deaktiviert ist. Dies wirft aus Sicht der Überwachung zwei Probleme auf:
Erstens kann die Prüfung als Gruppe die Datenänderungen nicht mehr prüfen und ist daher nicht in der Lage, ihre primäre Funktion als interne Prüfung wahrzunehmen.
Zweitens kann das Fehlen von Prüfungsunterlagen einen Verstoß gegen die Prüfungsanforderungen darstellen, denen ein Unternehmen unterliegt (z. B. SAS 70). Dadurch kann Ihr Unternehmen für Verstöße gegen die Verträge haftbar gemacht werden.
quelle
Eine andere Möglichkeit ist die Auswirkung der Ausführung einer
BULK INSERT
Operation.Normalerweise wird so etwas nach Möglichkeit außerhalb der Geschäftszeiten ausgeführt, um die normale Aktivität nicht zu beeinträchtigen. Eine Masseneinfügung kann eine Tabelle stundenlang sperren, um zu verhindern, dass andere Einfügungen vorgenommen werden (sowie Auswählen, Aktualisieren oder Löschen).
Aus Sicherheitssicht kann dies zu sehr ähnlichen Ergebnissen führen wie ein DoS-Angriff.
Zugegebenermaßen kann man dies entweder versehentlich oder absichtlich mit Transaktionen und einfachen
INSERT
Aussagen tun . Die bestimmungsgemäße Verwendung eines Masseneinfügungsprozesses kann diesen Effekt jedoch verursachen.Im Allgemeinen würde ich erwarten, dass ein DBA an der Organisation von Aktivitäten außerhalb der Geschäftszeiten beteiligt ist, da er auch sicherstellen muss, dass Sicherungen und andere geplante Jobs vollständig sind. Wenn die Leute solche Dinge planen, ohne diese Aktivitäten ausreichend zu berücksichtigen, könnten Backups fehlschlagen - was aus mehreren Gründen ein Problem sein kann.
quelle
Ein Grund dafür kann darin liegen, dass die Protokollierung von Aktionen übersichtlich ist. Wenn jede Aktion einem Eintrag in einer Protokolldatei entspricht, ist es ziemlich trivial, etwas zu sehen, das ein Problem verursacht hat, ohne dass ein zusätzlicher Verweis erforderlich ist. Wenn in Ihrer Protokolldatei "INSERT FROM external.file" (ohne external.file) angegeben ist, können Sie keine weiteren Angaben machen.
Natürlich können Sie die Funktionsweise der Protokollierung ändern, aber als Ausgangspunkt ist es keine schreckliche Idee, jede Aktion auch innerhalb der Protokollierung als atomar zu erzwingen.
quelle