Dlaczego BULK INSERT jest uważany za niebezpieczny?

21

Chciałbym zrozumieć, dlaczego zespoły ds. Bezpieczeństwa cybernetycznego (więcej niż jedna organizacja, z którą miałem do czynienia) są całkowicie przeciwne przyznawaniu BULK INSERT(np. TSQL) praw do aplikacji i programistów baz danych? Nie mogę uwierzyć w wymówkę „uzupełnianie nadużywania dysku”, chyba że czegoś mi brakuje, ponieważ efekt końcowy nie różni się niczym od aplikacji wykonującej coś takiego:

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

i INSERTjest popularnym poleceniem DML, które może wykonać każdy z podstawowym uprawnieniem do zapisu.

Dla korzyści aplikacji BULK INSERTjest znacznie wydajniejszy, szybszy i uwalnia programistę od konieczności analizowania plików poza SQL.

Edycja: Pierwotnie zadałem to pytanie na stronie bezpieczeństwa informacji z jakiegoś powodu - to nie DBA są przeciwne używaniu BULK INSERT, to „Zapewnienie informacji” (w skrócie IA - ludzie z Cybersecurity), które wymuszają ten problem. Pozwolę, aby to pytanie dusiło się przez kolejny dzień lub dwa, ale jeśli operacja zbiorcza rzeczywiście omija ograniczenia lub wyzwalacze, widzę, że to problem.

JackLThornton
źródło

Odpowiedzi:

19

Biorąc pod uwagę, że prawdopodobnie istnieje tyle samo bezpodstawnych obaw, co nieznanych zagrożeń, uważam, że trudno jest powiedzieć, dlaczego taka polityka istnieje, nie pytając nikogo, kto ją stworzył, dlaczego ich dotyczy.

Sądzę jednak, że prawdopodobnie ma to coś wspólnego z tym, co BULK INSERT/ SqlBulkCopy/ BCP / OPENROWSET(BULK ...)pozwala komuś zrobić, a mianowicie:

  1. wyłączenie ograniczeń ( CHECK, DEFAULTi FOREIGN KEYwierzę)
  2. wyłącz wyzwalacze (jeśli istnieją wyzwalacze kontrolne, pominięcie ich prawdopodobnie zostanie uznane za niepożądane; więcej informacji na temat tego konkretnego problemu można znaleźć w odpowiedzi na @DVK )

Różne opcje opisano w następującej dokumentacji:

Nie wspominając problem blokujący stół zanotowany przez @RDFozz ponieważ nie jest specyficzna dla BULK INSERT: Każdy może stole TABLOCK / XLOCK lub ustaw TRANSACTION ISOLATION LEVELsię SERIALIZABLE.

AKTUALIZACJA

