Чому BULK INSERT вважається небезпечним?


21

Мені хотілося б зрозуміти, чому команди з кібербезпеки взагалі (більше ніж одна організація, з якою я маю справу) мертво налаштовані на надання BULK INSERT(наприклад, TSQL) прав додаткам та програмістам баз даних? Я не можу повірити виправданню "заповнення зловживання дисками", якщо я щось не пропускаю, оскільки кінцевий результат не відрізняється від програми, яка робить щось на кшталт:

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

і INSERTє загальною командою DML, яку може виконувати кожен, хто має базовий дозвіл на запис.

З користю для програми, BULK INSERTце набагато ефективніше, швидше і позбавляє програміста від необхідності розбору файлів поза SQL.

Редагувати: Я спочатку задав це питання на сайті інформаційної безпеки з причини - це не DBA, які проти того, щоб використовувати BULK INSERT, це "Забезпечення інформації" (IA коротко - люди з кібербезпеки) змушують цю проблему. Я дам цьому питанню тушкуватися ще день-два, але якщо об'ємна операція дійсно обходить обмеження чи тригери, я можу побачити, що це проблема.

Відповіді:


19

Зважаючи на те, що, мабуть, існує стільки ж необгрунтованих побоювань, скільки є невідомих ризиків, я думаю, що важко реально сказати, чому така політика діє, не запитуючи того, хто створив політику, для чого їх хвилює.

Однак я б припустив, що це, мабуть, має щось спільне з тим, що BULK INSERT/ SqlBulkCopy/ BCP / OPENROWSET(BULK ...)хтось дозволяє, а саме:

  1. відключити обмеження ( CHECK, DEFAULTі FOREIGN KEYя вважаю)
  2. вимкнути тригери (якщо є тригери аудиту, їх проходження, ймовірно, вважатиметься небажаним; для більш детального пояснення з цього питання див. відповідь @DVK )

Різні варіанти описані в наступній документації:

Я не згадав проблему блокування таблиці , зазначену @RDFozz так , що не є специфічним для BULK INSERT: кожного столу може зробити TABLOCK / XLOCK або встановити TRANSACTION ISOLATION LEVELв SERIALIZABLE.

ОНОВЛЕННЯ

