Цепочки владения

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

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

Как выполняется проверка разрешений в цепи

Когда доступ к объекту производится через цепь, SQL Server сначала сравнивает владельца объекта с владельцем вызывающего объекта. Это предшествующее звено в цепи. Если оба объекта имеют одного владельца, то разрешения для ссылаемого объекта не проверяются.

Пример цепочки владения

В следующей иллюстрации владелец представления July2003 — Мэри. Она предоставила Алексу разрешения для доступа к представлению. Он не имеет других разрешений для объектов базы данных в этом экземпляре. Что произойдет, если Алекс выберет представление?

Диаграмма цепочек владения

  1. Алекс выполняет инструкцию SELECT * в представлении July2003. SQL Server проверяет разрешения в представлении и подтверждает, что Алекс имеет разрешение выбирать.

  2. Представление July2003 требует данные из представления 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. Межбазовые цепочки владения по умолчанию отключены и они не должны активизироваться без специального запроса.

Потенциальные опасности

Цепочка владения очень полезна при управлении разрешениями в базе данных, но при ее использовании предполагается, что владельцы объектов предвидят все последствия каждого решения о предоставлении разрешений для защищаемого объекта. В предыдущем примере Мэри владеет большинством базовых объектов в представлении July 2003. Мэри имеет право сделать принадлежащие ей объекты доступными для любого другого пользователя, поэтому SQL Server ведет себя так, будто каждый раз, предоставляя доступ к первому представлению в цепочке, Мэри принимает сознательное решение о совместном доступе к представлениям и таблицам, на которые оно ссылается. На практике такое предположение не всегда верно. Производственные базы данных гораздо сложнее, чем база данных-образец, и разрешения, которые определяют доступ к ним, редко в точности соответствуют административным структурам организации.

Следует отдавать себе отчет, что члены ролей базы данных с большими правами доступа могут использовать межбазовые цепочки владения для доступа к объектам в базах данных, внешних по отношению к их собственной БД. Например, если включена межбазовая цепочки владения между базой данных A и базой данных B, то член предопределенной роли базы данных db_owner любой из этих баз данных может незаконно проникнуть в другую базу данных. Процедура проста: Диана (член предопределенной роли базы данных db_owner в базе данных A) создает пользователя Стюарт в базе данных A. Стюарт уже существует как пользователь в базе данных B. Затем Диана создает объект (владелец которого Стюарт) в базе данных A, который вызывает любой объект, принадлежащий пользователю Стюарт в базе данных B. Вызывающий и вызываемый объекты имеют общего владельца, поэтому разрешения для объекта в базе данных B не будут проверяться, когда Диана обратится к ним через созданный ею объект.

См. также

Основные понятия