Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];

Вниз

Блокирование логина после троекратного неправильного ввода парол   Найти похожие ветки 

 
serg_newone   (2004-09-20 14:21) [0]

Доброго времени суток!
MSSQL2000, SQL Server Authentication. Нужно научиться какими-либо средствами блокировать (или по крайней мере отслеживать) логин при троекратном неправильном вводе пароля. Уважаемые посетители форума подскажите куда копать, как делать. Может быть написать обертку для длл-ки (если такова есть), к-рая проверяет соответствие логин/пароля или же как-нибудь надругаться над syslogins. Вообщем приветствуются любые идеи, а лучше всего штатные средства:). Да, способ идентификации изменить нельзя. Заранее спасибо.


 
panov ©   (2004-09-20 14:24) [1]

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


 
serg_newone   (2004-09-20 14:33) [2]

Для поддержания темы и из личного интереса спрошу, - а почему?
На самом же деле сие есть требование "заказчика", к-рое в любом случае необходимо делать.


 
serg_newone   (2004-09-20 15:14) [3]

Вопрос снят, решение найдено.


 
Ega23 ©   (2004-09-20 15:20) [4]

На уровне клиента это делается. Но ни в коем случае не на уровне сервера.


 
сергей1   (2004-09-20 15:57) [5]

ну почему только на клиенте, как раз, если безопасность является приоритетной вещью в разработке базы, ограничения на число попыток только на клиенте ничего полезного не даст. Что-бы реально оградить себя от таких проблем, надо отключать логин пользователя после ,например, 3 неудачных попыток. И подсчет таких попыток вести именно на сервере, т.е. клиент неудачно вводит пароль - увеличивем счетчик в какой-нибудь запрятанной таблице. Лимит превысили - вырубаем пользователя процедурой sp_revokedbaccess. А на клиенте такой подсчет вести бесполезно - мне ничто не помешает использовать на одну попытку меньше, затем перезагрузить программу - и у меня снова есть 3 попытки !


 
KSergey ©   (2004-09-20 16:06) [6]

> [5] сергей1   (20.09.04 15:57)
> И подсчет таких попыток вести именно на сервере, т.е. клиент
> неудачно вводит пароль - увеличивем счетчик в какой-нибудь
> запрятанной таблице

А просветите, как на стороне сервера отловить попытку логина?


 
Ega23 ©   (2004-09-20 16:06) [7]

сергей1   (20.09.04 15:57) [5]

Ну в случае таких параноидальных требований - это хорошее решение  :о)
Лично я, например, информацию о пользователях держу непосредственно в самой базе, а не на уровне средств сервера. Т.е. все потльзователи с точки зрения сервера входят в одну и ту же роль. А вот на клиенте - в зависимости от введённого логина-пароля клиент получает разрешённые ЛИЧНО ЕМУ операции.


 
Ega23 ©   (2004-09-20 16:10) [8]

А просветите, как на стороне сервера отловить попытку логина?

Дык, всё через ХП...
Типа:
Print "S_PasConnect - процедура соединения с БД"
go
if exists (select * from sysobjects where id = object_id(N"[S_PasConnect]") and OBJECTPROPERTY(id, N"IsProcedure") = 1)
drop procedure [S_PasConnect]
GO
--example  S_PasConnect @mode=0, @Login="00", @PCNAM="kedr106", @debug=1
--select * from worksts persons logins
CREATE PROCEDURE S_PasConnect
@mode int=-1, -- Input: 0 - Disconnect
             --        1 - DB connect
@Login varchar(32) = "",  -- users LOGIN
@Passwd varchar(32) = "" ,  -- users password
@PCNAM varchar(32) = "" ,
@modCod int=1, -- модуль, к которому коннект (по умолч. - БП)
@debug int=-1
AS
SET NOCOUNT ON
--internal vars
declare @PersId int,
        @PersId2 int,
        @PersNam varchar(64),
        @ProfCod smallint,
        @PersMsk smallint,
        @WCFGNAM varchar(64),
        @WCFGID smallint,
        @ProfNam varchar(64),
        @i int,
        @p int,
        @cnt int,
        @cod int,
        @usedisp int,
        @mess varchar(64),
        @worknam varchar(64),
        @WorkCod smallint ,
--         @PCNam varchar(32),-- = "?"
        @SysNam varchar(64),
        @SysVer varchar(64),
        @SysAddr varchar(255),
        @disabledopers  varchar(8000),
        @ss  varchar(8000),
        @sd  varchar(8000),
        @si  varchar(8),
        @dt datetime,
        @WORKIP varchar(16),
        @WSID int,
        @cardcod int,  
        @pincod int,
 @DISPIP varchar(32),
        @DISPPORT int,
        @info varchar(1024),
      @result int
-- Preset
set nocount on
set   @result=-1
set @mess ="Ошибка соединения"
set @disabledopers=""
set @DISPIP="" set @DISPPORT=4200