Я натрапив на дві додаткові відомості, які можуть допомогти зменшити цю проблему:

  1. Питання можливості для відключення тригерів, відключають обмежень і набору IDENTITY_INSERT ONможуть НЕ бути переважної причиною , щоб побачити ADMINISTER BULK OPERATIONS, ADMINISTER DATABASE BULK OPERATIONS(починаючи з SQL Server 2017), або bulkadminролі сервера в якості загрози. Причина полягає в тому, що для виконання будь-якої з цих трьох речей, щойно згаданих, Користувачеві необхідно мати ALTER TABLEдозволи на цю таблицю або на схему, в якій існує Таблиця. Ланцюжок власності не охоплює модифікацій DDL. Отже, якщо у користувача немає ALTER TABLE, то можливість робити ці три речі - це не проблема.

  2. Що не обговорюється до цих пір, і що в кінцевому підсумку може бути проблема безпеки є те , що обидва і доступу до зовнішніх ресурсів, поза SQL Server. Під час доступу до SQL Server за допомогою Windows Login, цей обліковий запис Windows буде видано себе за особу (навіть якщо ви переключите контекст безпеки, використовуючи ) для доступу до файлової системи. Це означає, що ви можете читати лише ті файли, яким ви дали дозвіл на читання. Нічого поганого в цьому немає.BULK INSERTOPENROWSET(BULK...EXECUTE AS LOGIN='...'

    АЛЕ при доступі до SQL Server через вхід у систему SQL Server, тоді зовнішній доступ здійснюється в контексті облікового запису служби SQL Server. Це означає, що хтось із цим дозволом міг би читати файли, які в іншому випадку вони не мають змоги читати, а також у папках, до яких вони не повинні мати доступу.

    Як мінімум, якщо SQL Server був створений для роботи як облікового запису, створеного саме для SQL Server (кращий метод), то такий Користувач міг читати лише ті файли, до яких має доступ до облікового запису "SQL Server". Хоча це обмежена проблема, вона все ще дозволяє читати такі файли, як файли журналів SQL Server (і я протестував наступний приклад, і він працює):

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

    Більшість людей не матимуть доступу до папки MSSQL \ Log , тому це буде способом обійти існуючі обмеження безпеки.

    І якщо SQL Server працює як Local Systemобліковий запис, я підозрюю, що масштаб проблеми лише збільшується, і що Користувач з цим дозволом зможе прочитати широкий спектр системних файлів.

    І, ймовірно, тому інші методи здійснення масового імпорту - BCP та SqlBulkCopy- не вимагають bulkadminдозволу / ролі: вони ініціюються за межами SQL Server і самостійно керуватимуть правами файлової системи. У таких випадках SQL Server ніколи не читає файл (або не надходить за межі SQL Server), він просто отримує дані для імпорту з файлу, який читається зовнішнім процесом.


Можливі наслідки вбік, було сказано в питанні:

Для вигоди програми, BULK INSERT набагато ефективніший, швидший, ..

Гаразд, продовжуй ...

і позбавляє програміста від необхідності розбору файлів поза SQL.

О, Нелі. Зупинимось тут. T-SQL, як правило, не найкращий вибір мов для розбору. Найчастіше найкраще робити розбір, перш ніж вставляти речі в БД. Один із способів зробити це - використовувати параметри таблиці (TVP). Будь ласка, дивіться мою відповідь на інше питання (тут на DBA.StackExchange), яке стосується теми попереднього розбору та перевірки, а також ефективного масового імпорту цих даних:

T-SQL: CSV-> конвеєр таблиці зі спеціальними проаналізованими числовими даними, значеннями пошуку


Коли на місці реплікації є додаткові міркування, які слід враховувати для масового вставки.
мустаччо

6

Про це наголошувалось у попередній відповіді ("... відключити тригери "), але не пояснюється, чому відключення було б небажаним з точки зору бізнесу.

У багатьох підприємствах тригери на головній таблиці використовуються для:

  1. Перевірка обмежень цілісності (ті, у кого бізнес-логіка складніша, ніж зазвичай використовується в обмеженнях БД)

  2. Що ще важливіше - перевірити дані, зокрема вставити дані у відповідну таблицю аудиту (або оновити поля аудиту в головній таблиці).

Досить очевидно, у чому проблеми з попередніми (ваша програма може вставити погані дані, що негативно впливає на подальшу обробку). Що стосується останнього, якщо тригер вимкнено, ви не маєте жодної аудиторської інформації, яка створює дві проблеми з точки зору аудиту:

  • Перш за все, аудит як група більше не може ревізувати зміни даних і, таким чином, не в змозі виконувати свою основну функцію як внутрішній аудит.

  • По-друге, відсутність аудиторських записів може бути порушенням аудиторських вимог, якими керується компанія (наприклад, SAS 70) - що може призвести до відповідальності вашої компанії за порушення договорів.


Привіт там. Я не погоджуюся з вашим описом того, що тут небажано, і я дуже ціную деталі, але тільки для запису я заявив у своїй відповіді, що відключення тригерів було б небажаним, якби були тригери аудиту. Щоправда, це не детальне пояснення, але не зовсім точне, щоб сказати, що це "не було пояснено". Можливо, краще сказати, що це було занадто спрощено, або не дало достатньо пояснень щодо тригерів аудиту, і не згадало про перевірку (і +1 для згадування про це та для додаткової детальної інформації в цілому). Просто думка.
Соломон Руцький

@SolomonRutzky - я спеціально зазначив, що відповідь "не пояснює, чому " це проблема :) Якщо ви не можете визначити бізнес-проблему; технічні деталі часто не мають значення, особливо для ОП, які обговорюють бізнес-дискусію з ІА. Іншими словами, якщо вони скажуть "о, тригери аудиту можуть бути відключені", ІА запитає " що для нас означає "? - зазвичай це не DBA або розробники.
DVK

добре. Я здогадуюсь, що я просто прочитав це перше речення, як те, що "інша відповідь, згадана про відключення тригерів, небажана, але не пояснила, чому". і так, я, як правило, погоджуюся з вами щодо необхідності правильного визначення проблеми, я припускав (можливо, не завжди найкраща політика ;-), що ОП розуміє наслідки відключення механізму аудиту. Якщо я невірний, то, на щастя, ви надали цю інформацію тут. І тому я щойно оновив свою відповідь, щоб зв’язати це з цією метою :)
Соломон Руцький

6

Іншою можливістю є вплив запуску BULK INSERTоперації.

Зазвичай подібні речі, коли це можливо, працюватимуть у неробочий час, щоб не заважати нормальній діяльності. Об'ємна вставка може заблокувати таблицю протягом кількох годин, не дозволяючи іншим вставкам траплятися (а також вибирати, оновлювати чи видаляти).

Або з точки зору безпеки це може призвести до дуже схожих результатів на атаку DoS.

Справді, це можна зробити випадково або навмисно за допомогою транзакцій та простих INSERTзаяв. Однак, використовуючи об'ємний процес вставлення за призначенням може призвести до цього ефекту.

Як правило, я б очікував, що DBA буде залучена до організації позаурочної діяльності, оскільки їм також потрібно забезпечити резервне копіювання та інші заплановані завдання. Якщо люди планували б планувати подібні речі без належного розгляду таких заходів, ви могли б побачити, що резервні копії не вдається - що може стати проблемою з кількох причин.


2

Одна з причин цього може полягати в тому, щоб зробити чіткий журнал дій. Якщо кожна дія відповідає одному запису у файлі журналу, досить тривіально бачити щось, що спричинило проблему, без додаткових посилань. Якщо у вашому файлі журналу написано "ВСТАВКА ВІД зовнішньої.файлу", без external.file ви нічого більше не можете сказати.

Звичайно, ви можете змінити спосіб роботи журналу, але, як відправна точка, примушувати кожну дію бути атомною навіть під час реєстрації - це не страшна ідея.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.