Ограничить соединение SQL Server с определенным IP-адресом - PullRequest
17 голосов
/ 20 августа 2011

Я хочу ограничить подключения к моему экземпляру SQL Server определенными IP-адресами.Я хочу запретить любые подключения с любых IP-адресов, кроме определенного списка.Это можно настроить в экземпляре или базе данных SQL Server?

Ответы [ 4 ]

22 голосов
/ 20 августа 2011

Похоже на то, что вы делаете, используя Брандмауэр Windows (вы можете заблокировать порты SQL Server и разрешить исключения для определенных IP-адресов).

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

19 голосов
/ 21 ноября 2013

Я написал эту функцию для автоматического запрета IP-адреса, который сделал более X ( @ FailedLoginAttempts ) попыток входа с того же IP-адреса.Он основан на журналах ошибок SQL Server.Я использую Windows Server 2008 и SQL Server 2008 R2.

Имейте в виду, что если вы не зацикливали свои журналы ошибок SQL Server какое-то время, вы можете получить очень много IP-адресов, и это может занятьнемного времени, чтобы все обработать.Когда я запускаю это каждые 10 минут, весь процесс занимает около 4-5 секунд.

Шаги

  1. Убедитесь, что вы регистрируете неудачные попытки.В SQL Server Management Studio (SSMS) щелкните правой кнопкой мыши свой экземпляр (над базами данных) Свойства Безопасность Аудит входа в систему .Убедитесь, что переключатель для [Только неудачные входы] ||Выбрано [И неудачные и успешные входы].
  2. Создание таблицы для хранения запрещенных IP-адресов

    /* Create table to store banned IP addresses */
    USE [YourDB]
    GO
    
    CREATE TABLE [dbo].[autobanned_ipaddesses](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [ipaddress] [varchar](50) NOT NULL,
        [attacked_on] [datetime2](2) NOT NULL,
        [banned_on] [datetime2](7) NOT NULL,
        [number_login_attempts] [int] NULL,
     CONSTRAINT [PK_autobanned_ipaddesses] PRIMARY KEY CLUSTERED
    ([id] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]) ON [PRIMARY]
    
    ALTER TABLE [dbo].[autobanned_ipaddesses] ADD  CONSTRAINT   [DF_autobanned_ipaddesses_banned_on]  DEFAULT (getdate()) FOR [banned_on]
    
  3. Создание процесса автоматического добавления IP-адресовк брандмауэру.Лично я поместил этот код в работу агента, выполняемую каждые 10 минут.Также обратите внимание, что этот процесс использует xp_cmdshell .Я, конечно, не хочу обсуждать преимущества включения или выключения этой функции.Каждому свое, но мой скрипт не будет работать без этой функциональности.Если у вас не включено, здесь - хорошая ссылка, чтобы помочь вам.

    USE [YourDB]
        DECLARE @T TABLE(LogDate datetime,ProcessInfo varchar(200),Text varchar(max))
        DECLARE @T2 TABLE(LogDate datetime,ProcessInfo varchar(200),IPAddress varchar(max))
        DECLARE @T3 TABLE(LogDate datetime,IPAddress varchar(max))
        DECLARE @IPAddress varchar(50),@LogDate datetime,@NumLoginAttempts int,@CmdExc varchar(300),@FailedLoginAttempts int=10
    
        BEGIN /* Get error log records with failed login attempt data */
            INSERT INTO @T
            EXEC sp_readerrorlog 0,1,'Could not find a login matching the name provided'
            INSERT INTO @T
            EXEC sp_readerrorlog 0,1,'An error occurred while evaluating the password'
        END
    
        BEGIN /* Get the IP address from T*/
            INSERT INTO @T2
            SELECT LogDate,ProcessInfo,REPLACE(REPLACE( SUBSTRING(Text, PATINDEX ('%[0-9].%[0-9].%[0-9].[0-9]%',Text)-2,50),']',''),':','') FROM @T
        END
    
        BEGIN /* Get the NEW ip addresses from T2*/
            INSERT INTO @T3
            SELECT CONVERT(varchar(10),LogDate,101) LogDate,IPAddress from @T2 T
            WHERE NOT EXISTS(SELECT * FROM autobanned_ipaddesses ai WHERE ai.ipaddress=T.IPAddress)
            GROUP BY CONVERT(varchar(10),LogDate,101),IPAddress
            HAVING  COUNT(LogDate)>@FailedLoginAttempts
            ORDER BY IPAddress
        END
    
        BEGIN /* Validate that T3 has records, if not skip the firewall add */
            IF (SELECT COUNT(*) FROM @T3)=0
            BEGIN
                GOTO ExitWithoutCycle
            END
        END
    
        BEGIN /* Loop through T3 and add each entry to the windows firewall */
            WHILE EXISTS(SELECT * FROM @T3)
            BEGIN
                SELECT TOP(1) @LogDate=LogDate, @IPAddress=IPAddress FROM @T3
                SELECT @NumLoginAttempts=COUNT(*) FROM @T2 WHERE IPAddress=@IPAddress
                    INSERT INTO autobanned_ipaddesses (attacked_on,ipaddress,number_login_attempts) VALUES(@LogDate,@IPAddress,@NumLoginAttempts)
                    SET @CmdExc = 'netsh advfirewall firewall add rule name="Autobanned IP - SQL Attacked '+@IPAddress+'" dir=in action=block enable="yes" remoteip='+@IPAddress+' protocol=any interfacetype=any'
                    EXEC master..xp_cmdshell @CmdExc
                DELETE @T3 WHERE IPAddress=@IPAddress
            END
        END
        /* sp_cycle_errorlog archives the current error log. */
        EXEC sp_cycle_errorlog
        ExitWithoutCycle:
    

