2014-12-16 17 views
6

Byłem zobowiązany do skonfigurowania serwera SQL, aby zezwalał tylko na jedną sesję na logowanie. Znalazłem kilka odnośników na temat tworzenia wyzwalaczy logowania, aby zapobiec logowaniu się z ustanowienia więcej niż jednej sesji, ale zastanawiam się, czy jest jakiś sposób zdefiniowania tego na niższym poziomie, tak aby ten limit sesji był domyślny, a raczej niż zdefiniowanie tego w innym logowaniu dla każdego użytkownika?ograniczyć wszystkich użytkowników do 1 sesji

Widzę wiele odniesień do tego tematu w obu "pytaniach, które mogą już mieć twoją odpowiedź" i "podobne pytania" tutaj na stackoverflow, ale do tej pory ani nie znalazłem, ani nie zrozumiałem postu opisującego to, co ja próbuję to zrobić. Widziałem również odniesienie do Declarative Management Framework, które pozwala skonfigurować SQL Server według zasad, które myślę.

Mam zamiar nadal przeglądać artykuły tutaj, aby spróbować się tego nauczyć, ale w międzyczasie ... porady bardzo doceniane!

+0

Być może lepiej jest zadać to pytanie na stronie [http://security.stackexchange.com/](http://security.stackexchange. com /) –

+0

Zakładam, że masz na myśli Microsoft SQL Server. – Gumbo

+0

Czy wszyscy Twoi użytkownicy mają ten sam login, czy są to indywidualne logowania, czy odziedziczone z grupy AD? –

Odpowiedz

1

Przykład dla logon trigger w Books Online jest bardzo zbliżony do tego, co myślę, że chcesz, wprowadziłem kilka zmian, aby działały dla wszystkich loginów.

-- Trigger must be created by a user with 'view server state' permission in order the trigger to have unrestricted access to sys.dm_exec_sessions. 
create trigger connection_limit_trigger on all server with execute as self for logon 
as 
begin 
    -- Check whether the caller is a SysAdmin. 
    -- Note: The trigger is executing under an elevated security context so we must switch to the caller's context to test their SysAdmin status. 
    declare @IsSysAdmin int 
    execute as caller 
    set @IsSysAdmin = isnull(is_srvrolemember ('sysadmin'), 0) 
    revert 

    -- If the user is not a SysAdmin and there are already too many non-dormant sessions for this login then 'rollback' the logon. 
    -- Note: sys.dm_exec_sessions does not include an entry for this logon attempt. 
    if ((@IsSysAdmin = 0) and ((select count(1) from sys.dm_exec_sessions where is_user_process = 1 and status <> 'Dormant' and original_login_name = original_login()) > 1)) 
    begin 
     raiserror('This login has exceeded the maximum of 1 connections to this SQL Server.', 16, 1) 
     rollback 
    end 
end 

Dodałem w czeku więc ograniczenie nie ma zastosowania do logowania sysadmin i nie liczy nieaktywnych połączeń puli połączeń. Kilka rzeczy do zapamiętania;

  • jeśli połączenie nie jest prawidłowo zamknięta może obijać się w sys.dm_exec_sessions na chwilę, w tym przypadku użytkownik nie będzie mógł ponownie połączyć aż umarli połączenie czyści się.
  • jeśli zepsujesz wyzwalacz logowania, możesz zablokować siebie (i wszystkich innych!) Z poziomu serwera SQL. Zobacz stronę logon trigger, aby uzyskać szczegółowe informacje, jak wrócić. :)
Powiązane problemy