Задача администратора - уменьшить площадь атаки на отдельно взятой машине. Это значит: пароли хранить так, чтобы их нельзя было прочитать обычным пользователем, выключить службы, которые никому не нужны, понимать, кто слушает сеть, и уметь быстро закрыть вход в систему. В этом уроке разберём теневые пароли, отключение и маскирование служб через systemd, сокет-активацию вместо старых inetd/xinetd, наследие TCP wrappers, файл блокировки входа и базовую механику PAM с faillock.

Как это работает
Файл /etc/passwd читается всеми - там лежат имена, UID, оболочки. Если бы там же лежали и хэши паролей, любой пользователь мог бы скопировать их и спокойно перебирать офлайн. Поэтому хэши вынесли в /etc/shadow, доступный только root (права 640, владелец root:shadow). В passwd на месте пароля остаётся символ x - признак того, что реальный хэш в shadow. Утилита pwconv переносит пароли в shadow и проставляет этот x, pwunconv делает обратное. Современный хэш в shadow начинается с $y$ (yescrypt в Debian 13 и свежих Ubuntu) или $6$ (SHA-512), за алгоритмом идут соль и сам хэш.
Каждая запущенная служба - это потенциальная дыра. Принцип минимизации: всё, что не используется, должно быть выключено. В systemd disable убирает службу из автозапуска, но запустить её руками или по зависимости всё ещё можно. mask жёстче - он делает симлинк юнита на /dev/null, и служба не стартует никак, даже если её дёрнет другой юнит. Это разные уровни: disable - не при загрузке, mask - вообще никогда.
Раньше мелкие сетевые сервисы не держали постоянно в памяти, а запускали по требованию через супердемон inetd, позже xinetd. Пришёл пакет на порт - супердемон поднял нужную программу. В 2026 эту роль выполняет сама systemd через сокет-активацию: юнит .socket держит открытым порт, а связанный .service стартует только когда туда кто-то постучался. xinetd и inetd в современных дистрибутивах не ставятся по умолчанию, знать их надо для экзамена, на практике используется socket activation.
TCP wrappers (библиотека libwrap, файлы /etc/hosts.allow и /etc/hosts.deny) - механизм фильтрации по адресу на уровне приложения. Это легаси: в свежих сборках OpenSSH поддержку libwrap выпилили, фильтровать трафик нужно фаерволом (nftables, на смену iptables). Для экзамена знать синтаксис надо, в реальной защите хоста полагайтесь на nftables и firewalld.
PAM (Pluggable Authentication Modules) - это слой между приложением и проверкой пользователя. login, sshd, sudo не реализуют логику паролей сами, а зовут стек PAM-модулей из /etc/pam.d/. Модуль pam_faillock считает неудачные попытки и временно блокирует учётку после порога - так гасят перебор паролей.
Команды и примеры
Перенос паролей в shadow и проверка целостности файлов:
Код: Выделить всё
pwconv # перенести хэши в /etc/shadow, проставить x в passwd
pwck # проверить согласованность passwd и shadow
chage -l alice # сроки действия пароля пользователя
Код: Выделить всё
systemctl disable --now cups.service # выключить сейчас и убрать из автозапуска
systemctl mask avahi-daemon.service # запретить запуск полностью
systemctl unmask avahi-daemon.service # снять маску
systemctl list-unit-files --state=enabled # что стартует при загрузке
Код: Выделить всё
ss -tulpn # TCP/UDP сокеты в режиме LISTEN, с PID и именем процесса
ss -ltn # только TCP, без резолва имён портов
systemctl list-sockets # активные .socket-юниты systemd
Код: Выделить всё
# Debian 13 / Ubuntu 24.04
apt list --installed | grep -i avahi
dpkg -S /usr/sbin/sshd
# RHEL 10 / Fedora 41+
dnf list --installed | grep -i avahi
rpm -qf /usr/sbin/sshd
Код: Выделить всё
systemctl status sshd.socket # если включён socket-режим
systemctl cat foo.socket # показать [Socket] ListenStream=НОМЕР
Код: Выделить всё
echo "Идут работы, вход закрыт до 18:00" > /etc/nologin
# обычные логины через PAM (pam_nologin) отклоняются, root проходит
rm /etc/nologin # снять запрет
Код: Выделить всё
faillock --user alice # сколько неудач накопилось
faillock --user alice --reset # сбросить счётчик и разблокировать
Код: Выделить всё
# /etc/hosts.allow
sshd: 192.168.10.0/24
# /etc/hosts.deny
ALL: ALL
- disable не останавливает уже работающую службу - нужен disable --now или отдельный stop. И disable не мешает её запустить вручную, для этого нужен mask.
- Маскированная служба тихо игнорируется зависимостями. Забыли про mask на нужном сервисе - он не стартует, а в статусе пишет masked, не failed. Легко проглядеть.
- Правка /etc/shadow руками ломает формат. Меняйте пароли через passwd и chage, для проверки гоняйте pwck.
- ss -tulpn без root не покажет PID чужих процессов - запускайте под sudo, иначе колонка с процессом будет пустой.
- /etc/nologin блокирует и ваши собственные новые SSH-сессии. Если активная сессия отвалится, а файл на месте, обратно зайдёте только через консоль или как root.
- Надежда на hosts.allow в 2026 - ошибка: многие демоны (включая современный sshd) уже не линкуются с libwrap, и правила просто игнорируются. Фильтруйте nftables.
- faillock блокирует по умолчанию на время (unlock_time), а не навсегда - не паникуйте, но и не ждите, сбрасывайте через --reset.
- Выполните pwck и убедитесь, что в /etc/passwd на месте паролей стоит x, а хэши лежат в /etc/shadow (посмотрите начало строки: $y$ или $6$).
- Запустите ss -tulpn под sudo и выпишите все порты в LISTEN с именами процессов. Найдите хотя бы один сервис, который вам не нужен.
- Отключите этот сервис командой systemctl disable --now, затем перепроверьте через ss, что порт исчез.
- Замаскируйте сервис через systemctl mask и попробуйте systemctl start - убедитесь, что запуск отклонён.
- Снимите маску через unmask. Найдите пакет, которому принадлежит файл демона: dpkg -S или rpm -qf.
- Создайте /etc/nologin с текстом, откройте НОВУЮ SSH-сессию обычным пользователем (должна отклониться), затем удалите файл.
- Намеренно три раза ошибитесь паролем при su на тестовую учётку, посмотрите faillock --user и сбросьте счётчик через --reset.
- Чем отличается systemctl disable от systemctl mask и в каком случае служба всё равно может запуститься?
- Что означает символ x в поле пароля /etc/passwd и какая утилита его проставляет?
- Какой командой увидеть все слушающие TCP- и UDP-порты вместе с процессами, и почему её обычно запускают под root?
- Чем сокет-активация systemd заменяет устаревший xinetd и какой юнит держит открытым порт?
- Кого пускает в систему наличие файла /etc/nologin и через какой PAM-модуль это работает?
- Почему в 2026 году нельзя полагаться на /etc/hosts.allow для защиты SSH и чем его заменить?