Optimálně napsaný globální DDL trigger může na úrovni přihlašování k SQL filtrovat vybrané aplikace, které se mohou k SQL připojit. Pokusy o přístup z jiných programů tento trigger odmítne. Filtr aplikací musí být napsán do podmínek triggeru, formou WHITELISTu (povolené programy).
Příklad použití přístupového DDL triggeru:
Následující SQL skript založí externí tabulku PokusOLogin, do které budou zapisovány neúspěšné pokusy o přístup z nepovolených aplikací.
Dále vytvoří globální trigger, který u všech uživatelů, kromě členů role sysadmin, povolí připojení k SQL pouze aplikacemi, jejichž jméno začíná textem Helios (tedy např. Helios Orange, Helios Orange Manažerské rozhraní apod.)
PS: Přesná jména aplikací připojených k SQL se dají zjistit například přes funkci Monitor v Heliosu nebo funkcí Activity monitor v Microsoft SQL Server Management Studiu .
- Kód: Vybrat vše
USE [master]
GO
CREATE TABLE master..PokusOLogin
(
ID INT IDENTITY PRIMARY KEY
, Datum datetime DEFAULT GETDATE()
, LoginName SYSNAME
, Program SYSNAME
, Pocitac SYSNAME
)
GO
CREATE TRIGGER [OnlyHeO]
ON ALL SERVER WITH EXECUTE AS 'sa'
FOR LOGON
AS
BEGIN
DECLARE @LoginName SYSNAME
DECLARE @Pocitac SYSNAME
DECLARE @data XML
SET @data = EVENTDATA()
DECLARE @AppName SYSNAME
SELECT @AppName = program_name, @Pocitac = host_name FROM sys.dm_exec_sessions WHERE session_id = @data.value('(/EVENT_INSTANCE/SPID)[1]', 'int')
IF @AppName NOT LIKE 'Helios%'
--Pokud spousteny program neni Helios
SET @LoginName = @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'SYSNAME')
IF @LoginName NOT IN (SELECT p.name FROM sys.server_principals p JOIN sys.syslogins s ON p.sid = s.sid WHERE s.sysadmin = 1
UNION ALL SELECT service_account FROM sys.dm_server_services)
--A pokud program nespousti administrator sql serveru, nebo sluzba sql serveru
BEGIN
ROLLBACK
--Ukonci session (pokus o prihlaseni)
INSERT INTO master..PokusOLogin (LoginName, Program, Pocitac)
SELECT @LoginName --@LoginName
, @AppName, @Pocitac
--A tento pokus zaloguj do tabulky
END
END
Zrušit DDL trigger a smazat logovací tabulku lze tímto skriptem:
- Kód: Vybrat vše
USE [master]
GO
--Smaz DDL trigger
DROP TRIGGER [OnlyHeO] ON ALL SERVER
GO
--Smaz logovaci tabulku
DROP TABLE [dbo].[PokusOLogin]
GO