MS SQL - Logon triger - dziwne zachowanie ?

0

Witam,

Robiłem audyt jednej z baz i ustaliłem, że z bazą są połączenia (Select'y do tabel) z hosta którego nie znamy (powiedzmy którego nie powinno być po migracji do nowej firmy).

Jako, że administrator nie mógł dojść po nazwie co to za maszyna i gdzie się znajduje i co najważniejsze za co właściwie odpowiada postanowiliśmy zablokować dostęp tej maszyny po hostname (po loginie nie mogliśmy bo połączenie było za pomocą loginu używanego też poprawnie przez inne aplikacje).

Stworzyłem więc trigera:

CREATE TRIGGER [RestrictAccessPerApplication]
ON ALL SERVER
FOR LOGON
AS
BEGIN
	IF (HOST_NAME() = 'nieZnanyHost')
		BEGIN
			PRINT 'Connection attempt blocked for hostname nieZnanyHost'
			ROLLBACK;
		END
END
GO

Dziś sprawdzam log i widzę coś takiego:

2018-11-15 0521.540 spid76 Connection attempt blocked for hostname nieZnanyHost
2018-11-15 0521.540 spid76 Error: 3609, Severity: 16, State: 2.
2018-11-15 0521.540 spid76 The transaction ended in the trigger. The batch has been aborted.
2018-11-15 0521.540 Logon Error: 17892, Severity: 20, State: 1.
2018-11-15 0521.540 Logon Logon failed for login 'uzywanyLogin' due to trigger execution. [CLIENT: 66.77.88.99]

I teraz mój zonk - spodziewał bym się, że CLIENT to IP tej maszyny o hostname: "nieZnanyHost" ... ale okazuje się, że to IP prowadzi do naszego regularnego serwera o nazwie "ZnanySerwer".
I teraz o co chodzi ? CLIENT nie wskazuje tego zablokowanego hosta ? A jeżeli nie to czemu tu się pojawia ?

Pewnie o czymś nie wiem ... także jakby ktoś mógł mnie oświecić byłbym bardzo wdzięczny.

Pozdr.
BB

2

Za dokumentacją:

The client application provides the workstation name and can provide inaccurate data. Do not rely upon HOST_NAME as a security feature.

https://docs.microsoft.com/en-us/sql/t-sql/functions/host-name-transact-sql?view=sql-server-2017

więc raczej namierzałbym co konkretnie się łączy:

SELECT 
    conn.session_ID as SPID,
    conn.client_net_address as IPAddress,
    sess.host_name as MachineName,
    sess.program_name as ApplicationName,
    login_name as LoginName
FROM 
    sys.dm_exec_connections conn
    inner join sys.dm_exec_sessions sess on conn.session_ID=sess.session_ID
1
SELECT   sp.spid [SPID] ,
         GETDATE() [Time] ,
         sp.program_name [Program] ,
         DB_NAME(sp.dbid) AS [Database] ,
         ec.auth_scheme [Auth] ,
         sp.loginame AS [LoginName] ,
         sp.nt_domain [Domain] ,
         sp.nt_username [User] ,
         ec.connection_id [ConnectionId] ,
         sp.hostname [Hostname] ,
         ec.client_net_address [ClientIP] ,
         ec.client_tcp_port [ClientPort] ,
         ec.local_net_address [LocalIP] ,
         ec.local_tcp_port [LocalPort] ,
         sp.net_library [NetworkLibrary]
FROM     sys.sysprocesses sp
         INNER JOIN master.sys.dm_exec_connections ec ON sp.spid = ec.session_id
WHERE    SPID = @@SPID
GROUP BY sp.spid ,
         sp.program_name ,
         sp.dbid ,
         ec.auth_scheme ,
         sp.loginame ,
         sp.nt_domain ,
         sp.nt_username ,
         ec.connection_id ,
         sp.hostname ,
         ec.client_net_address ,
         sp.nt_domain ,
         sp.net_library ,
         ec.client_tcp_port ,
         ec.local_net_address ,
         ec.local_tcp_port;

Moze tak?

CREATE TRIGGER [RestrictAccessPerApplication]
ON ALL SERVER
FOR LOGON
AS
    BEGIN
        DECLARE @hostname VARCHAR(255);
        DECLARE @client_net_address VARCHAR(255);

        SELECT @hostname = sp.hostname ,
               @client_net_address = ec.client_net_address
        FROM   sys.sysprocesses sp
               INNER JOIN master.sys.dm_exec_connections ec ON sp.spid = ec.session_id
        WHERE  spid = @@SPID;

        IF ( @hostname = 'nieZnanyHost' )
            BEGIN
                PRINT 'Connection attempt blocked for ' + @hostname + ' [' + @client_net_address + ']';
                ROLLBACK;
            END;
    END;
GO
0

Hmm no tak - to może wiele wyjaśniać. Dzięki wielkie @Panczo .. jak zwykle odpowiedź w punkt. (Y)

Ps. I znów wychodzi, że dokumentacja rzecz święta ;)
Ps2. Dzięki @ipsd - Twój kod też wykorzystam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1