Ризики безпеки або продуктивності за допомогою SQL CLR [закрито]


11

Чи існують якісь особливі ризики для безпеки або продуктивності використання CLR в SQL сервері?


Ні, код SQLCLR не може робити більше нічого в базі даних, ніж еквівалентний модуль коду T-SQL, що працює в тому ж контексті безпеки. Ігнорування заборони CLR також запобігає розгортанню SSISDB, що різко покращує безпеку за рахунок менших облікових записів RDP, управління файловою системою та меншими потребами прав, спадкування резервного копіювання в планах технічного обслуговування, повне шифрування пакунків через TDE, нічого не говорячи про розгортання та обслуговування пакетів SSIS через розділ оточення SSISDB та відсутність багатьох функцій C # в SSIS, які вимагають CLR.
Брайан Лебедь

1
Я проголосував за повторне відкриття цього питання, тому що я вважаю, що воно має певне значення для громади. Поки що це питання є вагомим питанням, оскільки рівень входу для DBA в налаштування безпеки CLS досить високий. Добре написана відповідь @SolomonRutzky забезпечує хороше введення в параметри безпеки CLR, які на цьому спрощеному рівні не передбачені Microsoft.
Джон aka hot2use

Відповіді:


10

Як зазначив Ремус, питання є надто загальним, щоб отримати відповідь, оскільки відповідь залежить від контексту, яку функціональність слід використовувати та як вона буде використовуватися.

Щодо "Безпеки":

Якщо ви запитуєте про що-небудь, що можна зробити на зборах, позначених знаком PERMISSION_SET = SAFE, тоді я жодного разу не міг знайти. І SQLCLR є "безпечнішим", ніж використання xp_cmdshellабо чудові (це був сарказм) sp_OA*програми (або навіть розширені збережені процедури, але, сподіваємось, ніхто більше не створює жодного з них).

Якщо ви хочете ознайомитись із тим, що означає "БЕЗКОШТОВНІ" на практиці, перегляньте цю статтю: Сходи до рівня SQLCLR 3: Безпека (Загальні та ЗБЕЗ) (потрібна безкоштовна реєстрація).

Якщо ви запитуєте про що-небудь, що можна зробити у складі, позначеному символом PERMISSION_SET = EXTERNAL_ACCESS, то, звичайно, знову є ризики, залежно від того, яка функціональність використовується. Якщо ви пишете рутину для читання каталогів та імен файлів (тобто лише для читання), то це лише питання того, що слід бачити, а не бачити. Якщо ви пишете код, який дозволяє видалити файл, ризик збільшується. Але те, що можна зробити з цими зовнішніми ресурсами, контролюється:

  • незалежно від того, використовуєте ви себе чи ні:
    • відсутність представлення себе за особу, доступ до зовнішніх ресурсів здійснюється через обліковий запис "Увійти як" служби SQL Server. До якого б облікового запису не було доступу, ваша функція SQLCLR зможе виконувати.
    • використання імперсонації означає, що Вхід у SQL Server, який виконує цю функцію, якщо цей Вхід відповідає Входу в Windows, може робити все, що дозволяє зробити конкретний Вхід для Windows. Якщо Вхід у SQL Server - це вхід у систему SQL Server, то при спробі використання Імперсонації вийде помилка.
  • Які дозволи встановлюються на зовнішньому ресурсі. Для доступу до файлової системи це контролюється через ACL на накопичувачах NTFS.

