Подтвердить что ты не робот

Ограничить подключение SQL Server к определенному IP-адресу

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

4b9b3361

Ответ 1

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

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

Конечно, гораздо сложнее делать на уровне базы данных.

Ответ 2

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

Действия

  • Зафиксируйте неудачные попытки регистрации. В SSMS щелкните правой кнопкой мыши свой экземпляр (над вашими базами данных) Свойствa > Безопасность > Аудит входа. Убедитесь, что переключатель для [Failed logins only] || Выбраны оба неудачных и успешных входа.
  • Создайте таблицу для хранения запрещенных 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]
    
  • Создайте процесс автоматического добавления IP-адресов в брандмауэр. Лично я помещал этот код в работу агента каждые 10 минут. Также обратите внимание, что в этом процессе используется xp_cmdshell. Я, конечно, не хочу обсуждать преимущества включения или отключения этой функции. Каждому свое, но мой script не будет работать без этой функции. Если у вас его нет, здесь является хорошей ссылкой, чтобы помочь вам.

    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 [email protected]
                    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 '[email protected]+'" dir=in action=block enable="yes" remoteip='[email protected]+' protocol=any interfacetype=any'
                    EXEC master..xp_cmdshell @CmdExc
                DELETE @T3 WHERE [email protected]
            END
        END
        /* sp_cycle_errorlog archives the current error log. */
        EXEC sp_cycle_errorlog
        ExitWithoutCycle:
    

Я понимаю, что это не идеальное решение, потому что оно работает только с IP-адресами IP_V4 и только просматривает попытки входа в систему с помощью, вероятно, порта 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 '[email protected]+'" dir=in action=block enable="yes" remoteip='[email protected]
            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 '[email protected]+'"'
                EXEC master..xp_cmdshell @CmdExc
                DELETE TOP(1) FROM @T
            END

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

Ответ 3

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

Ответ 4

  • Внешний брандмауэр, например, Baracuda или F5 - лучший вариант, позволяющий уменьшить нагрузку на сервер Windows.
  • Параметры брандмауэра Windows. Если вы не можете сделать это выше, установите параметры входящего брандмауэра и откройте порт 1433, а на вкладке "Удаленный компьютер" введите IP-адрес источника.
  • В SQL Server Networking Level - Конфигурация сети SQL Server- > Дополнительно- > Принятые NTNM SPN добавят здесь имена доменов.
  • следуйте процедуре Мэтта Смита выше с триггером