Ограничение выполнения пользовательской функции CLR для sysadmin, а не dbowner

Я, вероятно, упускаю что-то очевидное или делаю это неправильно, но вот оно:

Я написал скалярную функцию CLR в SQL Server 2005. Она имеет один параметр (int) и возвращает varchar(2000). У меня возникли проблемы с выяснением того, как конкретно предоставить разрешения для роли sysadmin и ограничить выполнение любой другой роли, включая db_owner.

Я предполагаю, что предоставление и отзыв разрешений для функций CLR такое же, как и для любой другой UDF. Это чувствительная функция, поскольку она расшифровывает пароль, который хранится в таблице SecurityUser для приложения. Я не хочу, чтобы кто-либо мог запускать его, кроме членов роли системного администратора.

В базе данных я сначала попытался предоставить системному администратору из базы данных:

grant execute ON dbo.fCrossTabDx1 TO sysadmin

и конечно получил ошибку:

Msg 15151, уровень 16, состояние 1, строка 1
Не удается найти пользователя 'sysadmin', потому что он не существует или у вас нет разрешения.

Затем я попытался предоставить разрешение db_securityadmin, который является ролью в базе данных, и получил ошибку:

Msg 4617, уровень 16, состояние 1, строка 1
Невозможно предоставить, отклонить или отозвать разрешения для специальных ролей или от них.

Итак, был бы признателен, если бы кто-нибудь направил меня в правильном направлении, если это возможно.

  1. Могу ли я ограничить пользователя с разрешениями db_owner на выполнение функции, и
  2. Могу ли я разрешить функции только разрешение на выполнение роли системного администратора?

Спасибо.


person Dan G.    schedule 16.04.2012    source источник
comment
В сторону: Как правило, если вы можете расшифровать пароль, вы делаете что-то не так. Одностороннее шифрование или хеширование обычно используется для предотвращения восстановления паролей.   -  person HABO    schedule 16.04.2012


Ответы (1)


Вы не можете ограничить разрешения для защищаемого владельца. По определению члены db_owner владеют каждым защищаемым объектом в базе данных. Функция - это защищаемая база данных. Следовательно, вы не можете ограничить права доступа к функции для dbo или членов роли db_owner.

Ты делаешь это неправильно:

  • развертывание собственных функций шифрования / дешифрования. Используйте встроенные функции шифрования.
  • полагаться на разрешения для криптографической безопасности. Вам следует полагаться на знание пароля для дешифрования, т.е. данные могут быть расшифрованы теми, кто знает пароль.
  • Я почти уверен, что ваша функция CLR имеет встроенный пароль для дешифрования, т.е. вы встраиваете ключи дешифрования в код, большое-большое-нет-нет.

Прочтите и усвойте иерархию шифрования. Соблюдайте стандартные методы. Не изобретайте свои собственные.

person Remus Rusanu    schedule 16.04.2012
comment
Да, я вроде как подумал. Я применил ленивый подход и, полагаю, нужно будет сделать это правильно и явно предоставить разрешения. Спасибо. - person Dan G.; 16.04.2012
comment
Я знаю, что выставил здесь свое грязное белье. В то время решение не использовать безопасность sql и полагаться на уровень безопасности приложений казалось подходящим для требуемого уровня безопасности и полного отсутствия поддержки DBA на месте в очень удаленном месте. Но сейчас я не уверен, что это сэкономило нам работу, и мы, вероятно, должны вернуться к модели безопасности sql и просто полагаться на управление логинами и пользователями базы данных. Это позволит полностью избежать необходимости в шифровании / дешифровании приложений. Очки хорошо приняты, Ремус. - person Dan G.; 16.04.2012