Natknąłem się na dwie dodatkowe informacje, które mogą pomóc to zawęzić:

  1. Kwestie mogąc aby wyłączyć wyzwalaczy Ograniczeń wyłączyć, a zestaw IDENTITY_INSERT ONmoże nie być przytłaczająca powód, aby zobaczyć ADMINISTER BULK OPERATIONS, ADMINISTER DATABASE BULK OPERATIONS(począwszy od SQL Server 2017), czy bulkadminrola serwera jako zagrożenie. Powodem jest to, że aby wykonać którąkolwiek z tych trzech wyżej wymienionych rzeczy, użytkownik musi mieć ALTER TABLEuprawnienia do tej tabeli lub schematu, w którym tabela istnieje. Łańcuch własności nie obejmuje modyfikacji DDL. Tak więc, jeśli użytkownik nie ma ALTER TABLE, to możliwość zrobienia tych trzech rzeczy nie stanowi problemu.

  2. Co nie zostało omówione do tej pory, i co może ostatecznie być kwestia bezpieczeństwa jest to, że oba i dostęp do zasobów zewnętrznych, poza SQL Server. Podczas uzyskiwania dostępu do programu SQL Server za pomocą logowania do systemu Windows to konto Windows zostanie podszywane (nawet jeśli zmienisz kontekst zabezpieczeń za pomocą ) w celu uzyskania dostępu do systemu plików. Oznacza to, że możesz czytać tylko te pliki, do których odczytu masz uprawnienia. Nic w tym złego.BULK INSERTOPENROWSET(BULK...EXECUTE AS LOGIN='...'

    ALE, podczas uzyskiwania dostępu do programu SQL Server za pomocą logowania do SQL Server, dostęp zewnętrzny jest wykonywany w kontekście konta usługi SQL Server. Oznacza to, że osoba z tym uprawnieniem może czytać pliki, których inaczej nie mogłaby odczytać, oraz w folderach, do których nie powinna mieć dostępu.

    Jako minimum, jeśli SQL Server został skonfigurowany do działania jako konto utworzone tylko dla SQL Server (preferowana metoda), wówczas taki użytkownik mógłby odczytać tylko te pliki, do których dostęp ma konto „SQL Server”. Chociaż jest to ograniczony problem, nadal pozwala na odczyt plików, takich jak pliki dziennika SQL Server (przetestowałem następujący przykład i działa):

    SELECT tmp.[Col1]
    FROM   OPENROWSET(BULK
       N'C:\Program Files\Microsoft SQL Server\MSSQLxx.InstanceName\MSSQL\Log\ERRORLOG.1',
                      SINGLE_NCLOB) tmp([Col1]);

    Większość ludzi nie będzie miała dostępu do folderu MSSQL \ Log , więc byłby to sposób na obejście istniejących ograniczeń bezpieczeństwa.

    A jeśli SQL Server działa jako Local Systemkonto, podejrzewam, że zakres problemu tylko się zwiększa i że Użytkownik z tym uprawnieniem będzie mógł odczytać szeroki zakres plików związanych z systemem.

    I jest prawdopodobne, że inne metody importu zbiorczego - BCP i SqlBulkCopy- nie wymagają bulkadminuprawnień / roli: są inicjowane poza SQL Server i same zajmują się uprawnieniami systemu plików. W takich przypadkach SQL Server nigdy nie odczytuje pliku (lub dociera poza SQL Server), po prostu otrzymuje dane do zaimportowania z pliku odczytywanego przez proces zewnętrzny.


Pomijając możliwe implikacje, powiedziano w pytaniu:

Dla korzyści aplikacji BULK INSERT jest znacznie wydajniejszy, szybszy, ..

Okej, kontynuuj ...

i zwalnia programistę z konieczności analizowania plików poza SQL.

Whoa Nelly. Zatrzymajmy się tutaj. T-SQL zwykle nie jest najlepszym wyborem języków do analizy. Często najlepiej jest parsować przed wstawieniem rzeczy do DB. Jednym ze sposobów na to jest użycie parametrów wycenianych w tabeli (TVP). Proszę zobaczyć moją odpowiedź na inne pytanie (tutaj na DBA.StackExchange), które dotyczy tematu wstępnego analizowania i sprawdzania poprawności wraz z wydajnym hurtowym importem wspomnianych danych:

T-SQL: CSV-> potok tabeli z niestandardowymi parsowanymi danymi liczbowymi, wartościami wyszukiwania

Solomon Rutzky
źródło
Po wdrożeniu replikacji należy rozważyć dodatkowe kwestie dotyczące wkładki luzem.
mustaccio
6

Nawiązało się to do wcześniejszej odpowiedzi („... wyłącz wyzwalacze ”), ale nie wyjaśnia, dlaczego wyłączenie byłoby niepożądane z biznesowego punktu widzenia.

W wielu firmach wyzwalacze na głównym stole służą do:

  1. Sprawdź poprawność ograniczeń (te z logiką biznesową bardziej skomplikowane niż zwykle stosowane w ograniczeniach DB)

  2. Co ważniejsze, w celu przeprowadzenia kontroli danych, w szczególności wstawienia danych do odpowiedniej tabeli kontroli (lub zaktualizowania pól kontroli w tabeli głównej).

To dość oczywiste, jakie są problemy z tym pierwszym (twoja aplikacja może wstawiać złe dane, co ma negatywny wpływ na dalsze przetwarzanie). Jeśli chodzi o to drugie, jeśli wyzwalacz jest wyłączony, nie masz żadnych informacji kontrolnych, co stwarza dwa problemy z perspektywy kontroli:

  • Po pierwsze, audyt jako grupa nie może już kontrolować zmian danych, a zatem nie może wykonywać swojej podstawowej funkcji jako Audytu Wewnętrznego.

  • Po drugie, brak danych z audytu może stanowić naruszenie wymogów kontrolnych, którymi podlega firma (np. SAS 70) - co może pociągać za sobą odpowiedzialność firmy za naruszenie umów.

DVK
źródło
Cześć. Nie zgadzam się z twoim opisem tego, co jest tutaj niepożądane, i doceniam szczegóły, ale tylko dla przypomnienia, w odpowiedzi stwierdziłem, że wyłączenie wyzwalaczy byłoby niepożądane, gdyby były wyzwalacze kontroli. To prawda, że ​​nie jest to szczegółowe wyjaśnienie, ale nie do końca dokładne stwierdzenie, że „nie zostało wyjaśnione”. Może lepiej powiedzieć, że było to zbyt uproszczone lub nie zawierało wystarczających wyjaśnień dotyczących wyzwalaczy audytu i nie wspomniało o walidacji (i +1 za wzmiankę o tym i ogólnie dodatkowe szczegóły). Tylko myśl.
Solomon Rutzky
@ SolomonRutzky - konkretnie wskazałem, że odpowiedź „nie wyjaśnia, dlaczego ” to problem :) Jeśli nie możesz zdefiniować problemu biznesowego; szczegóły techniczne są często nieistotne, szczególnie dla OP, który prowadzi biznesową dyskusję z IA. Innymi słowy, jeśli powiedzą „och, wyzwalacze audytu mogą być wyłączone”, IA zapyta „ co dla nas znaczy tat ?” - zazwyczaj nie są to DBA ani programiści.
DVK
dobrze. Wydaje mi się, że właśnie przeczytałem to pierwsze zdanie i stwierdziłem, że „inna odpowiedź, o której mowa, wyłącza wyzwalacze, jest niepożądana, ale nie wyjaśnia, dlaczego”. i tak, ogólnie zgadzam się z tobą co do potrzeby właściwego zdefiniowania problemu, zakładałem (może nie zawsze najlepszą politykę ;-), że PO zrozumiał konsekwencje wyłączenia mechanizmu audytu. Jeśli się mylę, to na szczęście podałeś tutaj te informacje. I właśnie zaktualizowałem swoją odpowiedź, aby link do tego w tym celu :)
Solomon Rutzky
6

