Защита MS SQL Server от подбора пароля к sa

4 мин чтения · обновлено 27 сентября 2026

Если порт 1433 открыт в интернет, к MS SQL Server подбирают пароль круглосуточно, чаще всего к учётной записи sa. Защита MS SQL от подбора пароля начинается с настроек самого сервера, а заканчивается автоматической блокировкой IP, с которых идёт перебор. Разберём, где искать следы атаки, как найти IP атакующего и как блокировать его без ручной работы.

Базовая защита MS SQL Server

  • Не открывайте 1433 в интернет. Приложениям и администраторам обычно хватает доступа из локальной сети или через VPN. Если без внешнего доступа никак, разрешите в брандмауэре Windows подключения только с нужных адресов.
  • Отключите или переименуйте sa. Боты перебирают прежде всего именно её:
    -- если sa не используется
    ALTER LOGIN sa DISABLE;
    -- если используется, хотя бы переименуйте
    ALTER LOGIN sa WITH NAME = [adm_7f3k];
  • Используйте проверку подлинности Windows там, где это возможно. Если нужны SQL-логины, включите для них политику паролей Windows (CHECK_POLICY = ON).
  • Нестандартный порт уменьшает шум от массовых сканеров, но от целенаправленного перебора не защищает.

Подробные рекомендации есть в руководстве Microsoft по безопасности SQL Server. Дальше речь о том, что делать, если порт всё-таки открыт.

Ошибка 18456: где видны попытки подбора пароля

Каждый неудачный вход MS SQL Server записывает в журнал приложений Windows как событие 18456. Источник: MSSQLSERVER для экземпляра по умолчанию или MSSQL$ИМЯ для именованного. Текст выглядит так:

Login failed for user 'sa'. Reason: Password did not match that for the login provided. [CLIENT: 203.0.113.45]

IP атакующего стоит в квадратных скобках после CLIENT. Та же запись есть в журнале ошибок SQL Server (ERRORLOG).

События пишутся, только если включён аудит неудачных входов. По умолчанию он включён, проверить можно в SQL Server Management Studio: свойства сервера → «Безопасность» → «Аудит входа», значение «Только неудачные попытки входа» или «Успешные и неудачные попытки».

Не каждая ошибка 18456 означает перебор. Если логин и пароль верные, но нет доступа к указанной базе данных, в тексте будет «Failed to open the explicitly specified database». Такие события при подсчёте атак стоит исключать.

Как найти IP, с которых подбирают пароль к MS SQL

Быстрый отчёт за последние сутки, самые активные адреса сверху:

Get-WinEvent -FilterHashtable @{LogName='Application'; Id=18456; StartTime=(Get-Date).AddDays(-1)} |
  Where-Object { $_.ProviderName -like 'MSSQL*' -and $_.Message -notmatch 'Failed to open the (explicitly specified )?database' } |
  ForEach-Object { if ($_.Message -match '\[CLIENTE?\s?:\s?(\d{1,3}(?:\.\d{1,3}){3})\]') { $Matches[1] } } |
  Group-Object | Sort-Object Count -Descending | Select-Object Count, Name -First 20

Регулярное выражение учитывает и испанскую локализацию сервера, где вместо CLIENT пишется CLIENTE.

Автоматическая блокировка IP в брандмауэре Windows

Скрипт ниже раз в несколько минут находит адреса с 5 и больше неудачными входами за 2 часа и добавляет их в блокирующее правило для порта 1433. Сохраните его как C:\Scripts\block-mssql-bruteforce.ps1:

$Threshold = 5
$Since     = (Get-Date).AddHours(-2)
$RuleName  = 'Block MSSQL brute-force'
$Port      = 1433                  # порт вашего экземпляра
$Allow     = @('203.0.113.10')     # адреса, которые нельзя блокировать

$bad = Get-WinEvent -FilterHashtable @{LogName='Application'; Id=18456; StartTime=$Since} -ErrorAction SilentlyContinue |
  Where-Object { $_.ProviderName -like 'MSSQL*' -and $_.Message -notmatch 'Failed to open the (explicitly specified )?database' } |
  ForEach-Object { if ($_.Message -match '\[CLIENTE?\s?:\s?(\d{1,3}(?:\.\d{1,3}){3})\]') { $Matches[1] } } |
  Where-Object { $_ -notin $Allow } |
  Group-Object | Where-Object Count -ge $Threshold |
  Select-Object -ExpandProperty Name
if (-not $bad) { return }

$rule = Get-NetFirewallRule -DisplayName $RuleName -ErrorAction SilentlyContinue
if ($rule) {
  $old = @(($rule | Get-NetFirewallAddressFilter).RemoteAddress)
  Set-NetFirewallRule -DisplayName $RuleName -RemoteAddress @($old + $bad | Sort-Object -Unique)
} else {
  New-NetFirewallRule -DisplayName $RuleName -Direction Inbound -Action Block `
    -Protocol TCP -LocalPort $Port -RemoteAddress $bad | Out-Null
}

Запуск каждые 5 минут через планировщик задач:

schtasks /create /tn "Block MSSQL brute-force" /sc minute /mo 5 /ru SYSTEM /rl HIGHEST /tr "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\block-mssql-bruteforce.ps1"

У именованных экземпляров порт часто динамический. Посмотреть его можно в SQL Server Configuration Manager, в свойствах протокола TCP/IP. Для защиты от перебора лучше закрепить порт статически.

Что скрипт не решает

  • Баны не снимаются, список в правиле только растёт.
  • Закрыт только порт MS SQL. Тот же IP может перебирать RDP или почту на этом же сервере.
  • Каждый сервер защищается в одиночку: бот, забаненный на одном SQL Server, начинает заново на соседнем.

Защита MS SQL от подбора пароля в KIPBan

В KIPBan правило для MS SQL работает по той же логике: событие 18456 от источника MSSQL, IP из поля CLIENT, исключение ошибок «Failed to open the database». Дальше агент:

  • по умолчанию банит IP после 3 неудачных попыток подряд, если между ними прошло не больше 5 минут, и блокирует его на всех портах, а не только на 1433;
  • снимает бан по сроку: 3 дня, при повторе 30 дней, дальше навсегда;
  • сразу отправляет IP в общий бан-лист, и остальные ваши серверы блокируют его в течение 5 минут;
  • тем же агентом ловит перебор MySQL/MariaDB и PostgreSQL на Windows, а также RDP, почты и других служб, открытых на сервере.

Как защитить удалённый доступ на тех же серверах, читайте в статье о защите RDP от брутфорса.

Вопросы про защиту MS SQL

Что означает ошибка 18456 в MS SQL Server?

Это неудачный вход в SQL Server. Причина указана в тексте события: неверный пароль, несуществующий логин, отключённая учётная запись или нет доступа к базе. Если таких событий много и они идут с внешних адресов к логину sa, это подбор пароля.

Как узнать IP, с которого подбирают пароль к sa?

Откройте журнал приложений Windows и найдите события 18456 от источника MSSQLSERVER. IP атакующего указан в конце текста в квадратных скобках после слова CLIENT. Для сводки по всем адресам используйте команду PowerShell из статьи.

Нужно ли отключать учётную запись sa?

Да, если она не используется. Боты подбирают пароль прежде всего к sa, потому что это имя известно заранее. Переименованная и отключённая sa лишает перебор смысла, но блокировать атакующие IP всё равно стоит: они продолжают нагружать сервер и перебирать другие логины.