Hardening Linux: базовая настройка безопасности сервера

Новый сервер из образа хостера уже слушает SSH и часто несёт лишние сервисы. Ниже порядок действий, после которого сервер закрыт от самых частых атак: подбора паролей, устаревших пакетов и открытых портов, о которых вы забыли.
Это общая статья. Для конкретного дистрибутива, с его инструментами и профилями проверки, используйте отдельные: Ubuntu, Debian, Rocky Linux, Astra Linux, РЕД ОС.
Команды даны для Debian/Ubuntu и RHEL-совместимых дистрибутивов. Выполняйте их с отдельной сессии SSH и не закрывайте её, пока не проверите вход по новым правилам.
1. Обновите систему и включите автообновления безопасности
# Debian/Ubuntu
apt update && apt upgrade -y
apt install -y unattended-upgrades
# RHEL-совместимые
dnf upgrade -y
dnf install -y dnf-automatic
systemctl enable --now dnf-automatic-install.timer
Автообновления ставят только пакеты безопасности, если вы не меняли настройки. Для боевого сервера с критичным ПО сначала проверьте обновления на копии.
2. Заведите пользователя и отключите вход root по паролю
Создайте обычного пользователя, добавьте его в группу администраторов и скопируйте ключ. Подробнее про доступ по ключу: включение SSH и подключение, про группы: добавление пользователя в группу.
adduser admin1
usermod -aG sudo admin1 # на RHEL: usermod -aG wheel admin1
ssh-copy-id admin1@SERVER
В /etc/ssh/sshd_config (или в файле в /etc/ssh/sshd_config.d/) задайте:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
Не перезапускайте SSH, пока не убедитесь, что вход по ключу под новым пользователем работает. Иначе потеряете доступ к серверу.
sshd -t && systemctl reload sshd
3. Включите firewall и откройте только нужные порты
Политика «запретить всё входящее, разрешить нужное». Выбор между nftables и firewalld разобран в статье про firewall в Linux. Минимальный пример для Ubuntu с ufw:
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 443/tcp
ufw enable
4. Закройте лишние сервисы
Посмотрите, что слушает сеть, и отключите всё, что не нужно серверу. Разбор команд: какие порты открыты в Linux.
ss -tulpn
systemctl list-unit-files --state=enabled
systemctl disable --now SERVICE
5. Ограничьте sudo
Давайте администраторам права через группу, а не правкой общего файла. Правки только через visudo, иначе ошибка синтаксиса заблокирует sudo для всех. Подробнее в статье про sudo и минимальные права.
6. Защитите от подбора паролей
Поставьте fail2ban или CrowdSec: они банят адреса после серии неудачных входов. Они не заменяют отключение паролей из пункта 2, а дополняют его.
7. Включите аудит и храните журналы
apt install -y auditd # RHEL: dnf install -y audit
systemctl enable --now auditd
journalctl -u ssh --since "1 hour ago"
Журналы на самом сервере удаляет тот, кто взломал сервер. Отправляйте их на отдельный хост: сбор логов Linux.
8. Резервная копия до изменений
Все правки выше проще откатить, если копия есть. Стратегия и проверка восстановления: резервное копирование 3-2-1.
Как проверить
sshd -T | grep -E 'permitrootlogin|passwordauthentication'
ss -tulpn
ufw status verbose # или: firewall-cmd --list-all
apt list --upgradable # или: dnf check-update
Ожидаемо: root и пароли выключены, слушают только нужные порты, обновлений в очереди нет. Снаружи сервер можно проверить сканером: Nmap для своей сети.
Полный перечень мер по разделам CIS
Ниже настройки сгруппированы по разделам CIS Benchmark. Названия разделов и нумерация отличаются между дистрибутивами и версиями, но структура общая. Если не сказано иное, это уровень Level 1. Команды рассчитаны на дистрибутивы с systemd. Особенности конкретной системы смотрите в статьях по Ubuntu, Debian, Rocky Linux, Astra Linux и РЕД ОС.
Правило применения: меняйте по разделу, после каждого проверяйте работу сервисов, и держите вторую сессию администратора открытой.
Параметры ядра, права на файлы и вход root в формулировках методического документа ФСТЭК разобраны отдельно, со скриптом проверки: рекомендации ФСТЭК по настройке Linux.
Раздел 1. Начальная настройка
Разделы и параметры монтирования. При установке выделите отдельные тома для /tmp, /var, /var/log, /var/log/audit и /home (удобно через LVM). Параметры в /etc/fstab:
tmpfs /tmp tmpfs defaults,rw,nosuid,nodev,noexec,relatime,size=2G 0 0
tmpfs /dev/shm tmpfs defaults,rw,nosuid,nodev,noexec,relatime 0 0
# /home: добавить nodev; /var/tmp: nodev,nosuid,noexec
findmnt -no OPTIONS /tmp
noexec на /tmp ломает часть установщиков и скриптов: проверьте на тестовой копии.
Отключение ненужных файловых систем и протоколов ядра.
sudo tee /etc/modprobe.d/hardening.conf >/dev/null <<'EOF'
install cramfs /bin/true
install freevxfs /bin/true
install hfs /bin/true
install hfsplus /bin/true
install jffs2 /bin/true
install udf /bin/true
install usb-storage /bin/true
install dccp /bin/true
install sctp /bin/true
install rds /bin/true
install tipc /bin/true
EOF
Отключение usb-storage закроет и легитимные USB-накопители, а udf нужен для чтения некоторых образов и дисков. Проверьте, что они не используются: lsmod.
Загрузчик. Установите пароль на редактирование параметров загрузки (grub-mkpasswd-pbkdf2 в Debian/Ubuntu, grub2-setpassword в RHEL-семействе) и ограничьте доступ к файлу конфигурации. Без дополнительной настройки сервер потребует пароль при каждой загрузке, а сам пароль потерять нельзя. Настройка отличается по дистрибутивам, см. отдельные статьи.
Защита процессов.
sudo tee /etc/sysctl.d/60-process.conf >/dev/null <<'EOF'
kernel.randomize_va_space = 2
fs.suid_dumpable = 0
kernel.yama.ptrace_scope = 1
EOF
echo '* hard core 0' | sudo tee /etc/security/limits.d/10-core.conf
sudo sysctl --system
Параметр kernel.yama.ptrace_scope может отсутствовать в вашем ядре, тогда уберите строку. Мандатный контроль доступа (AppArmor или SELinux) должен быть включён: по Ubuntu и Rocky.
Предупреждающие баннеры. Уберите из /etc/issue, /etc/issue.net и /etc/motd сведения о системе (\r, \s, \m, \v) и добавьте предупреждение о санкционированном доступе:
echo "Authorized use only. Activity is logged." | sudo tee /etc/issue /etc/issue.net
sudo chmod 644 /etc/issue /etc/issue.net
Раздел 2. Службы
systemctl list-unit-files --state=enabled
sudo systemctl disable --now cups avahi-daemon rpcbind # пример
# удалить пакет совсем:
sudo apt purge cups avahi-daemon # или: sudo dnf remove cups avahi
CIS требует проверить и отключить, если не нужны: avahi, cups, dhcpd, slapd, nfs-server, rpcbind, named, vsftpd, веб-сервер, dovecot, smb, squid, snmpd, xinetd, autofs, ypserv. Устаревшие клиенты (telnet, rsh, talk, ftp) удалите. Синхронизация времени (chrony): настройка. Планировщик:
sudo chown root:root /etc/crontab && sudo chmod 600 /etc/crontab
sudo chmod 700 /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly /etc/cron.d
echo root | sudo tee /etc/cron.allow /etc/at.allow
sudo rm -f /etc/cron.deny /etc/at.deny
Раздел 3. Сетевые параметры
sudo tee /etc/sysctl.d/70-network.conf >/dev/null <<'EOF'
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_syncookies = 1
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.all.accept_redirects = 0
EOF
sudo sysctl --system
Если сервер выступает маршрутизатором или шлюзом VPN, ip_forward и редиректы настраиваются иначе. Если IPv6 не используется, отключите его на уровне сети или ядра, но документируйте это решение. Беспроводные адаптеры и Bluetooth на серверах отключите: nmcli radio all off, systemctl disable --now bluetooth.
Раздел 4. Межсетевой экран
Политика «запретить входящее», разрешён loopback, ответы на установленные соединения, нужные порты. Настройка и проверка без потери доступа: nftables и firewalld. Для CIS важно, чтобы был один активный менеджер правил и правила сохранялись после перезагрузки.
Раздел 5. Доступ, аутентификация и авторизация
SSH (полный набор). Файл /etc/ssh/sshd_config.d/10-hardening.conf:
LogLevel VERBOSE
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
HostbasedAuthentication no
IgnoreRhosts yes
PermitUserEnvironment no
X11Forwarding no
AllowTcpForwarding no
MaxAuthTries 3
MaxSessions 4
MaxStartups 10:30:60
LoginGraceTime 60
ClientAliveInterval 300
ClientAliveCountMax 3
Banner /etc/issue.net
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
sudo chmod 600 /etc/ssh/sshd_config
sudo sshd -t && sudo systemctl reload ssh # на RHEL-семействе: sshd
sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication|ciphers'
В RHEL-семействе алгоритмы шифрования задаются через crypto-policies, поэтому строки KexAlgorithms, Ciphers и MACs там не задают вручную. Если вам нужен AllowTcpForwarding (туннели, прыжковые хосты), оставьте yes для нужных пользователей через блок Match. Двухфакторная аутентификация: MFA для SSH.
sudo. Подробно: sudo и sudoers. Минимум CIS:
Defaults use_pty
Defaults logfile="/var/log/sudo.log"
Defaults timestamp_timeout=15
# не использовать !authenticate и NOPASSWD для ALL
Парольная политика и блокировка подбора (PAM). Значения CIS: длина не меньше 14, не менее 3–4 классов символов, блокировка после 5 неудачных попыток на 15 минут, запрет повторного использования 24 последних паролей. Настройка файлов:
# /etc/security/pwquality.conf
minlen = 14
minclass = 4
# /etc/security/faillock.conf
deny = 5
unlock_time = 900
# /etc/pam.d/common-password (Debian/Ubuntu) или system-auth (RHEL)
password required pam_pwhistory.so remember=24 enforce_for_root use_authtok
PAM-конфигурацию нельзя править «вслепую»: ошибка блокирует вход. Используйте pam-auth-update (Debian, Ubuntu) или authselect (RHEL-семейство) и держите открытой сессию root.
Учётные записи и среда пользователя.
# /etc/login.defs
PASS_MAX_DAYS 365
PASS_MIN_DAYS 1
PASS_WARN_AGE 7
UMASK 027
ENCRYPT_METHOD SHA512 # или YESCRYPT на новых системах
sudo useradd -D -f 30 # блокировать неиспользуемые учётки через 30 дней
echo 'readonly TMOUT=900; export TMOUT' | sudo tee /etc/profile.d/tmout.sh
awk -F: '($3==0){print $1}' /etc/passwd # должен быть только root
awk -F: '($3<1000 && $1!="root" && $7!~/nologin|false/){print $1}' /etc/passwd # системные учётки с оболочкой
Раздел 6. Журналирование и аудит
journald и rsyslog. Постоянное хранение, ограничение размера и права на файлы, отправка на отдельный сервер: сбор логов. Проверка прав: sudo find /var/log -type f -perm /037 -ls (результат должен быть пуст).
auditd. Установка и включение аудита с самого начала загрузки: в параметры ядра (GRUB_CMDLINE_LINUX) добавьте audit=1 audit_backlog_limit=8192, затем update-grub или grub2-mkconfig. В /etc/audit/auditd.conf:
max_log_file = 50
max_log_file_action = keep_logs
space_left_action = email
admin_space_left_action = halt
Правила /etc/audit/rules.d/50-cis.rules (для 32-разрядных вызовов продублируйте строки с arch=b32):
-D
-b 8192
-f 1
-a always,exit -F arch=b64 -S adjtimex,settimeofday,clock_settime -k time-change
-w /etc/localtime -p wa -k time-change
-w /etc/group -p wa -k identity
-w /etc/passwd -p wa -k identity
-w /etc/gshadow -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/security/opasswd -p wa -k identity
-a always,exit -F arch=b64 -S sethostname,setdomainname -k system-locale
-w /etc/issue -p wa -k system-locale
-w /etc/issue.net -p wa -k system-locale
-w /etc/hosts -p wa -k system-locale
-w /var/log/faillog -p wa -k logins
-w /var/log/lastlog -p wa -k logins
-w /var/run/utmp -p wa -k session
-w /var/log/wtmp -p wa -k session
-w /var/log/btmp -p wa -k session
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat,chown,fchown,fchownat,lchown,setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F auid>=1000 -F auid!=unset -k perm_mod
-a always,exit -F arch=b64 -S creat,open,openat,truncate,ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=unset -k access
-a always,exit -F arch=b64 -S creat,open,openat,truncate,ftruncate -F exit=-EPERM -F auid>=1000 -F auid!=unset -k access
-a always,exit -F arch=b64 -S mount -F auid>=1000 -F auid!=unset -k mounts
-a always,exit -F arch=b64 -S unlink,unlinkat,rename,renameat -F auid>=1000 -F auid!=unset -k delete
-w /etc/sudoers -p wa -k scope
-w /etc/sudoers.d/ -p wa -k scope
-w /var/log/sudo.log -p wa -k actions
-a always,exit -F arch=b64 -S init_module,delete_module -k modules
-w /sbin/insmod -p x -k modules
-w /sbin/modprobe -p x -k modules
-e 2
sudo augenrules --load
sudo auditctl -l | head
sudo auditctl -s
Последняя строка -e 2 делает правила неизменяемыми до перезагрузки: любое изменение правил потом потребует перезапуска сервера. Добавляйте её последней, когда набор проверен. На системах с MAC добавьте наблюдение за каталогом политик (/etc/apparmor/ или /etc/selinux/).
Контроль целостности (AIDE).
sudo apt install -y aide # RHEL: sudo dnf install -y aide
sudo aideinit # RHEL: sudo aide --init
echo '0 5 * * * root /usr/bin/aide --check' | sudo tee /etc/cron.d/aide-check
База AIDE должна храниться вне сервера или на носителе только для чтения, иначе нарушитель перепишет её вместе со своими изменениями.
Раздел 7. Обслуживание системы
sudo chmod 644 /etc/passwd /etc/group
sudo chmod 640 /etc/shadow /etc/gshadow # RHEL-семейство: chmod 000
sudo find / -xdev -type f -perm -0002 -ls # файлы, доступные всем на запись
sudo find / -xdev \( -nouser -o -nogroup \) -ls # файлы без владельца
sudo find / -xdev -type f \( -perm -4000 -o -perm -2000 \) -ls # SUID/SGID: сверить с эталоном
sudo awk -F: '($2=="") {print $1}' /etc/shadow # пустые пароли
cut -d: -f3 /etc/passwd | sort | uniq -d # повторяющиеся UID
cut -d: -f3 /etc/group | sort | uniq -d # повторяющиеся GID
sudo find /home /root -name .netrc -o -name .rhosts -o -name .forward 2>/dev/null
Сохраните список SUID/SGID-файлов как эталон и сравнивайте при каждой проверке: появление нового файла — повод для расследования. Обновления и автоматизация: см. шаг 1 выше.
Что настройка ОС не закрывает
Требования ФСТЭК шире, чем конфигурация операционной системы. Ниже все группы мер из приказов № 17, 21 и 239 и граница между «даёт ОС» и «нужно сверх неё». Состав мер и их усиление определяются категорией, уровнем защищённости и вашим проектом защиты, поэтому сверяйтесь с текстом приказов.
| Группа мер ФСТЭК | Что даёт настройка ОС | Что нужно сверх ОС |
|---|---|---|
| ИАФ: идентификация и аутентификация | PAM, политика паролей, SSH по ключам, блокировка подбора | Централизованный каталог, MFA, процесс выдачи и отзыва учётных записей |
| УПД: управление доступом | Права файлов, sudo, SELinux/AppArmor, мандатный контроль (Astra) | Матрица доступа, пересмотр прав, разделение ролей |
| ОПС: ограничение программной среды | Удаление лишних служб и пакетов, ЗПС (Astra), fapolicyd, noexec | Перечень разрешённого ПО и контроль установки |
| ЗНИ: защита машинных носителей | Запрет монтирования USB, шифрование дисков | Учёт носителей, порядок уничтожения |
| РСБ: регистрация событий безопасности | auditd, journald, rsyslog, синхронизация времени | Централизованный сбор, анализ и хранение журналов |
| АВЗ: антивирусная защита | Не реализуется настройкой ОС | Сертифицированное средство антивирусной защиты, обновление баз |
| СОВ: обнаружение вторжений | Частично (правила аудита) | Система обнаружения: Wazuh, Suricata или сертифицированный продукт |
| ОЦЛ: контроль целостности | AIDE, проверка подписей пакетов, МКЦ (Astra) | Контроль целостности ПО и данных приложений |
| ОДТ: обеспечение доступности | Резервное копирование, мониторинг | Резервирование и восстановление, планы непрерывности |
| ЗТС: защита технических средств | Не реализуется настройкой ОС | Физическая защита помещений и оборудования |
| ЗИС: защита системы и её средств | Firewall, параметры ядра, шифрование каналов | Сегментация сети, защита периметра, TLS |
| ИНЦ: реагирование на инциденты | Не реализуется настройкой ОС | Процесс реагирования, роли, обучение |
| УКФ: управление конфигурацией | Эталонная конфигурация, сканеры соответствия | Учёт изменений, согласование, версионирование конфигураций |
| АНЗ: анализ защищённости | Установка обновлений, сканирование соответствия | Управление уязвимостями |
| ЗСВ: защита среды виртуализации | Не реализуется внутри гостя | Настройки гипервизора и сети виртуализации |
В NIST SP 800-53 аналогичные семейства: AC (доступ), AU (аудит), CM (конфигурация), IA (идентификация), SC (защита систем и каналов), SI (целостность систем и информации), CP (непрерывность), IR (реагирование на инциденты), PE (физическая защита). Эти семейства сопоставимы с группами ФСТЭК, но не совпадают с ними по номерам и содержанию.
Соответствие разделов CIS группам ФСТЭК и семействам NIST
| Раздел CIS | ФСТЭК | NIST SP 800-53 |
|---|---|---|
| 1. Начальная настройка | ОПС, ЗНИ, ОЦЛ, УКФ | CM-6, CM-7, SI-7 |
| 2. Службы | ОПС | CM-7 |
| 3. Сетевые параметры | ЗИС | SC-5, SC-7 |
| 4. Межсетевой экран | ЗИС, УПД | SC-7, AC-4 |
| 5. Доступ и аутентификация | ИАФ, УПД | IA-2, IA-5, AC-2, AC-6, AC-7, AC-17 |
| 6. Журналирование и аудит | РСБ, ОЦЛ | AU-2, AU-3, AU-8, AU-9, AU-12, SI-7 |
| 7. Обслуживание системы | УПД, ОЦЛ | AC-3, SI-7 |
Таблицы нужны, чтобы в отчёте об аудите связывать результат сканера с требованием регулятора. По разделу, который не закрыт, формулируйте задачу с ответственным и сроком.
На какие требования опираться
«Безопасно» нужно измерять по документу. Используются три источника, и они дополняют друг друга:
- ФСТЭК России: обязательны, если вы защищаете государственные информационные системы (приказ № 17), информационные системы персональных данных (приказ № 21) или значимые объекты КИИ (приказ № 239). Они задают что должно быть реализовано (группы мер), а не как настроить конкретный Linux. Сверяйтесь с действующей редакцией на fstec.ru. Методический документ по настройке Linux (параметры ядра, права, вход root) разобран по пунктам: рекомендации ФСТЭК по настройке Linux.
- CIS Benchmarks: пошаговые настройки для конкретных дистрибутивов с уровнями строгости и командами проверки. Берите benchmark вашего дистрибутива как чек-лист.
- NIST: SP 800-123 описывает защиту серверов в целом, SP 800-53 содержит каталог мер. Это не российский закон, но удобный язык для сравнения и аудита.
Как шаги статьи связаны с требованиями
Соответствие приблизительное и служит ориентиром: точные номера мер и их применимость зависят от класса защищённости вашей системы, сверяйте с текстом приказов.
| Шаг | ФСТЭК (группа мер) | CIS Benchmark | NIST SP 800-53 |
|---|---|---|---|
| 1. Обновления | АНЗ (анализ защищённости) | Initial Setup, Package Management | SI-2 Flaw Remediation |
| 2. SSH и учётные записи | ИАФ (идентификация и аутентификация) | Access, Authentication and Authorization | IA-2, IA-5, AC-17 |
| 3. Firewall | ЗИС (защита среды и её средств) | Network, Host Based Firewall | SC-7 Boundary Protection |
| 4. Лишние сервисы | ОПС (ограничение программной среды) | Services | CM-7 Least Functionality |
| 5. sudo | УПД (управление доступом) | Access Control, sudo | AC-6 Least Privilege |
| 7. Журналы и аудит | РСБ (регистрация событий безопасности) | Logging and Auditing | AU-2, AU-12 |
| 8. Резервные копии | ОДТ (обеспечение доступности) | вне benchmark | CP-9 System Backup |
| Конфигурация в целом | УКФ (управление конфигурацией) | весь benchmark | CM-6 Configuration Settings |
Проверка автоматическим сканером
Не проверяйте сотни пунктов вручную. Запустите сканер и разбирайте расхождения:
sudo lynis audit system # любой дистрибутив, быстрый обзор
sudo oscap xccdf eval --profile cis --report report.html SSG_CONTENT.xml # профиль CIS через OpenSCAP
Lynis ставится из репозитория или с cisofy.com, OpenSCAP и контент SCAP Security Guide описаны на open-scap.org. Для каждого дистрибутива команды разные, смотрите соответствующие статьи выше. Применять «автоисправление» сканера на боевом сервере без тестовой копии не стоит: строгие профили ломают работающие сервисы.



















