Это практическое руководство предоставляет DevOps инженерам и системным администраторам готовые инструменты для системного повышения безопасности серверов под управлением Linux и Windows Server. Вы получите пошаговый чек-лист базового харденинга, проверенные скрипты для автоматизации рутинных проверок, детальные инструкции по настройке SSH, RDP и брандмауэров, а также методики централизованного сбора логов и внедрения систем обнаружения вторжений. Все инструкции проверены на практике и актуальны для 2026 года, что позволяет немедленно применять их в рабочей среде, экономя время и снижая риски.
Быстрый доступ к готовым решениям:
- Готовые скрипты для автоматизации аудита (Bash и PowerShell)
- Настройка SSH за 5 минут (базовый и строгий уровень)
- Правила брандмауэра для Windows Server 2026 (PowerShell команды)
- Аудит пользователей и привилегий (скрипты для Linux и Windows)
- Базовые правила iptables/firewalld
Безопасность сервера строится на последовательных действиях: от установки последних обновлений и удаления неиспользуемых служб до настройки минимальных необходимых политик доступа. В этом руководстве мы разберем каждый этап, предоставив конкретные команды для Linux (apt, yum) и Windows Server 2026, сравним инструменты вроде iptables и firewalld, а также покажем, как автоматизировать аудит пользователей и привилегий с помощью bash и PowerShell скриптов. Это системный подход, который превращает разрозненные рекомендации в единый рабочий процесс.
Базовый харденинг серверов: фундамент безопасности в 2026
Начальная настройка безопасности определяет устойчивость всей системы к угрозам. Этот процесс включает обновление ПО, отключение лишних служб и установку базовых политик доступа. Последовательное выполнение чек-листа минимизирует риск упустить критический этап.
Чек-лист базовой безопасности: от первого включения до рабочего состояния
Выполните эти действия в указанном порядке после развертывания нового сервера или перед аудитом существующего.
1. Обновление системных пакетов и ядра
Установите последние стабильные обновления безопасности. Для систем на базе Debian/Ubuntu:
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -yДля RHEL/CentOS/Rocky Linux с менеджером пакетов dnf:
sudo dnf update -y
sudo dnf autoremove -yДля Windows Server 2026 откройте PowerShell с правами администратора и выполните:
Install-Module -Name PSWindowsUpdate -Force
Get-WindowsUpdate -Install -AcceptAll -AutoReboot2. Анализ и отключение неиспользуемых служб
Лишние службы увеличивают поверхность атаки. Используйте этот bash-скрипт для анализа запущенных служб в Linux:
#!/bin/bash
echo "Службы в состоянии 'active (running)'"
systemctl list-units --type=service --state=running --no-pager --no-legend | awk '{print $1}'
echo ""
echo "Рекомендуется отключить (пример):"
echo "bluetooth.service cups.service avahi-daemon.service"Для отключения и запрета автозапуска службы, например, bluetooth:
sudo systemctl stop bluetooth.service
sudo systemctl disable bluetooth.service
sudo systemctl mask bluetooth.serviceВ Windows Server используйте PowerShell для получения списка служб с типом запуска «Автоматически»:
Get-Service | Where-Object {$_.StartType -eq 'Automatic' -and $_.Status -eq 'Running'} | Select-Object Name, DisplayNameИзмените тип запуска на «Вручную» для необязательных служб, например, «Fax»:
Set-Service -Name Fax -StartupType Manual3. Настройка базовых политик паролей и блокировки учетных записей
В Linux отредактируйте файл /etc/security/pwquality.conf или используйте pam_pwquality. Минимальная настройка:
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
minclass = 3Установите политику блокировки после 5 неудачных попыток в /etc/security/faillock.conf:
deny = 5
unlock_time = 900В Windows Server 2026 настройте политики через «Локальную политику безопасности» (secpol.msc) или PowerShell:
# Установка минимальной длины пароля в 12 символов
net accounts /minpwlen:12
# Блокировка учетной записи после 5 неудачных попыток на 15 минут
net accounts /lockoutthreshold:5 /lockoutduration:15 /lockoutwindow:15Более глубокие настройки, включая интеграцию с LDAP для централизованного управления пользователями, рассмотрены в практическом руководстве по системному администрированию Linux.
Актуальность в 2026: что изменилось и на что обратить внимание
Подходы к безопасности эволюционируют. В 2026 году актуальны эти изменения:
- Windows Server 2026 по умолчанию включает более строгие настройки Windows Defender Firewall с Advanced Security и усиливает требования к Network Level Authentication для RDP. Групповые политики безопасности получили новые шаблоны, упрощающие соответствие стандартам CIS Benchmarks.
- Дистрибутивы Linux продолжают переход с iptables на nftables как базового бэкенда, но firewalld (который может использовать и iptables, и nftables) остается стандартным инструментом управления для RHEL, Rocky Linux и Fedora. В Ubuntu по умолчанию используется ufw, базирующийся на iptables.
- Устаревшие практики, от которых следует отказаться:
- Использование протокола SSH версии 1.
- Разрешение аутентификации по паролю для root по SSH.
- Использование слабых алгоритмов шифрования в SSH, таких как CBC-mode или устаревшие хэши (MD5, SHA-1). Современный
sshd_configдолжен включатьCiphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com. - Хранение паролей в открытом виде или с использованием устаревших хэш-функций. В Linux используйте yescrypt или sha512, в Windows - обязательное использование NTLMv2 и отключение LM-хэшей.
Контроль доступа: тонкая настройка SSH, RDP и политик
SSH и RDP - основные векторы удаленного управления, требующие особого внимания. Их некорректная настройка открывает прямой путь для компрометации.
SSH: от запрета root-логина до двухфакторной аутентификации
Отредактируйте основной файл конфигурации SSH-сервера: /etc/ssh/sshd_config. После любых изменений перезагрузите службу: sudo systemctl reload sshd.
Базовый уровень безопасности (минимум для любого сервера):
Port 22 # Рассмотрите смену порта (например, 2222) для снижения шума от автоматических сканеров.
PermitRootLogin no # Ключевая настройка. Запрещает прямой вход под root.
PubkeyAuthentication yes # Включает аутентификацию по ключам.
PasswordAuthentication no # Отключает аутентификацию по паролю. Убедитесь, что ключи добавлены, прежде чем применять!
PermitEmptyPasswords no
Protocol 2 # Используйте только протокол 2.
X11Forwarding no # Отключите, если не используете.
MaxAuthTries 3 # Ограничьте количество попыток аутентификации.
ClientAliveInterval 300
ClientAliveCountMax 2Строгий уровень (для серверов с повышенными требованиями):
# Все настройки базового уровня +
AllowUsers user1 user2@192.168.1.0/24 # Разрешает подключение только указанным пользователям, возможно, с определенных IP.
DenyUsers baduser
LoginGraceTime 1m
UseDNS no # Ускоряет подключение и избегает проблем с резолвингом.
# Ограничение используемых шифров и MAC:
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.comНастройка двухфакторной аутентификации (2FA) с Google Authenticator (PAM):
Установите библиотеку для Linux (на примере Ubuntu/Debian):
sudo apt install libpam-google-authenticator -yЗапустите утилиту для каждого пользователя, который будет использовать 2FA:
google-authenticatorОтветьте «y» на вопросы о создании токена, обновлении файла ~/.google_authenticator и разрешении нескольких попыток. Отредактируйте файл /etc/pam.d/sshd, добавив строку:
auth required pam_google_authenticator.soВ /etc/ssh/sshd_config убедитесь, что установлено:
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactiveRDP в Windows Server 2026: безопасность без компромиссов для удобства
Безопасная настройка RDP требует комбинации политик и сетевых ограничений.
1. Включение Network Level Authentication (NLA)
NLA требует аутентификации до установки RDP-сессии, что защищает от некоторых типов атак. Включите через PowerShell:
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name "UserAuthentication" -Value 1Или через графический интерфейс: «Свойства системы» -> «Удаленный доступ» -> выбрать «Разрешить удаленные подключения к этому компьютеру» и отметить «Разрешать подключения только с компьютеров, на которых работает удаленный рабочий стол с проверкой подлинности на уровне сети».
2. Ограничение доступа через Windows Defender Firewall
Создайте правило, разрешающее RDP-трафик только с доверенных подсетей. Через PowerShell:
New-NetFirewallRule -DisplayName "RDP Restricted" -Direction Inbound -LocalPort 3389 -Protocol TCP -Action Allow -RemoteAddress 192.168.1.0/24,10.0.0.0/83. Использование Remote Desktop Gateway (RD Gateway)
RD Gateway позволяет туннелировать RDP-соединения через HTTPS (порт 443), что упрощает безопасный доступ извне без прямого открытия порта 3389 в интернет. Развертывание RD Gateway - отдельная роль в «Диспетчере серверов».
4. Настройка через групповые политики (GPO)
Для доменных сред используйте GPO. Ключевые параметры находятся в: Computer Configuration -> Policies -> Administrative Templates -> Windows Components -> Remote Desktop Services -> Remote Desktop Session Host -> Security. Установите «Требовать использование определенных настроек безопасности для удаленного рабочего стола (RDP)» в состояние «Включено» и выберите «SSL (TLS 1.2)».
Аудит пользователей и привилегий: кто что может делать?
Неконтролируемый рост числа учетных записей и размытие привилегий - типичные уязвимости. Регулярный аудит позволяет выявить неактивных пользователей, избыточные права и аномалии.
Linux: от `getent` до скриптов автоматического аудита
Базовые команды для ручной проверки:
- Список всех пользователей:
getent passwdилиcat /etc/passwd. - Список всех групп:
getent group. - Пользователи, которые могут выполнять команды от root:
getent group sudoилиgetent group wheel(в зависимости от дистрибутива).
Bash-скрипт для расширенного аудита пользователей и привилегий:
#!/bin/bash
echo "=== Аудит пользователей и привилегий ==="
echo ""
echo "1. Пользователи с оболочкой (возможность входа):"
getent passwd | awk -F: '{ if ($7 != "/usr/sbin/nologin" && $7 != "/bin/false") print $1,"->",$7 }'
echo ""
echo "2. Пользователи в группе sudo/wheel:"
for group in sudo wheel; do
if getent group $group &>/dev/null; then
echo "Группа $group:"
getent group $group | cut -d: -f4 | tr ',' '\n' | sort
echo ""
fi
done
echo "3. Файлы с SUID/SGID битами (потенциально опасные):"
find / -type f \( -perm -4000 -o -perm -2000 \) 2>/dev/null | head -20
echo ""
echo "4. Проверка прав на критичные каталоги (/etc, /bin, /sbin):"
for dir in /etc /bin /sbin; do
perms=$(stat -c "%a %U:%G" $dir 2>/dev/null)
echo "$dir: $perms"
doneДля анализа последней активности пользователей можно проверять логи (/var/log/auth.log, /var/log/secure) или использовать команду lastlog.
Windows Server: PowerShell как инструмент глубокой проверки
PowerShell предоставляет мощные cmdlets для аудита. Скрипт для экспорта информации о локальных пользователях и группах:
# Аудит локальных пользователей и групп Windows
$Report = @()
# 1. Получение всех локальных пользователей
$LocalUsers = Get-LocalUser
foreach ($User in $LocalUsers) {
$LastLogon = if ($User.LastLogon) { $User.LastLogon.ToString("yyyy-MM-dd HH:mm:ss") } else { "Never" }
$UserObj = [PSCustomObject]@{
Name = $User.Name
Enabled = $User.Enabled
LastLogon = $LastLogon
SID = $User.SID.Value
MemberOf = (Get-LocalGroup | Where-Object { $_.Members -contains $User.SID.Value }).Name -join ", "
}
$Report += $UserObj
}
# 2. Вывод пользователей, входящих в административные группы
$AdminGroups = @("Administrators", "Remote Desktop Users", "Backup Operators")
echo "Пользователи в административных группах:"
foreach ($Group in $AdminGroups) {
$Members = Get-LocalGroupMember -Group $Group -ErrorAction SilentlyContinue
if ($Members) {
echo "Группа: $Group"
$Members | ForEach-Object { echo " - $($_.Name)" }
}
}
# 3. Экспорт отчета в CSV
$Report | Export-Csv -Path "C:\Audit\LocalUsers_Report_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation -Encoding UTF8Для анализа журналов безопасности (события входа, изменения привилегий) используйте cmdlet Get-WinEvent с фильтрами по ID событий.
Брандмауэры: iptables, firewalld и Windows Firewall в действии
Сетевой экран - обязательный элемент защиты, фильтрующий входящий и исходящий трафик на основе правил.
iptables vs firewalld: выбор и базовые правила для Linux
iptables - низкоуровневый инструмент, предоставляющий детальный контроль. firewalld - высокоуровневая демон-служба с концепцией зон и динамическим управлением, упрощающая администрирование.
Базовые правила iptables для защиты сервера:
# 1. Очистка существующих правил и установка политик по умолчанию DROP
sudo iptables -F
sudo iptables -X
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 2. Разрешение loopback-интерфейса
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
# 3. Разрешение установленных и связанных соединений
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 4. Разрешение SSH (например, на порту 22) для доверенной сети
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
# 5. Разрешение HTTP/HTTPS для всех (если это веб-сервер)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 6. Лимитирование запросов на SSH для защиты от брутфорса
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
# 7. Сохранение правил (зависит от дистрибутива)
sudo iptables-save | sudo tee /etc/iptables/rules.v4Эквивалентные действия в firewalld:
# Установка firewalld (если не установлен)
sudo dnf install firewalld -y # или apt install firewalld
sudo systemctl enable --now firewalld
# Добавление служб в зону public (по умолчанию)
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# Ограничение доступа SSH по IP (используя богатые правила)
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
sudo firewall-cmd --permanent --zone=public --remove-service=ssh # Удаляем общее правило для ssh, если хотим только по IP
# Блокировка исходящего трафика на определенный порт (пример)
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -p tcp --dport 25 -j DROP
# Применение изменений
sudo firewall-cmd --reloadWindows Firewall: от графического интерфейса до Advanced Security
Windows Defender Firewall с расширенными функциями безопасности - мощный встроенный инструмент.
Создание правил через PowerShell:
# 1. Разрешение RDP только с определенной подсети
New-NetFirewallRule -DisplayName "Allow RDP from Trusted LAN" -Direction Inbound -LocalPort 3389 -Protocol TCP -Action Allow -RemoteAddress 192.168.1.0/24
# 2. Запрет исходящих соединений на нестандартный порт (например, 4444)
New-NetFirewallRule -DisplayName "Block Outbound TCP 4444" -Direction Outbound -LocalPort 4444 -Protocol TCP -Action Block
# 3. Создание правила для конкретного приложения (например, для веб-сервера nginx.exe)
New-NetFirewallRule -DisplayName "Allow Nginx HTTP" -Direction Inbound -Program "C:\nginx\nginx.exe" -Action Allow
# 4. Просмотр всех активных правил
Get-NetFirewallRule -Enabled True | Select-Object DisplayName, Direction, Action | Format-Table -AutoSizeЛогика лучших практик: применяйте принцип наименьших привилегий. Создавайте правила, разрешающие только необходимый для работы трафик. Для веб-серверов ограничьте входящие подключения к портам 80 и 443, для почтовых серверов - к портам 25, 465, 587, 993, 995. Регулярно проводите аудит правил, удаляя устаревшие. Для комплексного мониторинга сетевой активности и выявления аномалий полезно интегрировать логи брандмауэра в централизованную систему, как описано в разделе про сбор логов, или использовать готовые команды для анализа логов.
Готовые скрипты для автоматизации рутинных проверок безопасности
Автоматизация устраняет человеческий фактор и экономит время. Ниже представлены скрипты для регулярного запуска (например, по cron в Linux или через планировщик задач в Windows).
Bash-скрипт для комплексной проверки безопасности Linux-сервера:
#!/bin/bash
# comprehensive_security_audit.sh
LOG_FILE="/var/log/security_audit_$(date +%Y%m%d).log"
{
echo "=== Начало аудита безопасности $(date) ==="
echo ""
# 1. Проверка обновлений
if command -v apt &> /dev/null; then
echo "[Проверка обновлений для Debian/Ubuntu]"
apt update && apt list --upgradable 2>/dev/null | grep -v "Listing..."
elif command -v dnf &> /dev/null; then
echo "[Проверка обновлений для RHEL/Fedora]"
dnf check-update --quiet
fi
echo ""
# 2. Аудит пользователей (адаптация скрипта из раздела 3.1)
echo "[Аудит пользователей с оболочкой]"
getent passwd | awk -F: '{ if ($7 != "/usr/sbin/nologin" && $7 != "/bin/false") print $1 }'
echo ""
# 3. Проверка корректности настроек SSH
echo "[Проверка ключевых параметров sshd_config]"
for param in PermitRootLogin PasswordAuthentication Protocol; do
value=$(grep -i "^$param" /etc/ssh/sshd_config 2>/dev/null | tail -1 | awk '{print $2}')
echo "$param = $value"
done
echo ""
# 4. Проверка состояния брандмауэра
echo "[Проверка состояния firewalld/iptables]"
if systemctl is-active --quiet firewalld; then
echo "Firewalld активен. Правила:"
firewall-cmd --list-all
else
echo "Firewalld не активен. Проверяем iptables:"
iptables -L -n -v | head -30
fi
echo ""
echo "=== Аудит завершен ==="
} | tee -a "$LOG_FILE"Настройте регулярный запуск, добавив в crontab (crontab -e):
# Ежедневный запуск в 3:00
0 3 * * * /root/scripts/comprehensive_security_audit.shPowerShell-скрипт для проверки безопасности Windows Server:
# Windows_Security_Check.ps1
$LogPath = "C:\Audit\SecurityCheck_$(Get-Date -Format 'yyyyMMdd').log"
Start-Transcript -Path $LogPath -Append
Write-Host "=== Аудит безопасности Windows Server ===" -ForegroundColor Cyan
# 1. Проверка последних установленных обновлений
Write-Host "`n[Последние 10 установленных обновлений]" -ForegroundColor Yellow
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10 HotFixID, InstalledOn, Description
# 2. Проверка учетных записей с истекшим паролем или отключенных
Write-Host "`n[Учетные записи, требующие внимания]" -ForegroundColor Yellow
Get-LocalUser | Where-Object { $_.PasswordExpires -lt (Get-Date) -or $_.Enabled -eq $false } | Format-Table Name, Enabled, PasswordExpires
# 3. Проверка правил брандмауэра для RDP
Write-Host "`n[Правила брандмауэра для RDP (порт 3389)]" -ForegroundColor Yellow
Get-NetFirewallRule -DisplayName "*RDP*" -ErrorAction SilentlyContinue | Get-NetFirewallAddressFilter | Select-Object DisplayName, RemoteAddress | Format-Table
# 4. Проверка служб с автоматическим запуском
Write-Host "`n[Службы с автозапуском, но остановленные]" -ForegroundColor Yellow
Get-Service | Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' } | Select-Object Name, DisplayName, Status
Stop-Transcript
Write-Host "`nАудит записан в $LogPath" -ForegroundColor GreenНастройте выполнение через Планировщик заданий Windows.
Для масштабирования автоматизации на множество серверов и интеграции в процессы развертывания рассмотрите использование конфигурационных менеджеров, таких как Ansible, методы работы с которыми описаны в практическом гайде по автоматизации инфраструктуры.
Централизованный сбор логов и мониторинг: видеть всё
Логи с отдельных серверов бесполезны, если их не анализировать централизованно. Система сбора ло