Я понимаю, что это не идеальное решение, потому что оноработает только с IP-адресами IPv4 и просматривает только попытки входа в систему, возможно, через порт 1433, в зависимости от вашей конфигурации.Однако это помогло мне идентифицировать и заблокировать более 100 IP-адресов в неделю или около того (в основном, в Китае и Гонконге, но я блокировал Министерство внутренней безопасности ).

TANGENT - Как только я запустил это в течение недели или около того, я быстро понял, что в сетевых диапазонах IP-адресов было довольно много шаблонов.Я нашел этот инструмент , который был бы самым полезным, чтобы определить, кто и откуда эти хиты.Преимущество этого веб-сайта состоит в том, что, как только вы получите местоположение IP-адреса, внизу вы можете снова ввести IP-адрес и получить диапазон IP-адресов.Например (извините, Китай), я обнаружил, что 59.53.67.13 имел чистый диапазон 59.0.0.0 - 59.255.255.255.При этом я создал ручную функцию для блокировки всего диапазона сети и удаления любых правил брандмауэра Windows, которые уже содержали IP-адреса в этом диапазоне.

    USE [YourDB]

    DECLARE @CmdExc varchar(300)
    DECLARE @NetRange varchar(50)='59.0.0.0 - 59.255.255.255'

    DECLARE @NetRangeFrom varchar(20),@NetRangeTo varchar(20),@IPAddress varchar(20)
    DECLARE @IPPart2From int,@IPPart2To int
    DECLARE @IPPartSearch2From int,@IPPartSearch2To int

    DECLARE @T Table (ipaddress varchar(20))

    SET @NetRange=REPLACE(@NetRange,' ','')
    SELECT @NetRangeFrom=LTRIM(RTRIM(SUBSTRING(@NetRange,1,CHARINDEX('-',@NetRange)-1)))
    SELECT @NetRangeTO=LTRIM(RTRIM(SUBSTRING(@NetRange,CHARINDEX('-',@NetRange)+1,50)))
    SELECT @IPPartSearch2From=CAST(PARSENAME(@NetRangeFrom,3) as int)
    SELECT @IPPartSearch2To=CAST(PARSENAME(@NetRangeTo,3) as int)

    INSERT INTO @T
    select ai.ipaddress from autobanned_ipaddesses ai where LTRIM(ai.ipaddress) like SUBSTRING(@NetRangeFrom,1,CHARINDEX('.',@NetRangeFrom,1))+'%' AND PARSENAME(LTRIM(RTRIM(ai.ipaddress)),3) BETWEEN @IPPartSearch2From AND @IPPartSearch2To

    SET @CmdExc = 'netsh advfirewall firewall add rule name="AB SQL Attacked '+@NetRange+'" dir=in action=block enable="yes" remoteip='+@NetRange
    EXEC master..xp_cmdshell @CmdExc
    WHILE EXISTS(SELECT * from @T)
    BEGIN
        SELECT TOP(1) @IPAddress=ipaddress from @T
        SET @CmdExc = 'netsh advfirewall firewall delete rule name="Autobanned IP - SQL Attacked '+@IPAddress+'"'
        EXEC master..xp_cmdshell @CmdExc
        DELETE TOP(1) FROM @T
    END

Я с нетерпением жду комментариев, которые улучшат эту функциональность.

1 голос
/ 25 августа 2016
  1. Используйте внешний брандмауэр, такой как Baracuda или F5 - лучший вариант, чтобы уменьшить нагрузку на сервер Windows.
  2. Настройки брандмауэра Windows - если вы не можете выполнить вышеуказанное, настройте параметры входящего брандмауэра и откройте порт 1433 и на вкладке «Удаленный компьютер» введите IP-адрес источника.
  3. На сервере SQLСетевой уровень - Конфигурация сети SQL Server * → Дополнительно Допустимые имена SPN NTLM .Добавьте сюда доменные имена.
  4. Следуйте Процедура Мэтта Смита с триггером
1 голос
/ 20 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...