if @PCnam="" select @PCnam=convert(char(16), isnull(host_name(),"?")  )

if @mode < 0 Goto FIN

 set @mess ="Пользователь не зарегистрирован"
 select @PersId=L.PersId, @dt=L.Logdatout,
        @PersNam=P.PersNam1+" "+P.PersNam2+" "+P.PersNam3,
        @Profcod=pr.profcod,@Profnam=pr.profnam,
        @WCFGID=WC.WCFGID, @WCFGNAM =WCFGNAM
 from logins L , Persons P, Profs Pr,WorkCfgs WC
 where upper(L.Login)=upper(@Login)and upper(L.Passwd)=upper(@Passwd)
       and L.LogMsk>0  and l.modcod in (0,1) -- @@2002-25-01 @@2002-05-28
       and  L.LogDatOut>getdate()--13.09 recovered
       and Pr.Profcod=P.profcod and L.PersId=P.Persid
       and Pr.WCFGID=WC.WCFGID
       
 if @persid is null
 begin
  if @debug<>-1 select  PersId=@PersId
  GoTo Fin
 end

 if @WCFGID=0
 begin
  set @mess =@Profnam+ " не может быть пользователем системы."  
  GoTo Fin
 end

 set @mess ="Срок Вашей регистрации в системе истек."
 if @dt < getdate()
 begin
  if @debug<>-1 select  PersId=@PersId, dt=@dt
  GoTo Fin
 end

--....... Пользователь хороший !!
   select top 1 @sysnam=ObjNam,@sysAddr=ObjAddr,@sysver=sysver from ParamsGlb

   --== РЕГИСТРАЦИЯ РАБОЧЕЙ СТАНЦИИ
   --Check if the Workstation  registred --select * from s_softtbl select * from s_compstbl worksts
   set  @WORKCOD=null
   select @WORKCOD=WORKCOD from worksts
   where upper(ltrim(rtrim(PCNAM)))=upper(ltrim(rtrim(@PCNAM))) --and WORKCOD>0

    set @WSid=null set @WorkIp=""

    -- after @@24-12-2001
    select @WSid=s.UID, @WorkIp=c.CMIPAddr
    from s_compstbl C, s_softtbl s, s_softtypestbl t
    where   upper(ltrim(rtrim(c.CMNetName)))=upper(ltrim(rtrim(@PCNAM))) --and WORKCOD>0
            and s.SFCmpID=c.UID and t.uid=s.sftypeid
            and  (upper(ltrim(rtrim(t.StName))) in("PSOWS","SSAWS") )
            and  s.SFIsActive=1
    if  @WSid is null
    begin
     set @mess ="Рабочая станция "+@PCNAM+" не зарегистрирована."
      --FUCK !!!      GoTo Fin
    end
.......



 
KSergey ©   (2004-09-20 16:15) [9]

> [8] Ega23 ©   (20.09.04 16:10)

Я немного не понял: а как пользователь к серверу-то логинится? Или у всех логинов как таковые права на все отключены? Или как? Я что-то не смог понять... Здесь по сути (если я верно понял) лишь настройка собственной авторизации - и все.. Т.е. доступ средствами именно SQL-сервера фактически и не используется. Верно?


 
сергей1   (2004-09-20 16:21) [10]

2 Ksergey

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

2 ega23
в принципе для какого-нибудь банка не так-уж и пароноидально. А ты знаешь, что на MSSQL есть возможность использовать так называемые роли приложений, т.е. пользователь вошел в систему, под своей ролью, а приложение запускает ХП sp_setapprole, после чего все права пользователя аннулируются, и он получает только полномочия приложения. Это действует на всем протяжении подключения. Наверно, это удобней, но я никогда таким не пользовался, так как в паронаидольном банке не работаю :)


 
Ega23 ©   (2004-09-20 16:22) [11]

Здесь по сути (если я верно понял) лишь настройка собственной авторизации - и все.. Т.е. доступ средствами именно SQL-сервера фактически и не используется. Верно?

Угу. Так точно!


 
KSergey ©   (2004-09-20 16:40) [12]

>  [11] Ega23 ©   (20.09.04 16:22)
> Здесь по сути (если я верно понял) лишь настройка собственной
> авторизации - и все.. Т.е. доступ средствами именно SQL-сервера
> фактически и не используется. Верно?

А если я возьму EnterpriseManager? Да даже просто Excel?? Не, это странная защита на мой вкус. Тогда уж просто все на клиенте делать, а иначе не понятно зафиг вообще сервер тут припрягать.. Или я что-то не понял? Я не вижу как такая схема может мне помешать сделать выборку из какой-либо таблицы...

> [10] сергей1   (20.09.04 16:21)
> очень просто, например, приложение клиента получило отказ
> в доступе, ты высветил матерное окно, а одновременно update"нул
> таблицу на серваке, обновив счетчик напротив данного пользователя.

