Безопасный SQL Server, доступный толстым клиентом - PullRequest
1 голос
/ 28 июля 2010

Есть ли способ защитить базу данных сервера SQL, к которой обращается толстый клиент? Значение: приложение связывается напрямую с базой данных, поскольку оно размещает операторы SQL. Это означает, что строка подключения должна быть где-то на клиенте. Используя эту строку подключения (либо с аутентификацией сервера winauth, либо с sql-сервером), любой пользователь может получить доступ к БД с помощью некоторой студии управления или командной строки и поместить в БД другие операторы, чем позволил бы ему графический интерфейс. Что с этим делать? Я не могу поместить другой слой между клиентом и базой данных, так как эта архитектура исправлена.

Ответы [ 3 ]

2 голосов
/ 28 июля 2010

Во всех моделях безопасности, включая проверку подлинности Windows и SQL, права доступа предоставляются пользователю (удостоверение личности), а не приложению. следовательно, любое право доступа, необходимое приложению, должно быть предоставлено пользователю, выполняющему приложение. Когда используется проверка подлинности Windows, это означает, что один и тот же пользователь может использовать все привилегии, необходимые для самого приложения, из запроса SSMS. Это фундаментальное правило, которое должен понимать любой администратор. С точки зрения безопасности (имея в виду такие вещи, как соответствие CC и т. Д.), Это факт, и любая попытка обойти его обречена.

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

CREATE TRIGGER reject_SSMS
ON ALL SERVER WITH EXECUTE AS '...'
FOR LOGON
AS
BEGIN
IF (APP_NAME() = 'Microsoft SQL Server Management Studio' 
   OR APP_NAME() = 'Microsoft SQL Server Management Studio - Query')
   AND (ORIGINAL_LOGIN() NOT IN (...)
   OR HOST_NAME() NOT IN (...))
    ROLLBACK;
END;

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

1 голос
/ 28 июля 2010

В первую очередь уязвимость SQL Injection заключается в том, что злоумышленник может манипулировать запросами.Этот целевой протокол еще более уязвим.Но не только то, что это также явное нарушение CWE-602: принудительное применение защиты на стороне клиента и CWE-603: использование аутентификации на стороне клиента .

Чтобы обеспечить безопасность, вы должны сделать следующее:

У каждого пользователя также должна быть своя собственная заблокированная база данных.Так как они имеют только select / update / delete / insert и никаких других привилегий (, особенно не xp_cmdshell () !!!! ).Вы не можете позволить пользователям совместно использовать базу данных, или злоумышленник сможет просматривать информацию других пользователей.Злоумышленник всегда сможет получить имя пользователя / пароль для сервера sql и сможет напрямую подключиться к своему клиенту.Трудно представить эти отношения безопасными, почти во всех случаях это огромная уязвимость.

Во всей реальности это очень серьезный архитектурный недостаток, и вы должны создать серверный компонент, который создает запросы для клиента.Обычно это делается с помощью SOAP (wcf для платформ ms).

1 голос
/ 28 июля 2010

Это то, для чего нужны разрешения SQL Server.

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

Возможно, вы захотите взглянуть на роли приложений

http://msdn.microsoft.com/en-us/library/ms190998.aspx

http://www.sqlservercentral.com/articles/Security/sqlserversecurityprosandconsofapplicationroles/1116/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...