[tip] Omezení přístupu do SQL pro vybrané aplikace

PříspěvekNapsal: 28.06.2016 14:22
od jan.havranek
Kromě známé metody přístupu do databáze přes tzv. Aplikační roli je možné pro omezení přístupu do SQL využít tzv. DDL triggery.

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