И что толку? Для этого я должен уже залогиниться к серверу!!! А потом аксес в зубы - и впред!

> Наверно, это удобней, но я никогда таким не пользовался,
> так как в паронаидольном банке не работаю :)

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


 
Mystic ©   (2004-09-20 16:42) [13]

Нужно научиться какими-либо средствами блокировать логин при троекратном неправильном вводе пароля.

Вот это по-нашему! Получил список всех пользователей и заблокировал систему :)


 
Ega23 ©   (2004-09-20 16:55) [14]

А если я возьму EnterpriseManager? Да даже просто Excel?? Не, это странная защита на мой вкус. Тогда уж просто все на клиенте делать, а иначе не понятно зафиг вообще сервер тут припрягать.. Или я что-то не понял? Я не вижу как такая схема может мне помешать сделать выборку из какой-либо таблицы...


На клиенте нет ЕМ. И Excel тоже нет. Если тебя интересует, зачем это так сделано, то милости прошу на egorov@dedal.dubna.ru - пообщаемся.


 
сергей1   (2004-09-20 16:57) [15]

2 ksergey
>И что толку? Для этого я должен уже залогиниться к серверу!!!

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


 
Ega23 ©   (2004-09-20 16:59) [16]

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

Так точно! У нас именно так и реализовано.


 
KSergey ©   (2004-09-20 17:01) [17]

> [14] Ega23 ©   (20.09.04 16:55)
> На клиенте нет ЕМ. И Excel тоже нет

Гы ;) Ну поставить ЕМ - это не долго ;) Не, можно конечно и на клиенте грамотно администрировать, но опять получаем, что защита-то не на SQL-сервере! Вот в чем штука.

> 3 неудачных попыток. И подсчет таких попыток вести именно
> на сервере, т.е. клиент неудачно вводит пароль - увеличиваем
> счетчик в какой-нибудь запрятанной таблице.

Выделенное я понял именно как обработку при логине... А все остальное - понятно что можно наворотить, но останется узкое место, и опять защита по сути не будет сосредоточена в одном месте... и даже на сервере...

> [13] Mystic ©   (20.09.04 16:42)

Хм, а я о том как-то и не подумал ;))


 
panov ©   (2004-09-20 17:03) [18]

>KSergey ©   (20.09.04 17:01) [17]
И не просто заблокировал систему, а заблокировал логин администратора (а пусть локти кусает), а сам в это время что-нибудь делаю...


 
KSergey ©   (2004-09-20 17:09) [19]

> [18] panov ©   (20.09.04 17:03)
> >KSergey ©   (20.09.04 17:01) [17]
> И не просто заблокировал систему, а заблокировал логин администратора
> (а пусть локти кусает), а сам в это время что-нибудь делаю...

Ну совсем так не получится, видимо (я пока не увидел здесь технических возможностей; в теории понятно).
Да, я имею в виду админа в понимании SQL-сервера, а не некоего прикладного, проходящего через эту защиту.


 
сергей1   (2004-09-20 17:53) [20]

> И не просто заблокировал систему, а заблокировал логин администратора

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


 
anb ©   (2004-09-20 18:58) [21]

serg_newone   - Как ты решил этот вопрос ? (Я знаю решение только для Oracle). Плз - напиши, а то мастера всякую ерунду предлагают.


 
сергей1   (2004-09-20 20:35) [22]

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

-Запускаем sql profiler
-выбираем new trace
-на вкладке general указываем Save to table, указываем желаемую таблицу для аудита (например, я указал таблицу myaudit
в базе master)
-переходим на вкладку events
-так как нас интересуют неудачные подключения, в поле selected event classes удаляем все события
-из вкладки available event classes выбираем узел security audit, а в нем отмечаем audit login failed
-добавляем его в правое поле
-жмем run

профайлер можно свернуть, но не закрывать, а то процесс уничтожиться

Теперь, в качестве эксперимента, из дельфи, в настройках строки подключения для connection, указываем левый логин и
пароль (я написал логин haker), тестим соединение, нас посылают в жопу.

идем в query analyzer, запускаем следующий скрипт:

use master
select LoginName from myaudit where LoginName is not null

в резалт сете видим слово haker (если несколько раз будем коннектиться, таких строк будет несколько)
(для интереса можно написать select *, там всякая доп. инфа)

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


 
сергей1   (2004-09-20 21:26) [23]

в смысле триггер конечно, какое расписание.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.035 c
6-1091863418
Ivolg
2004-08-07 11:23
2004.10.17
Про сокеты


14-1096542254
Rule
2004-09-30 15:04
2004.10.17
Тем кто висит в фидошных конфах ...


14-1096399489
Rzhevskiy
2004-09-28 23:24
2004.10.17
ADSL


14-1096051536
GanibalLector
2004-09-24 22:45
2004.10.17
Из космоса получен первый искусственный сигнал


1-1096821038
Kolan
2004-10-03 20:30
2004.10.17
Парсер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский