Чи існують якісь особливі ризики для безпеки або продуктивності використання CLR в SQL сервері?
Чи існують якісь особливі ризики для безпеки або продуктивності використання CLR в SQL сервері?
Відповіді:
Як зазначив Ремус, питання є надто загальним, щоб отримати відповідь, оскільки відповідь залежить від контексту, яку функціональність слід використовувати та як вона буде використовуватися.
Щодо "Безпеки":
Якщо ви запитуєте про що-небудь, що можна зробити на зборах, позначених знаком PERMISSION_SET = SAFE
, тоді я жодного разу не міг знайти. І SQLCLR є "безпечнішим", ніж використання xp_cmdshell
або чудові (це був сарказм) sp_OA*
програми (або навіть розширені збережені процедури, але, сподіваємось, ніхто більше не створює жодного з них).
Якщо ви хочете ознайомитись із тим, що означає "БЕЗКОШТОВНІ" на практиці, перегляньте цю статтю: Сходи до рівня SQLCLR 3: Безпека (Загальні та ЗБЕЗ) (потрібна безкоштовна реєстрація).
Якщо ви запитуєте про що-небудь, що можна зробити у складі, позначеному символом PERMISSION_SET = EXTERNAL_ACCESS
, то, звичайно, знову є ризики, залежно від того, яка функціональність використовується. Якщо ви пишете рутину для читання каталогів та імен файлів (тобто лише для читання), то це лише питання того, що слід бачити, а не бачити. Якщо ви пишете код, який дозволяє видалити файл, ризик збільшується. Але те, що можна зробити з цими зовнішніми ресурсами, контролюється:
Якщо ви запитуєте про що-небудь, що можна зробити в зборі, позначеному символом PERMISSION_SET = UNSAFE
, тобто досить відкритим. Багато функціональних можливостей вважається корисним лише для зборів UNSAFE, оскільки це питання стабільності та / або послідовного поведінки більше, ніж безпека та продуктивність. Наприклад, у складі UNSAFE можна мати статичну змінну, що записується. Зазвичай це не дуже добре, оскільки класи SQLCLR діляться на всіх сесіях. Якщо ви маєте намір поділитися даними в пам'яті на всіх сесіях і запланували умови перегонів (і зробили багато тестування), то вам слід добре, як ви очікуєте такої поведінки. Але якщо ви просто хотіли, щоб статична змінна, що записується, кешувала значення для певного сеансу, щоб не потрібно було шукати її знову або обчислювати її знову, і не знали, що інші сеанси читають це значення і, можливо, перезаписують його, ну, це було б проблемою.
Але якщо ви турбуєтесь про те, щоб хтось писав у Реєстр, але ще не маєте коду, який насправді пише в Реєстр, вам, мабуть, не потрібно про це турбуватися ;-).
Якщо ви хочете ознайомитись з тим, як EXTERNAL_ACCESS та UNSAFE працюють у практичному відношенні, і різницю між налаштуваннями TRUSTWORTHY ON
(не бажаними) від використання асиметричного ключа, заснованого на сертифікаті ключа або сертифіката, перегляньте цю статтю: Сходи до рівня SQLCLR 4: Безпека (ЗОВНІШНІ та АНСАФЕ Асамблеї) (необхідна безкоштовна реєстрація).
Щодо "Виступу":
Це все питання того, що ви намагаєтеся зробити і як ви це робите. Є деякі речі, які набагато швидші в SQLCLR, і деякі речі, які повільніше. Але так само, як і з T-SQL, можна взяти дещо просту та / або ефективну задачу і зробити її складною та / або неефективною, якщо робити щось неправильно. Але використання SQL CLR не є за своєю суттю повільніше.
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, з якого ви можете стріляти собі в ногу, продуктивністю чи безпекою. Прочитайте документацію.