Znajdź wszystkie adresy IP lub użytkowników, którzy uzyskują dostęp do określonego programu SQL Server


10

Powiedzmy, że znalazłem SQL Servera i nie mam pojęcia, które aplikacje się z nim łączą. Może znajduję jedną aplikację, ale nie jestem pewien, czy jest to jedyna z niej korzystająca.

Czy istnieje dobry sposób na znalezienie wszystkich wyraźnych połączeń?

Odpowiedzi:


14

Możesz sprawdzić aktualnie uruchomione procesy w SSMS w Activity Monitor.

Możesz go również uzyskać za pomocą sys.dm_exec_sessions, a także sys.dm_exec_connections i sys.dm_exec_requests .

Pytanie:

SELECT DB_NAME(database_id) as [DB]
    , login_name
    , nt_domain
    , nt_user_name
    , status
    , host_name
    , program_name
    , COUNT(*) AS [Connections]
FROM sys.dm_exec_sessions
WHERE database_id > 0 -- OR 4 for user DBs
GROUP BY database_id, login_name, status, host_name, program_name, nt_domain, nt_user_name;

Nazwa hosta, nazwa procesu lub nazwy użytkowników domeny często zawierają więcej informacji niż tylko adres IP. Pozostałe kolumny mogą być dodane, takie jak: login_time,last_successful_logon

IP oraz inne informacje mogą być pobierane z JOIN do sys.dm_exec_connections na session_id: client_net_address, local_net_address, connect_time, porty, ...

sys.dm_exec_requests może również zawierać przydatne informacje: commandtyp ,,sql_handle ...

To zapytanie jest tylko próbką. Musisz JOINpołączyć te 3 widoki razem i wyprowadzić / przechowywać odpowiednie informacje z jednego z nich.

Dane z tych widoków znikają po ponownym uruchomieniu programu SQL Server. Dlatego jeśli aplikacja nie jest regularnie podłączana, dobrym pomysłem może być ich regularne przechowywanie za pomocą zadania lub skryptu (Powershell).


3

Sugerowałbym również to, co zasugerował Julien, ale myślę, że zaplanowanie zapytania za pomocą SQL Server Agent byłoby lepszym pomysłem, a następnie za każdym razem, gdy się uruchamia, zrzucasz informacje do fizycznej tabeli. Dwa DMV są połączone sys.dm_exec_connectionsisys.dm_exec_sessions

Jak najpierw stwórz fizyczny stół

create table Session_Information 
( session_id int,
net_transport nvarchar(40),
host_name nvarchar(128),
program_name nvarchar(128),
nt_user_name nvarchar(128), 
connect_time datetime,
client_interface_name  nvarchar(128),
client_net_address varchar(48),
local_net_address varchar(48),
login_name nvarchar(128),
nt_domain nvarchar(128),
login_time datetime
);

Następnie wstaw rekordy do tej tabeli:

Insert into Session_Information
  SELECT 
      c.session_id, 
      c.net_transport, 
      s.host_name, 
      s.program_name, 
      s.nt_user_name,
      c.connect_time, 
      s.client_interface_name,
      c.client_net_address,
      c.local_net_address, 
      s.login_name, 
      s.nt_domain, 
      s.login_time 
  FROM sys.dm_exec_connections AS c
  JOIN sys.dm_exec_sessions AS s
    ON c.session_id = s.session_id;

Zaplanuj uruchamianie za pomocą SQL Server Agent co około 15 minut, a pod koniec dnia zobaczysz wszystko, co lubisz ze stołu session_information.


2

Włącz kontrolę logowania do SQL Server dla udanych i nieudanych prób logowania: https://docs.microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-management-studio

Zmiana zakresu kontroli wymagałaby ponownego uruchomienia usługi SQL. Po ponownym uruchomieniu usługi wszystkie udane logowania (użytkownika) i jej adres IP zaczną być rejestrowane w dziennikach programu SQL Server. Dane te mogą być gromadzone przez około tydzień lub 2, a następnie plik dziennika analizowany, aby wyświetlić listę wszystkich adresów IP (i użytkowników), którzy uzyskali dostęp do baz danych SQL Server w monitorowanym okresie.

Jeśli komponent SSRS jest również zainstalowany w tym samym pudełku, tabelę ExecutionLog bazy danych ReportServer można przeanalizować, aby wyświetlić listę wszystkich loginów, które uzyskują dostęp do portalu SSRS.


-2

Z Uzyskaj adres IP klienta w SQL Server przez Sarvesh Kumar Gupta :

CREATE FUNCTION [dbo].[GetCurrentIP] ()
RETURNS varchar(255)
AS
BEGIN
    DECLARE @IP_Address varchar(255);

   SELECT @IP_Address = client_net_address
    FROM sys.dm_exec_connections
    WHERE Session_id = @@SPID;

   Return @IP_Address;
END

Zwróci to adres_konfiguracyjny_klienta połączenia, które go uruchomiło. Może to być przydatne w niektórych przypadkach, ale nie jest to tutaj potrzebne, zwłaszcza, że ​​nieznana aplikacja nie wywoła tej funkcji.
Julien Vavasseur
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.