Rechercher toutes les adresses IP ou les utilisateurs qui accèdent à un serveur SQL spécifique

10

Disons que j'ai trouvé un serveur SQL et je n'ai aucune idée des applications qui s'y connectent. Peut-être que je trouve une application mais je ne sais pas si c'est la seule à l'utiliser.

Existe-t-il un bon moyen de trouver toutes les connexions distinctes?

RayofCommand
la source

Réponses:

14

Vous pouvez consulter les processus en cours d'exécution dans SSMS dans Activity Monitor.

Vous pouvez également l'obtenir en utilisant sys.dm_exec_sessions ainsi que sys.dm_exec_connections et sys.dm_exec_requests .

Requete:

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;

Le nom d'hôte, le nom de processus ou les noms d'utilisateur de domaine donnent souvent plus d'informations qu'une simple adresse IP. D' autres colonnes peuvent être ajoutées telles que: login_time,last_successful_logon

IP et d' autres informations peuvent être récupérées avec un JOIN pour sys.dm_exec_connections sur session_id: client_net_address, local_net_address, connect_time, ports, ...

sys.dm_exec_requests peut également fournir des informations utiles: commandtype ,,sql_handle ...

Cette requête n'est qu'un exemple. Vous devez JOINces 3 vues ensemble et produire / stocker les informations pertinentes de l'une ou l'autre.

Les données de ces vues disparaissent lorsque SQL Server est redémarré. Par conséquent, si l'application n'est pas régulièrement connectée, il peut être judicieux de les stocker régulièrement à l'aide d'un travail ou d'un script (Powershell).

Julien Vavasseur
la source
3

Je suggérerais également ce que Julien a suggéré, mais je suppose que la planification de la requête via SQL Server Agent serait une meilleure idée, puis chaque fois qu'il s'exécute, vous videz les informations dans une table physique. Deux DMV sont joints sys.dm_exec_connectionsetsys.dm_exec_sessions

Comme d'abord créer une table physique

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

Insérez ensuite des enregistrements dans ce tableau:

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;

Planifiez cela pour qu'il s'exécute via l'Agent SQL Server toutes les 15 minutes environ et à la fin de la journée, vous pouvez voir tout ce que vous aimez dans le tableau session_information.

Shanky
la source
2

Activez l'audit de connexion SQL Server pour les connexions réussies et ayant échoué: https://docs.microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-management-studio

La modification de l'étendue de l'audit nécessiterait un redémarrage du service SQL. Une fois le service redémarré, toutes les connexions réussies (utilisateur) et son adresse IP commenceront à être enregistrés dans les journaux SQL Server. Ces données peuvent être collectées pendant environ une semaine ou 2, puis le fichier journal être analysé pour répertorier toutes les adresses IP (et l'utilisateur) qui ont accédé aux bases de données SQL Server pendant la période surveillée.

Si le composant SSRS est également installé sur la même boîte, la table ExecutionLog de la base de données ReportServer peut être analysée pour répertorier toutes les connexions qui accèdent au portail SSRS.

Masood Hashim
la source
-2

Depuis Get Client IP Address in SQL Server par 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
la source
Cela renverra l'adresse client_net_address de la connexion qui l'exécute. Cela peut être utile dans certains cas, mais ce n'est pas ce qui est nécessaire ici, d'autant plus que l'application inconnue n'appellera pas cette fonction.
Julien Vavasseur