Якщо ви запитуєте про що-небудь, що можна зробити в зборі, позначеному символом PERMISSION_SET = UNSAFE, тобто досить відкритим. Багато функціональних можливостей вважається корисним лише для зборів UNSAFE, оскільки це питання стабільності та / або послідовного поведінки більше, ніж безпека та продуктивність. Наприклад, у складі UNSAFE можна мати статичну змінну, що записується. Зазвичай це не дуже добре, оскільки класи SQLCLR діляться на всіх сесіях. Якщо ви маєте намір поділитися даними в пам'яті на всіх сесіях і запланували умови перегонів (і зробили багато тестування), то вам слід добре, як ви очікуєте такої поведінки. Але якщо ви просто хотіли, щоб статична змінна, що записується, кешувала значення для певного сеансу, щоб не потрібно було шукати її знову або обчислювати її знову, і не знали, що інші сеанси читають це значення і, можливо, перезаписують його, ну, це було б проблемою.

Але якщо ви турбуєтесь про те, щоб хтось писав у Реєстр, але ще не маєте коду, який насправді пише в Реєстр, вам, мабуть, не потрібно про це турбуватися ;-).

Якщо ви хочете ознайомитись з тим, як EXTERNAL_ACCESS та UNSAFE працюють у практичному відношенні, і різницю між налаштуваннями TRUSTWORTHY ON(не бажаними) від використання асиметричного ключа, заснованого на сертифікаті ключа або сертифіката, перегляньте цю статтю: Сходи до рівня SQLCLR 4: Безпека (ЗОВНІШНІ та АНСАФЕ Асамблеї) (необхідна безкоштовна реєстрація).

Щодо "Виступу":

Це все питання того, що ви намагаєтеся зробити і як ви це робите. Є деякі речі, які набагато швидші в SQLCLR, і деякі речі, які повільніше. Але так само, як і з T-SQL, можна взяти дещо просту та / або ефективну задачу і зробити її складною та / або неефективною, якщо робити щось неправильно. Але використання SQL CLR не є за своєю суттю повільніше.


6

SQLCLR збірка може бути встановлена з трьома рівнями безпеки доступу: SAFE | EXTERNAL_ACCESS | UNSAFE. Це досить документовано, див. CREATE ASSEMBLYТа проектування зборів :

Управління безпекою збірки
Ви можете керувати тим, наскільки збірка може отримати доступ до ресурсів, захищених безпекою доступу до коду .NET Code, коли запускається керований код. Це ви робите, вказуючи один із трьох наборів дозволів під час створення або зміни збірки: SAFE, EXTERNAL_ACCESS або UNSAFE.

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

EXTERNAL_ACCESS
EXTERNAL_ACCESS дозволяє збіркам отримати доступ до певних зовнішніх системних ресурсів, таких як файли, мережі, веб-сервіси, змінні середовища та реєстр. Лише входи в систему SQL Server з EXTERNAL ACCESS дозволами можуть створювати збірки EXTERNAL_ACCESS. Блоки SAFE та EXTERNAL_ACCESS можуть містити лише код, який можна перевірити безпечно. Це означає, що до цих зборів можна отримати доступ лише до класів через чітко визначені вхідні точки, які дійсні для визначення типу. Тому вони не можуть довільно отримувати доступ до буферів пам'яті, що не належать коду. Крім того, вони не можуть виконувати операції, які можуть негативно вплинути на надійність процесу SQL Server.

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

Існують додаткові обмеження щодо дозволених атрибутів CLR і підтримується лише підмножина .Net Framework Assembly. Знову зверніться до зв'язаної документації.

Щодо продуктивності, найважливіша думка - пам’ятати, що SQL Server - це спільне багатозадачне середовище, тоді як CLR - ні. Код SQLCLR повинен викликати Thread.BeginThreadAffinity()будь-який час, коли він зачепить процесор будь-яку тривалість (включаючи блокування). Адам Мачаніч має чудову презентацію на цю тему, дивіться Дані, Швидше: Технології продуктивності Microsoft SQL Server із SQLCLR .

Тема обширна, а питання неясне. SQLCLR може виконувати деякі унікальні завдання, жодна інша функція не може відповідати. А SQLCLR - це ще одна зброя в арсеналі SQL Server, з якого ви можете стріляти собі в ногу, продуктивністю чи безпекою. Прочитайте документацію.


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