Ланцюжки володіння, Microsoft Docs

Якщо кілька об'єктів бази даних послідовно звертаються один до одного, то така послідовність відома як ланцюжок. Такі ланцюжки не можуть існувати незалежно, але коли SQL Server 2005 проходить по ланках ланцюга, SQL Server перевіряє дозволи складових об'єктів інакше, ніж при роздільному доступі до об'єктів. Ці відмінності мають важливі наслідки для забезпечення безпеки.

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

Як виконується перевірка дозволів у ланцюзі

Коли доступ до об'єкта здійснюється через ланцюг, SQL Server спочатку порівнює власника об'єкта з власником об'єкта, що викликає. Це попередня ланка у ланцюзі. Якщо обидва об'єкти мають одного власника, то дозволи для об'єкта, що посилається, не перевіряються.

Приклад ланцюжка володіння

У наступній ілюстрації власник поданняJuly2003 - Мері. Вона надала Алексу дозволи на доступ до подання. Він не має інших дозволів для об'єктів бази даних у цьому екземплярі. Що станеться, якщо Алекс вибере уявлення?

docs

  1. Алекс виконує інструкцію SELECT * у поданніJuly2003. SQL Server перевіряє дозволи у поданні та підтверджує, що Алекс має дозвіл вибирати.
  2. ПоданняJuly 2003 вимагає дані з поданняSalesXZ. SQL Server перевіряє володінняSalesXZ. Власник цього подання (Мері ) такий же, як у зухвалого подання, тому дозволу дляSalesXZ неперевіряються. Повертаються необхідні дані.
  3. ПоданняSalesXZ вимагає дані з поданняInvoicesXZ. SQL Server перевіряє володіння уявленняSalesXZ. Власник цього подання такий самий, як у попереднього об'єкта, тому дозволи дляInvoicesXZ не перевіряються. Повертаються необхідні дані. До цього етапу всі елементи послідовності мали одного власника (Мері ). Це відомо як нерозривний ланцюжок володіння.
  4. ПоданняInvoicesXZ вимагає дані з поданняAcctAgeXZ. SQL Server перевіряє володіння уявленняAcctAgeXZ. Власник цього подання інший, ніж у попереднього об'єкта (Сем, а неМері ), тому повинні бути отримані повні відомості про дозволи в цьому поданні. Якщо поданняAcctAgeXZ має дозволи, які забезпечують доступ з боку користувачаАлекс, то відомості будуть повернуті.
  5. ПоданняAcctAgeXZ вимагає дані з поданняExpenseXZ. SQL Server перевіряє володіння таблиціExpenseXZ. Власник цієї таблиці інший, ніж у попереднього об'єкта (Джо, а неСем ), тому мають бути отримані повні відомості про дозволи в цій таблиці. Якщо таблицяExpenseXZ має дозволи, які забезпечують доступ з боку користувачаАлекс, відомості повертаються.
  6. Якщо поданняJuly2003 намагається отримати дані з таблиціProjectionsXZ, то сервер спочатку перевіряє наявність ланцюжкових зв'язків між базами данихDatabase 1 таDatabase 2. Якщо ланцюжкові зв'язки між базами даних активні, сервер перевіряє володіння для таблиціProjectionsXZ. Власник цієї таблиці такий самий, як у зухвалого подання(Мері ), тому дозволи для цієї таблиці не перевіряються. Повертаються необхідні дані.

Міжбазові ланцюжки володіння

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

Потенційна небезпека

Ланцюжок володіння дуже корисний при керуванні дозволами в базі даних, але при його використанні передбачається, що власники об'єктів передбачають усі наслідки кожного рішення про надання дозволів для об'єкта, що захищається. У попередньому прикладі Мері володіє більшістю базових об'єктів у поданніJuly2003. Мері має право зробити об'єкти, які їй належать, доступними для будь-якого іншого користувача, тому SQL Server поводиться так, ніби щоразу, надаючи доступ до першого подання в ланцюжку, Мері приймає свідоме рішення про спільний доступ до уявлень і таблиць, на які воно посилається. Насправді таке припущення який завжди правильне. Виробничі бази даних набагато складніші, ніж база даних-зразок, та дозволи, які визначають доступ до них, рідко точно відповідають адміністративним структурам організації.

Слід усвідомлювати, що члени ролей бази даних з великими правами доступу можуть використовувати міжбазові ланцюжки володіння доступу до об'єктів у базах даних, зовнішніх стосовно їх власної БД. Наприклад, якщо включений міжбазовий ланцюжок володіння між базою данихA і базою данихB, то член фіксованої ролі бази данихdb_owner будь-який з цих баз даних може незаконно проникнути в іншу базуданих. Процедура проста: Діана (член фіксованої ролі бази данихdb_owner у базі данихA ) створює користувачаСтюарт у базі данихA.Стюарт вже існує як користувач у базі данихB. Потім Діана створює об'єкт (власник якогоСтюарт ) у базі данихA, який викликає будь-який об'єкт, що належить користувачевіСтюарт у базі данихB. Об'єкти, що викликають і викликаються, мають спільного власника, тому дозволи для об'єкта в базі данихB не перевірятимуться, коли Діана звернеться до них через створений нею об'єкт.