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

0
29
Обложка статьи: 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. Для каждого дистрибутива команды разные, смотрите соответствующие статьи выше. Применять «автоисправление» сканера на боевом сервере без тестовой копии не стоит: строгие профили ломают работающие сервисы.

Оставьте свой ответ