Найти все IP-адреса или пользователей, которые имеют доступ к определенному серверу SQL

10

Допустим, я нашел SQL Server и понятия не имею, какие приложения к нему подключаются. Может быть, я найду одно приложение, но я не уверен, что оно единственное, которое его использует.

Есть ли хороший способ найти все отличные связи?

RayofCommand
источник

Ответы:

14

Вы можете посмотреть на текущие процессы в SSMS в Activity Monitor.

Вы также можете получить его, используя sys.dm_exec_sessions, а также sys.dm_exec_connections и sys.dm_exec_requests .

Запрос:

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;

Имя хоста, имя процесса или имя пользователя домена часто дают больше информации, чем просто IP-адрес. Другие столбцы могут быть добавлены , такие как: login_time,last_successful_logon

IP и другая информация может быть получена с JOIN в sys.dm_exec_connections на session_id: client_net_address, local_net_address, connect_time, порты, ...

sys.dm_exec_requests также может дать полезную информацию: commandtype ,,sql_handle ...

Этот запрос является просто примером. Вы должны JOINобъединить эти 3 вида и вывести / сохранить соответствующую информацию из любого из них.

Данные из этого представления исчезают при перезапуске SQL Server. Поэтому, если приложение не подключено регулярно, рекомендуется регулярно их хранить с помощью задания или сценария (Powershell).

Жюльен Вавассер
источник
3

Я также хотел бы предложить то, что предложил Жюльен, но я думаю, что планирование запроса с помощью агента SQL Server было бы лучшей идеей, и затем каждый раз, когда он запускается, вы сбрасываете информацию в физическую таблицу. Два DMV соединены sys.dm_exec_connectionsиsys.dm_exec_sessions

Как сначала создать физическую таблицу

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

Затем вставьте записи в эту таблицу:

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;

Запланируйте это для запуска через агент SQL Server каждые 15 минут или около того, и в конце дня вы сможете увидеть все, что вам нравится из таблицы session_information.

Shanky
источник
2

Включите аудит входа в SQL Server для успешного и неудачного входа: https://docs.microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-management-studio

Изменение области аудита потребует перезапуска службы SQL. После перезапуска службы все успешные входы в систему (пользователь) и его IP-адрес начнут регистрироваться в журналах SQL Server. Эти данные можно собирать в течение недели или 2, а затем анализировать файл журнала, чтобы перечислить все IP-адреса (и пользователя), которые обращались к базам данных SQL Server в течение отслеживаемого периода.

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

Масуд Хашим
источник
-2

С Получить IP Client Address в SQL Server по Sarvesh Кумар Гупта :

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
Г-н Хайдар Али Хан
источник
Это вернет client_net_address соединения, в котором он работает. Это может быть полезно в некоторых случаях, но это не то, что нужно здесь, тем более что неизвестное приложение не будет вызывать эту функцию.
Жюльен Вавассер