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ń?

RayofCommand
źródło

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).

Julien Vavasseur
źródło
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.

Shanky
źródło
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.

Masood Hashim
źródło
-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
Md Haidar Ali Khan
źródło
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