«Минимизация поверхности атаки — это не про запреты, а про осознанное управление. Каждый лишний сервис — это не просто «ещё один порт», это целый стек кода, конфигураций и зависимостей, который ты доверяешь своей сети. И часто этот код написан десятилетия назад.»
Почему это работает: принцип минимальной привилегии для служб
Запущенная, но неиспользуемая служба — это не нейтральный элемент. Это активный процесс, который может содержать неисправленные уязвимости, иметь доступ к системным ресурсам или файлам, и главное — он прослушивает сетевой порт, ожидая входящих соединений. Атака через такой сервис часто обходит основные средства защиты, сфокусированные на границе сети или конкретных бизнес-приложениях.
Стандарты, такие как CIS Controls (Контроль 3 — Безопасная конфигурация) или NIST 800-53 (CM-7 — Минимальная функциональность), формулируют это как базовый принцип. В требованиях ФСТЭК России для систем 4-го уровня доверия и в приказе № 21 этот подход также закреплён: система должна выполнять только те функции, для которых предназначена.
Эффективность меры подтверждается реальными инцидентами. Атаки, подобные EternalBlue (MS17-010), эксплуатировали устаревшую версию протокола SMBv1, который десятилетиями оставался включённым «на всякий случай». Уязвимости в Log4Shell или ProxyShell также достигали максимального эффекта в средах, где были развёрнуты ненужные или забытые сервисы логирования или веб-прокси.
Практический процесс: от инвентаризации до блокировки
Работа строится не на хаотичном отключении, а на методичном аудите. Цель — составить актуальную карту того, что действительно работает, и сопоставить её с бизнес-требованиями.
1. Полная инвентаризация активных служб и портов
Начните с составления полного списка. Важно проверять не только управляемые через systemd или службы Windows, но и фактические сетевые соединения. Сервис может быть остановлен, но сокет-активатор может его запустить при подключении. Или процесс может быть запущен вручную, вне контроля системы инициализации.
# Linux: комбинация команд для полной картины
ss -tulnp # Показывает все слушающие порты с именами процессов
systemctl list-units --type=service --state=running,active # Все активные службы
systemctl list-unit-files --type=socket # Все сокеты для активации
lsof -i -P -n # Альтернативный детальный просмотр
# Windows: PowerShell даёт наиболее полную информацию
Get-NetTCPConnection -State Listen | Select-Object LocalPort, OwningProcess
Get-Service | Where-Object {$_.Status -eq 'Running'}
Get-Process | Where-Object {$_.Path -like '*service*'} | Select-Object Name, Path
2. Валидация бизнес-необходимости
Для каждого обнаруженного сервиса задайте чёткие вопросы. Формализуйте ответы в таблицу.
| Сервис/Порт | Владелец/Приложение | Критичность | Дата последнего подтверждения | Решение |
|---|---|---|---|---|
| TCP/445 (SMB) | Отдел ИТ, файловый сервер | Высокая | Текущая | Оставить, усилить настройки |
| TCP/23 (Telnet) | Неизвестно | Нет | Никогда | Отключить и удалить |
| UDP/161 (SNMP) | Отдел мониторинга | Средняя | 6 месяцев назад | Перевести на SNMPv3, ограничить доступ |
3. Безопасное отключение с учётом зависимостей
Прямое удаление пакета может сломать систему. Правильный путь — остановить, запретить автозапуск, затем, после периода наблюдения, удалить.
# Linux: отключение и маскировка (предотвращает даже ручной запуск)
sudo systemctl stop service_name
sudo systemctl disable service_name
sudo systemctl mask service_name # Важный шаг для полной блокировки
# Проверка зависимостей перед удалением пакета
apt-cache rdepends package_name # Debian/Ubuntu
rpm -q --whatrequires package_name # RHEL/CentOS
# Windows: отключение через PowerShell с силой
Stop-Service -Name "Telnet" -Force
Set-Service -Name "Telnet" -StartupType Disabled -Status Stopped
# Более глубокая блокировка через реестр (аналог mask в Linux)
sc config TlntSvr start= disabled binPath= "C:Windowssystem32disabled_svc.bat"
Список первоочередных кандидатов на отключение
Следующие сервисы исторически связаны с уязвимостями и редко нужны в современных инфраструктурах. Таблица дополнена контекстом для Windows.
| Протокол / Порт | Назначение | Риск | Действие (Linux) | Действие (Windows) |
|---|---|---|---|---|
| Telnet (23) | Устаревший удалённый доступ | Передача данных, включая пароли, в открытом виде. | systemctl mask telnet.socket |
Отключить службу «Telnet». Удалить клиент и сервер в «Компонентах Windows». |
| SMBv1 / NetBIOS (139, 445) | Совместный доступ к файлам и принтерам (устаревшие версии) | Критические уязвимости (EternalBlue), используемые для распространения ransomware. | В /etc/samba/smb.conf: server min protocol = SMB2_10. Отключить nmb. |
Отключить через PowerShell: Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol. |
| SNMP v1/v2 (161, 162) | Управление сетевыми устройствами | Аутентификация по простой строке (community), часто оставляемой по умолчанию (public/private). | systemctl disable snmpd. Если нужен — настроить SNMPv3 и списки доступа. |
Отключить службу «SNMP». Использовать только с настроенными community-строками и ACL. |
| RPC Portmapper (111) | Управление удалёнными вызовами процедур | Может раскрывать информацию о других RPC-сервисах, используется для их перебора. | systemctl mask rpcbind. Удалить пакет rpcbind. |
Не применимо напрямую. Риск связан с конкретными RPC-службами (например, Remote Registry). |
| Служба удалённого реестра | Удалённое управление реестром Windows | Прямой доступ к «мозгу» системы. Часто используется злоумышленниками для персистентности. | — | Обязательно отключить: Set-Service -Name "RemoteRegistry" -StartupType Disabled -Status Stopped. |
Автоматизация и централизованное управление
Ручное управление сервисами на десятках или сотнях серверов неэффективно и подвержено ошибкам. Используйте инструменты конфигурационного управления.
Ansible-плейбук для базового харденинга
- name: Базовая очистка от небезопасных сервисов
hosts: all
become: yes
tasks:
- name: Остановка и маскировка опасных сервисов
systemd:
name: "{{ item }}"
state: stopped
enabled: no
masked: yes
daemon_reload: yes
loop:
- telnet.socket
- rpcbind.service
- nfs-server.service
- vsftpd.service
- snmpd.service
ignore_errors: yes # Если какой-то сервис не установлен
- name: Удаление ненужных пакетов (на основе дистрибутива)
package:
name: "{{ item }}"
state: absent
loop: "{{ (ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu') | ternary(['telnetd', 'rpcbind', 'nfs-common'], ['telnet-server', 'rpcbind']) }}"
when: ansible_os_family == "Debian" or ansible_os_family == "RedHat"
Групповые политики (GPO) в Windows-среде
Настройка через GPO обеспечивает централизованное и принудительное применение политик. Путь: Конфигурация компьютера → Политики → Конфигурация Windows → Параметры безопасности → Системные службы.
Для каждой службы (например, «Telnet», «Служба удалённого реестра», «Служба обнаружения SSDP») задайте режим запуска «Отключена» и определите права доступа для её изменения. Это предотвратит локальный перезапуск службы пользователем или вредоносным ПО.
Постоянный контроль и предотвращение регрессии
Отключение сервисов — не разовое мероприятие. При обновлениях системы, установке нового ПО или изменении конфигураций ненужные службы могут появиться вновь.
- Регулярный аудит: Внедрите ежеквартальное сканирование сети (например, с помощью nmap) для обнаружения неожиданно открытых портов. Сравнивайте результаты с эталонным «белым списком» разрешённых сервисов.
- Мониторинг событий: Настройте правила в SIEM-системе на оповещение о запуске отключённых служб (события Windows Event ID 7045 или journald в Linux).
- Сетевой сегментация: Даже если сервис должен остаться включённым для внутренних нужд, ограничьте его доступность с помощью межсетевых экранов. Например, порт базы данных (3306, 5432) не должен быть доступен из интернета или даже из всех сегментов внутренней сети.
- Конфигурация как код: Храните эталонные конфигурации служб (например, в виде Ansible-ролей или DSC-скриптов) в системе контроля версий. Это позволяет быстро обнаружить дрейф конфигурации и восстановить безопасное состояние.
Этот подход превращает разовую чистку в непрерывный цикл управления безопасностью, где каждый сервис существует не по умолчанию, а по обоснованному решению.