Я создал представление в database1 на основе таблиц в database2. Я дал SELECT
разрешение пользователю, который имеет доступ только к базе данных1. Пользователь не может заставить это представление работать, потому что у него нет учетной записи в базе данных2. Как я могу решить эту проблему? Я не хочу создавать учетную запись в базе данных2.
10
TRUSTWORTHY ON
или входа приложения в систему какsa
. Владение БД цепочкой иTRUSTWORTHY
существует в основном благодаря тому, что является единственным решением на тот момент. Но теперь, даже если и не огромный риск, DB Chaining, безусловно, является ненужным риском, поскольку подписывание модулей не так сложно. И если кто-то полагается на цепочку БД, а затем использует динамический SQL, они с большей вероятностьюTRUSTWORTHY ON
решат это исправить, тогда как при подписании модуля это не сломалось бы.DB_CHAINING
это не более рискованно, чем цепочка владения внутри базы данных, когда объекты все равно должны были находиться в одной базе данных.DB_CHAINING
это довольно рискованно.Ответы:
Это легко сделать очень безопасным способом, используя подпись модулей. Это будет похоже на следующие два моих ответа, также здесь, на DBA.StackExchange, в которых приведены примеры того, как это сделать:
Безопасность хранимых процедур с помощью execute as, запросов к базе данных и подписи модуля
Разрешения в триггерах при использовании кросс-сертификатов базы данных
Разница для этого конкретного вопроса заключается в том, что он имеет дело с представлением, и представления не могут быть подписаны. Таким образом, вам нужно будет изменить представление в табличную функцию с множеством операторов (TVF), так как они могут быть подписаны и доступны так же, как представление (ну, для
SELECT
доступа).В следующем примере кода показано выполнение именно того, что запрашивается в вопросе, в том, что «Ограниченный пользователь» для входа / пользователя имеет доступ только к «DatabaseA» и все же может получать данные из «DatabaseB». Это работает только путем выбора из этого одного TVF , и только потому, что он подписан.
Для реализации этого типа доступа к нескольким базам данных при использовании представления и без предоставления Пользователю каких-либо дополнительных разрешений потребуется включение цепочки владения несколькими базами данных. Это гораздо менее безопасно, потому что он полностью открыт для всех объектов между обеими базами данных (он не может быть ограничен определенными объектами и / или пользователями). Подписание модуля позволяет только этому одному TVF иметь доступ между БД (у пользователя нет разрешения, у TVF есть), а у пользователей, которые не могут
SELECT
из TVF вообще не иметь доступа к базе данныхB.Все вышеперечисленные шаги воссоздают текущую ситуацию: пользователь имеет доступ к базе данных DatabaseA, имеет разрешение на взаимодействие с объектом в базе данных DatabaseA, но получает ошибку из-за того, что объект в базе данных DatabaseA получает доступ к чему-либо в базе данных DatabaseB, к которой у пользователя нет никакого доступа.
Шаги ниже настраивают пение модуля. Это делает следующее:
SELECT
разрешение на Таблицу в базе данныхB Пользователю на основе сертификатовНастройка подписи модуля:
Если доступ по какой-либо причине необходим через просмотр, тогда вы можете просто создать вид, который выбирается из TVF, показанного выше. И, в этой ситуации,
SELECT
доступ не должен быть предоставлен для TVF, только для просмотра, как показано ниже:А теперь, чтобы проверить это:
Для получения дополнительной информации о подписи модулей, пожалуйста, посетите: https://ModuleSigning.Info/
источник
ALTER CERTIFICATE ... DROP PRIVATE KEY
то закрытый ключ исчезнет, если вы сначала не скопировали его в файл с помощью BACKUP CERTIFICATE . Но открытый ключ все еще вsys.certificates
. И открытый ключ не нуждается в пароле. Только для использования закрытого ключа для подписи модуля требуется пароль (который одинаков для всех серверов, в отличие от защиты с помощью мастер-ключа).