Inną możliwością jest wpływ uruchomienia BULK INSERToperacji.

Zwykle tego rodzaju rzeczy byłyby uruchamiane poza godzinami pracy, jeśli to możliwe, aby nie zakłócać normalnej aktywności. Wstawka zbiorcza może blokować tabelę na wiele godzin, zapobiegając występowaniu innych wstawek (a także wybierać, aktualizować lub usuwać).

Lub, z punktu widzenia bezpieczeństwa, może dać bardzo podobne wyniki do ataku DoS.

Trzeba to zrobić przypadkowo lub celowo za pomocą transakcji i prostych INSERTwyciągów. Jednak użycie procesu wstawiania luzem zgodnie z przeznaczeniem może powodować ten efekt.

Ogólnie rzecz biorąc, spodziewałbym się, że DBA będzie zaangażowane w organizowanie zajęć poza godzinami pracy, ponieważ muszą one również upewnić się, że kopie zapasowe i inne zaplanowane zadania zostały ukończone. Gdyby ludzie mieli zaplanować tego rodzaju czynności bez wystarczającego uwzględnienia takich działań, można by zobaczyć, że tworzenie kopii zapasowych kończy się niepowodzeniem - co może być problemem z wielu powodów.

RDFozz
źródło
2

Jednym z powodów tego może być wyjaśnienie rejestrowania działań. Jeśli każda akcja odpowiada jednemu wpisowi w pliku dziennika, dość trywialne jest zobaczenie czegoś, co spowodowało problem bez żadnych dodatkowych odniesień. Jeśli w pliku dziennika jest napisane „WSTAW Z pliku zewnętrznego.pliku”, bez pliku zewnętrznego. Nie możesz nic więcej powiedzieć.

Oczywiście możesz zmodyfikować sposób rejestrowania, ale jako punkt wyjścia wymuszanie atomizacji każdej akcji nawet podczas rejestrowania nie jest strasznym pomysłem.


źródło