Published on

October 31, 2015

Внедрение белого списка для SQL-серверов внутри предприятия

В сегодняшней статье мы рассмотрим, как вы можете внедрить белый список для ваших SQL-серверов внутри предприятия для управления доступом и повышения безопасности. Белый список – это список одобренных сущностей, которым предоставляются особые привилегии, в данном случае, доступ к SQL-серверу.

Зачем вам нужен белый список для вашего SQL-сервера? Рассмотрим ситуацию, когда у вас есть политика компании, которая запрещает использование общего логина для подключения к SQL-серверу. Однако ваше приложение использует один SQL-логин, и каждый разработчик в компании знает пароль. Несмотря на наличие письменной политики, существует риск того, что один из разработчиков может подключиться к SQL-серверу для исправления ошибки или даже манипулирования данными, чтобы обойти логику приложения.

Для решения этой проблемы мы можем создать белый список, который определяет, какие логины разрешены для подключения к SQL-серверу с определенных IP-адресов. Таким образом, мы можем ограничить доступ только для авторизованных сущностей.

Давайте рассмотрим пример, как внедрить белый список для ваших SQL-серверов внутри предприятия:

USE master;
GO

IF OBJECT_ID('dbo.WhiteList') IS NOT NULL
    DROP TABLE dbo.WhiteList;
GO

CREATE TABLE dbo.WhiteList (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    LoginName VARCHAR(255),
    HostName VARCHAR(255),
    HostIpAddress VARCHAR(15)
);
GO

INSERT dbo.WhiteList(LoginName, HostName, HostIpAddress)
SELECT 'WebSiteLogin', 'webserver1', '192.168.100.55';
GO

CREATE TRIGGER WhiteListTrigger ON ALL SERVER FOR LOGON AS
BEGIN
    DECLARE @LoginName VARCHAR(255) = ORIGINAL_LOGIN(),
            @HostName VARCHAR(255) = HOST_NAME(),
            @HostIpAddress VARCHAR(15);

    SELECT @HostIpAddress = client_net_address
    FROM sys.dm_exec_connections
    WHERE session_id = @@SPID;

    IF (
        SELECT COUNT(*)
        FROM dbo.WhiteList
        WHERE (
            (LoginName = @LoginName)
            OR (LoginName = '*')
        )
        AND (
            (HostName = @HostName)
            OR (HostName = '*')
        )
        AND (
            (HostIpAddress = @HostIpAddress)
            OR (HostIpAddress = '*')
        )
    ) = 0
    ROLLBACK;
END;
GO

В приведенном выше коде мы сначала создаем таблицу с названием “WhiteList”, чтобы хранить одобренные логины, имена хостов и IP-адреса. Затем мы вставляем запись в таблицу, чтобы разрешить доступ для определенного логина с определенного хоста и IP-адреса.

Триггер на вход, “WhiteListTrigger”, сравнивает имя входа пользователя, имя хоста и IP-адрес с записями в таблице “WhiteList”. Если есть совпадение, доступ разрешен. В противном случае соединение прерывается с помощью отката.

Чтобы протестировать эту реализацию, вы можете попытаться войти, используя “WebSiteLogin” с IP-адресом, отличным от разрешенного (192.168.100.55). Вы сразу получите сообщение об ошибке входа, указывающее, что доступ запрещен.

Кроме того, код позволяет использовать символ астериска (*) для ввода шаблонов. Это означает, что любой логин с любого IP-адреса может подключиться, если указано имя хоста, или разрешено подключение с логином sa с любого хоста или IP-адреса.

В случае, если вы случайно заблокировали себя или всех пользователей SQL-сервера, есть быстрый способ восстановить доступ. Вы можете подключиться к SQL-серверу с помощью выделенного административного подключения, либо через Management Studio, либо через командную строку SQLCMD, используя логин с разрешением SysAdmin. После подключения вы можете отключить триггер входа, чтобы восстановить доступ.

Внедрение белого списка для SQL-серверов внутри предприятия с использованием триггера входа обеспечивает дополнительный уровень безопасности, контролируя доступ на основе одобренных логинов, имен хостов и IP-адресов. Это позволяет вам соблюдать политику безопасности вашей компании и снизить риск несанкционированного доступа.

Для получения дополнительной информации о триггерах входа вы можете обратиться к официальной документации.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.