2014-01-23 3 views
1

Мы настроили SQL Server и наше приложение таким образом, чтобы учетная запись SQL Server ... без каких-либо разрешений при доступе к базе данных с помощью любого инструмента, кроме нашего приложения. Это необходимо, потому что некоторые люди могут запустить доступ (или SQL Server Management Studio) и смогут манипулировать данными таким образом.sp_setapprole и создание пользователей/логинов

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

Теперь возникает проблема. В нашем приложении должно быть возможно создать дополнительные логины/пользователи или установить некоторых конкретных пользователей в качестве администраторов (только администраторы могут создавать связанные с пользователем материалы). Я не уверен на 100%, но в этом случае мне кажется, что пользователю нужна роль SecurityAdmin. Таким образом, у нас есть некоторый код в нашем приложении, которое выглядит следующим образом:

IF NOT EXISTS (SELECT name 
       FROM sys.server_principals 
       WHERE name = @LoginName) 
    BEGIN 
     SET @SQL = 'CREATE LOGIN [' + @LoginName + '] WITH PASSWORD = ''' 
      + @Password + ''', DEFAULT_DATABASE=[' + @DBNAME 
      + '], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'; 
     EXECUTE(@SQL); 
    END 

IF NOT EXISTS (SELECT name 
       FROM sys.database_principals 
       WHERE name = @LoginName) 
    BEGIN 
     SET @SQL = 'CREATE USER [' + @LoginName + '] FOR LOGIN [' 
      + @LoginName + ']'; 
     EXECUTE(@SQL); 
    END 

IF EXISTS (SELECT name 
      FROM sys.server_principals 
      WHERE name = @LoginName) 
    BEGIN 
     EXEC sp_addsrvrolemember @LoginName, 'securityadmin' 
    END 

Проблема заключается в том, конечно, что server_principals находится в основной базе данных, и нет никакого способа, я могу дать мой Application Роль этих разрешений. Есть ли способ обойти эту проблему или простой способ решить эту проблему?

ответ

0

Вы должны взглянуть на EXECUTE AS предложения в SQL Server:

EXECUTE AS Clause

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

+0

Само по себе это не объясняет как выполнить задачи OP: как предоставить некоторым пользователям приложения больше прав в базе данных, чем другие. – RBarryYoung

1

В SQL Server при активации роли приложения (AppRole) его контекст безопасности полностью вытесняет контекст безопасности пользователя. Хотя это может быть отменено в сеансе (соединение), два контекста безопасности (AppRole и User) не могут одновременно быть активными одновременно.

Таким образом, обычным способом использования этих двух способов является то, как вы это делали до сих пор (*): то есть используйте только пользователь/вход только для, чтобы включить право на подключение к базе данных изначально, затем переключитесь на AppRole, чтобы получить доступ к содержимому баз данных.

Однако, если вы хотите включить разные уровни разрешений/прав в базе данных, вы не сможете сделать это через пользователей/логинов (не только в любом случае). Существует несколько различных способов приблизиться к этому, но самый простой способ выполнить то, что вы хотите, вероятно, иметь разные AppRoles для разных классов пользователей приложений. Таким образом, у вас может быть роль ApplUser для большинства пользователей и роль ApplAdmin для пользователей, которые являются администраторами, и т. Д. Затем вы должны предоставить эти дополнительные AppRoles, расширенные разрешения и доступ в базе данных по мере необходимости.

(* И большие престижность для этого. Это очень хорошая схема безопасности для SQL Server, но лишь немногие разработчики приложений пройти через усилия, чтобы осуществить это.)

+0

Ну ... на самом деле моя проблема: мне нужен хороший пример того, как настроить это, я думаю. На данный момент я думаю, что могу настроить все с помощью роли приложения AppUser и предоставить этой роли все права на вставку/выбор/обновление/выполнение приложения. Но какие разрешения я должен предоставить AppAdmin, чтобы разрешить ему создавать ВХОДЫ и ПОЛЬЗОВАТЕЛИ на SQL Server и разрешать им устанавливать другие в качестве админов и изменять пароли других пользователей. Любые предложения по этому поводу, поскольку это связано с некоторыми материалами в базе данных Master, которая выходит за рамки моей роли приложения. Или я что-то пропустил – Stefaan

+0

С моей текущей настройкой я получаю: Msg 15151, уровень 16, состояние 1, строка 1 Невозможно изменить логин 'test.gebruiker', потому что он не существует или у вас нет разрешения , – Stefaan

+0

@Stefaan Да, другой «очевидный» способ - это внедренная приложением безопасность (в отличие от реализации DB): дайте AppRole весь необходимый/доступ администратора, затем определите/фильтруйте свою логику приложения, которая может делать то, что в базе данных, как как и в приложении. – RBarryYoung

Смежные вопросы