Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SecureLinux-NG

Bash-скрипт безопасной настройки Linux-хостов по требованиям ФСТЭК России. Покрывает 40 пунктов методического документа от 25.12.2022 + 20 дополнительных мер = 60 позиций; из них 59 реализованы: done=39, partial=20. 15.1 kernel.modules_disabled=1 временно не применяется автоматически.

VersionPlatformFSTECLicense


Назначение

SecureLinux-NG — инструмент управляемой безопасной настройки Linux-хостов в соответствии с «Рекомендациями по безопасной настройке операционных систем Linux» ФСТЭК России (методический документ от 25.12.2022).

Ключевые возможности:

  • Три профиля: baseline / strict / paranoid
  • Дополнительные меры отключены по умолчанию и включаются для текущего --apply флагом --enable-additional-measures либо параметром ENABLE_ADDITIONAL_MEASURES=1 в config-файле
  • JSON manifest — каждое изменение фиксируется, откат через --restore
  • Preflight-анализ среды — Docker, K8s, desktop, container
  • --check / --apply / --restore / --report / --dry-run
  • Debian 12/13, Ubuntu 22.04/24.04

Быстрый старт

wget https://github.com/rasav65/SecureLinux-NG/archive/refs/heads/main.tar.gz
tar -xzf main.tar.gz
cd SecureLinux-NG-main

⚠ На рабочих серверах — всегда выполняйте --dry-run перед --apply.

# Просмотр изменений без применения
sudo ./securelinux-ng.sh --apply --dry-run --profile strict
# Применение основного набора без дополнительных мер
sudo ./securelinux-ng.sh --apply --profile baseline
sudo ./securelinux-ng.sh --apply --profile strict --config examples/config.strict.conf

Применение с дополнительными мерами и расширенными политиками безопасности

Важно: подробное описание параметра --enable-additional-measures приведено ниже, в разделе «Дополнительные меры».

sudo ./securelinux-ng.sh \
--apply \
--profile baseline \
--enable-additional-measures
# Проверка состояния
sudo ./securelinux-ng.sh --check --profile strict
# Откат
sudo ./securelinux-ng.sh --restore

Надёжность framework

Раздел описывает гарантии текущего релиза. История появления изменений указана в CHANGELOG.md.

Архитектурные схемы: docs/architecture.md.

ГарантияОписание
Атомарность manifestВсе записи в manifest JSON — через temp + fsync + os.replace
Атомарность /etc/shadowБлокировка пустых паролей — через temp + fsync + os.replace
Проверка backupbackup_file_checked() — при ошибке backup системный файл не изменяется; модуль прекращает операцию с warning или error
Защита от параллельного запускаflock для --apply и --restore
CLI приоритет--profile и --enable-additional-measures из командной строки приоритетнее соответствующих значений из config
--help/--versionРаботают без проверки наличия системных команд
Изолированное применение sysctlКаждый модуль применяет только собственный drop-in через sysctl -p; глобальный sysctl --system не используется
Runtime restore sysctlДо apply сохраняются live-значения каждого sysctl-модуля; при restore они возвращаются адресно через sysctl -w
Проверка auditd runtime--check сверяет rules.d, загруженные правила, watch-пути и ключи
Безопасный повторный apply/restoreСуществующие account audit и systemd unit архивируются и восстанавливаются
Код возвратаОтмена --apply и итоговые ERROR возвращают ненулевой код

