Warum wird BULK INSERT als gefährlich eingestuft?

21

Ich würde gerne verstehen, warum Cybersicherheitsteams im Allgemeinen (mehr als eine Organisation, mit der ich zu BULK INSERTtun hatte) absolut dagegen sind, Anwendungen und Datenbankprogrammierern (z. B. TSQL) Rechte zu erteilen. Ich kann die Ausrede "Füllen der Festplatte" nicht glauben, es sei denn, ich vermisse etwas, da das Endergebnis nicht anders ist als eine Anwendung, die so etwas wie Folgendes ausführt:

for (long i = 0; i < LONG_MAX; ++i)
    executeSQL("INSERT INTO table VALUES(...)");

und INSERTist ein allgemeiner DML-Befehl, den jeder mit grundlegenden Schreibrechten ausführen kann.

Es BULK INSERTist weitaus effizienter, schneller und entlastet den Programmierer von der Notwendigkeit, Dateien außerhalb von SQL zu analysieren.

Bearbeiten: Ich habe diese Frage ursprünglich auf der Informationssicherheitsseite aus einem Grund gestellt. Es sind nicht die Datenbankadministratoren, die gegen die Verwendung von BULK INSERT sind, sondern die "Information Assurance" (kurz IA - Cybersecurity), die das Problem erzwingen. Ich lasse diese Frage noch ein oder zwei Tage schmoren, aber wenn die Massenoperation tatsächlich Einschränkungen oder Auslöser umgeht, kann ich sehen, dass dies ein Problem ist.

JackLThornton
quelle

Antworten:

19

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:

  1. disable Bedingungen ( CHECK, DEFAULT, und FOREIGN KEYich glaube)
  2. 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 LEVELzu SERIALIZABLE.

AKTUALISIEREN

Ich bin auf zwei zusätzliche Informationen gestoßen, die helfen könnten, dies einzugrenzen:

  1. Die Themen in der Lage zu deaktivieren Trigger deaktivieren Einschränkungen und Satz IDENTITY_INSERT ONkönnten nicht ein überwältigender Grund zu sehen sein ADMINISTER BULK OPERATIONS, ADMINISTER DATABASE BULK OPERATIONS(beginnend mit SQL Server 2017) oder der bulkadminServer - Rolle als Bedrohung. Der Grund dafür ist, dass der Benutzer ALTER TABLEBerechtigungen 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.

  2. Was bisher noch nicht besprochen wurde und was letztendlich das Sicherheitsproblem sein könnte, ist, dass sowohl externe Ressourcen BULK INSERTals 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 SystemKonto 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 bulkadminBerechtigung / 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

Solomon Rutzky
quelle
Bei vorhandener Replikation sind zusätzliche Überlegungen für die Masseneinfügung erforderlich.
mustaccio
6

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:

  1. Integritätsbeschränkungen validieren (bei denen die Geschäftslogik komplizierter ist als normalerweise bei DB-Beschränkungen)

  2. 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.

DVK
quelle
Hallo. Ich bin nicht anderer Meinung als Ihre Beschreibung dessen, was hier unerwünscht ist, und ich weiß das Detail zu schätzen, aber ich habe in meiner Antwort lediglich zu Protokoll gegeben, dass das Deaktivieren von Triggern unerwünscht wäre, wenn es Audit-Trigger gäbe. Das ist zwar keine ausführliche Erklärung, aber nicht genau zu sagen, dass es "nicht erklärt" wurde. Vielleicht ist es besser zu sagen, dass es zu simpel war oder nicht genügend Erklärungen zu Audit-Triggern lieferte und die Validierung nicht erwähnte (und +1, um das zu erwähnen und für die zusätzlichen Details insgesamt). Nur ein Gedanke.
Solomon Rutzky
@SolomonRutzky - Ich habe ausdrücklich darauf hingewiesen, dass die Antwort "nicht erklärt, warum " das ein Problem ist :) Wenn Sie kein Geschäftsproblem definieren können; Technische Details sind oft irrelevant, insbesondere für OP, die ein geschäftliches Gespräch mit IA führen. Mit anderen Worten, wenn sie sagen "Oh, Audit-Trigger können deaktiviert sein", wird IA fragen: " Was bedeutet das für uns ?" - Sie sind normalerweise keine DBAs oder Entwickler.
DVK
okay. Ich habe wohl gerade den ersten Satz gelesen und gesagt, dass "die andere Antwort, die das Deaktivieren von Triggern erwähnt, unerwünscht ist, aber nicht erklärt, warum". und ja, ich stimme Ihnen im Allgemeinen darin zu, dass das Problem richtig definiert werden muss, und ich ging davon aus (vielleicht nicht immer die beste Richtlinie ;-), dass das OP die Auswirkungen der Deaktivierung eines Prüfungsmechanismus verstanden hat. Wenn ich falsch liege, haben Sie diese Informationen zum Glück hier angegeben. Und so habe ich gerade meine Antwort aktualisiert, um zu diesem Zweck einen Link zu
erstellen
6

Eine andere Möglichkeit ist die Auswirkung der Ausführung einer BULK INSERTOperation.

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 INSERTAussagen 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.

RDFozz
quelle
2

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