securelinux-ng-sysctl.service является oneshot-unit и повторно применяет только сетевой drop-in после network-online.target. Это защищает настройки /proc/sys/net/* от сброса при позднем создании или поднятии интерфейсов. Состояние active (exited) для этого сервиса штатное.


Профили

ПрофильОписаниеТипичная среда
baselineВсе ФСТЭК 2.1–2.3, sysctl, GRUB, базовые сервисыСервер после dry-run и проверки совместимости нагрузки
strictbaseline + AppArmor, AIDE, auditd extendedСервер общего назначения
paranoidstrict + fail2ban, /tmp tmpfs, mount hardening, rkhunter, tcp_timestamps=0, usb_storage blacklistИзолированный сервер

Формулировку про «закрываются все 60» считать устаревшей: в текущей версии реализованы 59 из 60 позиций, а 15.1 kernel.modules_disabled=1 временно не применяется автоматически.

Подробная таблица совместимости: docs/compatibility.md


Покрытие ФСТЭК 25.12.2022

Для всех 40 пунктов разделов 2.1–2.6 реализовано техническое покрытие apply/check; часть мер имеет статус partial.

2.1. Настройка авторизации

ПунктМераПрофиль
2.1.1Блокировка УЗ с пустым паролем (/etc/shadow)все
2.1.2SSH: PermitRootLogin no (drop-in)все
2.1.2SSH: расширенный hardening (Ciphers, MACs, KexAlgorithms, LogLevel)все/strict
Дополнительная корпоративная мераPassword policy: PASS_MAX_DAYS=90/60/45, common-passwordpam_pwquality -> pam_pwhistory -> pam_unix; применяется только при ENABLE_CORPORATE_PASSWORD_POLICY=1baseline / strict / paranoid
Дополнительная корпоративная мераPAM faillock: блокировка УЗ при переборе паролей; применяется только при ENABLE_CORPORATE_PASSWORD_POLICY=1strict+

По умолчанию ENABLE_CORPORATE_PASSWORD_POLICY=0: данные меры не изменяют PAM, login.defs, chage и faillock.conf.

Для безопасного включения ограничения su скрипт использует существующих администраторов, уже входящих в sudo, admin или wheel. Явно заданный пробел-разделённый список WHEEL_USERS имеет приоритет. Если WHEEL_USERS пуст и запуск выполняется через sudo, администратор автоматически определяется по проверенному SUDO_USER. Затем root и выбранные администраторы добавляются в wheel, после чего активируется pam_wheel. Ошибка регистрируется только когда ни явный список, ни безопасное автоматическое определение недоступны.

2.2. Ограничение получения привилегий

ПунктМераПрофиль
2.2.1Ограничение su через pam_wheel.so use_uid + непустая группа wheel; администраторы задаются через WHEEL_USERS либо автоматически определяются по SUDO_USERвсе
2.2.2Sudo policy: %wheel ALL=(ALL:ALL) ALL, use_pty, logfile, timeoutвсе

2.3. Права доступа к объектам файловой системы

ПунктМераПрофиль
2.3.1chmod 644 /etc/passwd, /etc/group; chmod go-rwx /etc/shadow без изменения владельца и группывсе
2.3.2chmod go-w файлов запущенных процессов и их библиотеквсе
2.3.3chmod go-w файлов, выполняемых через cronвсе
2.3.4chmod go-w + chown root файлов, выполняемых через sudoвсе
2.3.5Права на .service и unit-файлы в /etc/systemd/systemвсе
2.3.6Права на /etc/crontab, /etc/cron.d, /etc/cron.*все
2.3.7Права на пользовательские файлы заданий cronвсе
2.3.8chmod go-w системных бинарей и библиотек (/bin, /lib, $PATH)все
2.3.9Аудит и исправление прав SUID/SGID приложенийвсе
2.3.10chmod go-rwx для .bash_history, .bashrc, .profile и др. в homeвсе
2.3.11chmod 700 для домашних директорий пользователейвсе

Требование ФСТЭК 2.3.1 для /etc/shadow реализуется буквально через chmod go-rwx: права группы и остальных удаляются без изменения владельца, группы и прав владельца. Исходные mode/uid/gid сохраняются в manifest и возвращаются при --restore.

2.4. Настройка механизмов защиты ядра

ПунктМераПрофиль
2.4.1kernel.dmesg_restrict=1все
2.4.2kernel.kptr_restrict=2все
2.4.3GRUB: init_on_alloc=1все
2.4.4GRUB: slab_nomergeвсе
2.4.5GRUB: iommu=force iommu.strict=1 iommu.passthrough=0все
2.4.6GRUB: randomize_kstack_offset=1все
2.4.7GRUB: mitigations=auto,nosmtвсе
2.4.8net.core.bpf_jit_harden=2все

2.5. Уменьшение периметра атаки ядра

ПунктМераПрофиль
2.5.1GRUB: vsyscall=noneвсе
2.5.2kernel.perf_event_paranoid=3все
2.5.3GRUB: debugfs=offвсе
2.5.4kernel.kexec_load_disabled=1все
2.5.5user.max_user_namespaces задаётся через USER_NAMESPACES_LIMIT или выбор администратора (0 / 10000 / skip)все
2.5.6kernel.unprivileged_bpf_disabled=1все
2.5.7vm.unprivileged_userfaultfd=0все
2.5.8dev.tty.ldisc_autoload=0все
2.5.9GRUB: tsx=offвсе
2.5.10vm.mmap_min_addr=4096все
2.5.11kernel.randomize_va_space=2все

2.6. Защита пользовательского пространства

ПунктМераПрофиль
2.6.1kernel.yama.ptrace_scope=3все
2.6.2fs.protected_symlinks=1все
2.6.3fs.protected_hardlinks=1все
2.6.4fs.protected_fifos=2все
2.6.5fs.protected_regular=2все
2.6.6fs.suid_dumpable=0все

Подробная карта соответствия: docs/fstec-mapping.md


Дополнительные меры

Обычный --apply применяет основной набор hardening и сохраняет ENABLE_ADDITIONAL_MEASURES=0.

Флаг --enable-additional-measures допустим только с --apply, имеет приоритет над config-файлом и включает 17 модулей:

  1. расширенное укрепление SSH;
  2. аудит учётных записей;
  3. AppArmor;
  4. AIDE;
  5. fail2ban;
  6. rkhunter;
  7. отключение опасных модулей ядра;
  8. укрепление параметров монтирования;
  9. защищённый /tmp как tmpfs;
  10. UFW;
  11. auditd и правила аудита;
  12. rsyslog;
  13. chrony;
  14. unattended-upgrades;
  15. отключение apport;
  16. ограничение core dump;
  17. дополнительные сетевые sysctl.

При таком запуске manifest содержит:

"additional_measures_enabled": true

При обычном запуске через sudo вручную заполнять WHEEL_USERS не требуется: скрипт проверяет и использует SUDO_USER. Явно заданный WHEEL_USERS применяется с приоритетом.

Меры из внутреннего стандарта организации и книги Чайка А.А. «Практическая безопасность Linux» (БХВ-Петербург, 2026) — не входят в разделы 2.x методдокумента ФСТЭК:

Пункт стандартаМераПрофиль
п.14.1–14.2auditd: baseline + extended rulesвсе/strict
п.8.4UFW: default deny incoming, allow SSHвсе
п.7.5Blacklist неиспользуемых модулей ядра (ФС и протоколы)все
п.4.6Account audit reportвсе
п.10.4/tmp tmpfs (nosuid,nodev,noexec)paranoid
п.10.4mount hardening: /dev/shm, /var/tmpparanoid
п.9.6fail2ban SSH jailparanoid
п.10.5AIDE integrity monitoringstrict+
п.10.1AppArmor enforce modestrict+
п.8.1-8.3Network sysctl: ip_forward, log_martians, rp_filter, redirects, tcp_syn_retriesвсе
п.7.6Отключение core dumps (limits.d + systemd/coredump.conf + kernel.core_pattern)все
п.7.7chmod 600 /boot/grub/grub.cfgвсе
п.9.3SSH: LogLevel VERBOSEвсе
п.9.4SSH: Banner /etc/issue.netstrict+
п.8.3net.ipv4.tcp_timestamps=0paranoid
п.10.5rkhunter: обнаружение руткитовparanoid
п.4.3pam_pwhistory: опциональная корпоративная мера, включаемая через ENABLE_CORPORATE_PASSWORD_POLICY=1по флагу
п.17.1Account audit: вывод активных systemd-службвсе
п.17.2Account audit: вывод открытых портов (ss -tlnp)все

Дополнительные меры из книги «Практическая безопасность Linux» (Чайка А.А., 2026):

Пункт стандартаМераПрофиль
net.ipv4.tcp_syncookies=1: защита от SYN-флудвсе
net.ipv4.icmp_echo_ignore_broadcasts=1: защита от Smurf-атаквсе
net.ipv4.icmp_ignore_bogus_error_responses=1: защита от поддельных ICMP-ошибоквсе
п.8.3net.ipv4.tcp_syn_retries=3: ограничение повторных SYNвсе
п.14.1auditd baseline: аудит bind/connect (k=network), /dev/bus/usb (k=usb_devices)все
usb_storage blacklist: блокировка USB-накопителей (дополнительная корпоративная мера)paranoid
kernel.modules_disabled=1: запрет загрузки модулей ядра (write-once) — временно не применяется автоматическиparanoid

Конфигурационный файл

Чтобы избежать интерактивных вопросов при --apply, используйте --config FILE.

ENABLE_ADDITIONAL_MEASURES=1 в config-файле также включает дополнительные меры. Явный флаг --enable-additional-measures имеет высший приоритет и не может быть выключен значением ENABLE_ADDITIONAL_MEASURES=0 из config-файла.

Без Docker/Podman/K8s:

PROFILE=strict
USER_NAMESPACES_LIMIT=0
UFW_EXTRA_RULES=15000/udp:Kaspersky

С Docker/Podman/K8s:

PROFILE=strict
ENABLE_CORPORATE_PASSWORD_POLICY=0
# Дополнительные меры внутреннего стандарта: auditd, UFW, AppArmor, AIDE и другие
ENABLE_ADDITIONAL_MEASURES=0
WHEEL_USERS=
USER_NAMESPACES_LIMIT=10000
UFW_EXTRA_RULES=15000/udp:Kaspersky

Готовые шаблоны: examples/config.baseline.conf, examples/config.strict.conf, examples/config.paranoid.conf


Важно перед применением

  • --restore удаляет только пакеты, впервые установленные модулем корпоративной парольной политики и записанные в manifest-поле installed_packages; пакеты дополнительных модулей (chrony, auditd, ufw, AppArmor и др.) автоматически не удаляются
  • Перед пакетными операциями скрипт ждёт фактического освобождения блокировок apt/dpkg; чужие процессы не завершаются. В интерактивном режиме статус обновляется каждые 30 секунд.
  • kernel.kexec_load_disabled=1 — необратимо до перезагрузки
  • GRUB params — вступают в силу только после перезагрузки
  • При restore восстанавливается /etc/default/grub и выполняется update-grub; функциональная конфигурация возвращается, но побайтовое совпадение с исходным /boot/grub/grub.cfg не гарантируется
  • AppArmor, AIDE, apport — не восстанавливаются автоматически, требуют ручных действий
  • restore 2.1.1: пустые поля пароля в /etc/shadowне восстанавливаются автоматически по соображениям безопасности
  • UFW: если firewall был активен до--apply, restore остаётся partial — исходные правила и состояние до применения не откатываются автоматически
  • UFW: если firewall неактивен, но содержит предварительно настроенные правила, автоматическое включение блокируется; ufw reset не выполняется
  • SSH-порт для UFW и fail2ban принимается только как число в диапазоне 1–65535; при некорректном значении используется проверенный fallback
  • unattended-upgrades в --check оценивается по факту включения автоматических обновлений (enabled), а не по постоянному active состоянию службы
  • Для профиля baseline AppArmor не является обязательной мерой: если он не активен, --check помечает это как SKIP, а не как RISKY
  • Password aging: применяется через chage только при ENABLE_CORPORATE_PASSWORD_POLICY=1. Заблокированные, пустые и служебные учётные записи исключаются. До изменения исходные поля aging сохраняются в manifest и восстанавливаются командой --restore. Для просроченных активных УЗ lastchg сдвигается на сегодня
  • user.max_user_namespaces — значение задаётся через USER_NAMESPACES_LIMIT или выбор администратора при apply; 0 может ломать Docker/Podman/K8s
  • Для kernel.perf_event_paranoid, kernel.unprivileged_bpf_disabled и vm.mmap_min_addr скрипт сохраняет уже установленное более строгое числовое значение
  • kernel.modules_disabled=1 — временно не применяется автоматически (несовместим с binfmt_misc и UFW при загрузке); запланирован в следующей версии; только paranoid

Подробно: docs/restore-model.md, docs/compatibility.md


Требования к запуску

  • --check, --report, --apply --dry-run рекомендуется выполнять через sudo для полного доступа к системным объектам
  • --apply, --restore — требуют root
  • ОС: Debian 12/13, Ubuntu 22.04/24.04
  • Зависимости: bash, python3, systemctl, sysctl, stat, awk, grep, uname, date, visudo

Архитектурные принципы

  1. Обратимость — каждое изменение фиксируется в JSON manifest. --restore восстанавливает из backup или удаляет созданные объекты.
  2. Проверяемость--check работает независимо от --apply, не изменяет систему, каждый модуль имеет отдельную check-функцию.
  3. Трассируемость — каждая мера привязана к пункту ФСТЭК в docs/fstec-mapping.md и в JSON report.
  4. Профильное ветвление — три профиля с явным profile_allows() без неявных зависимостей.
  5. Безопасность применения — preflight определяет среду и добавляет policy_gate/warning для compatibility-sensitive мер; окончательное решение остаётся за администратором.

Структура проекта

securelinux-ng.sh — основной скрипт
docs/
fstec-mapping.md — карта соответствия требованиям ФСТЭК
restore-model.md — модель отката
architecture.md — архитектура проекта
compatibility.md — совместимость и ограничения по средам
examples/
config.baseline.conf — шаблон конфига для baseline
config.strict.conf — шаблон конфига для strict
config.paranoid.conf — шаблон конфига для paranoid
tests/
syntax.sh — проверка синтаксиса
smoke.sh — полный smoke-набор
password-policy-regression.sh — регрессия парольной политики
backup-failure-regression.sh — блокировка изменений при ошибке backup
firewall-safety-regression.sh — безопасность UFW и определение SSH-порта
architecture-regression.sh — соответствие архитектурных схем коду
wheel-aging-regression.sh — регрессия wheel и restore aging
runtime-paths-regression.sh — права runtime-путей
fs-critical-regression.sh — права критических файлов
wheel-fstec-regression.sh — безопасная настройка wheel
additional-measures-optin-regression.sh — opt-in дополнительных мер
empty-password-restore-regression.sh — restore пустых паролей
password-package-restore-regression.sh — restore пакетов password policy
sysctl-stricter-values-regression.sh — сохранение строгих sysctl

Осознанные решения

Меры внутреннего стандарта, которые намеренно не реализованы автоматически:

Пункт стандартаПричина
4.6 — автоблокировка неиспользуемых УЗРиск блокировки служебных УЗ без ручного контроля. Отчёт формируется в account_audit.txt
9.5 — AllowUsers/AllowGroups SSHЗависит от инфраструктуры. Настраивается вручную согласно внутреннему стандарту
14.3 — хранение журналов ≥3 мес.Зависит от дискового пространства и инфраструктуры сбора логов
16.1–16.3 — защита учётных данных в файлахВыходит за рамки OS hardening. Реализуется на уровне приложений
ENCRYPT_METHODСкрипт больше не изменяет алгоритм хеширования паролей автоматически
4.4 — pam_faillockОпциональная корпоративная мера: применяется только при ENABLE_CORPORATE_PASSWORD_POLICY=1 и профиле strict/paranoid
9.4 — Banner /etc/issue.net только на strict+На baseline баннер не устанавливается. Осознанное отступление от Стандарта п. 9.4
10.4 — mount hardening /tmp, /var/tmp, /dev/shm только на paranoidНа baseline/strict не применяется: риск несовместимости с прикладным ПО. Осознанное отступление от Стандарта п. 10.4

Границы применения и соответствия

SecureLinux-NG реализует технические меры hardening уровня ОС, которые можно автоматически применить, проверить и, где это возможно, откатить.

Проект не заявляет автоматическое закрытие всех требований ФСТЭК целиком, потому что часть требований относится:

  • к организационным мерам;
  • к процессам администрирования и эксплуатации;
  • к внешней инфраструктуре и принятым в организации политикам;
  • к прикладным системам, журналированию, хранению данных и другим подсистемам вне уровня базового hardening ОС.

Поэтому в проекте используется модель статусов:

  • done — мера реализована и поддерживается текущей моделью apply/check/restore;
  • partial — мера реализована частично, требует reboot, ручных действий, отдельного обоснования или не имеет полного безопасного restore;
  • not_applicable — мера осознанно не автоматизируется в текущей реализации.

Таким образом, SecureLinux-NG следует рекомендациям ФСТЭК в пределах автоматически реализуемых мер ОС hardening, а полная оценка соответствия должна выполняться с учётом корпоративного регламента, архитектуры системы, состава сервисов и организационных процедур.

Источники

About

Bash-скрипт безопасной настройки Linux по ФСТЭК России (МД 25.12.2022). 59/60 мер, 3 профиля, JSON manifest, откат.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Packages

Contributors

Languages