- Добавлены три Mermaid-схемы: общий поток выполнения, карта модулей и поток
apply → manifest → restore. - Добавлен
tests/architecture-regression.sh, проверяющий соответствие схем фактическим потокам кода и manifest-модели.
- README дополнен отсутствовавшими regression-тестами.
- Из
docs/architecture.mdудалена устаревшая ссылка на неподдерживаемый параметрUFW_ALLOW_FROM_*. - Карта модулей разделяет основной набор, дополнительные меры и opt-in корпоративную парольную политику.
- Добавлен opt-in параметр
ENABLE_CORPORATE_PASSWORD_POLICY; по умолчанию значение равно0. - Добавлен
WHEEL_USERS— явный список существующих администраторов для включения ограниченияsu; при пустом значении администратор автоматически определяется по проверенномуSUDO_USER. - Manifest хранит добавленные членства в
added_group_memberships. - Manifest хранит исходные параметры aging в
password_aging_snapshots. - Добавлены тесты
tests/password-policy-regression.shиtests/wheel-aging-regression.sh. - Добавлен CLI-флаг
--enable-additional-measuresдля явного включения дополнительных мер при--apply; без флага значениеENABLE_ADDITIONAL_MEASURES=0и прежнее безопасное поведение сохраняются. - CLI-флаг имеет приоритет над
ENABLE_ADDITIONAL_MEASURES=0из config-файла и недопустим с режимами--check,--restoreи--report. - Флаг включает 17 модулей: расширенное укрепление SSH; аудит учётных записей; AppArmor; AIDE; fail2ban; rkhunter; отключение опасных модулей ядра; укрепление параметров монтирования; защищённый
/tmpкакtmpfs; UFW; auditd и правила аудита; rsyslog; chrony; unattended-upgrades; отключение apport; ограничение core dump; дополнительные сетевые sysctl. - Manifest дополнен полями
additional_measures_enabledиinstalled_packages; при запуске с новым CLI-флагом записываетсяadditional_measures_enabled=true. - Добавлены regression-тесты для runtime paths, критических файлов, wheel/FSTEC, opt-in дополнительных мер, empty-password restore, package restore, сохранения более строгих sysctl, отказов backup и безопасности UFW/SSH-порта.
- Корпоративная парольная политика не изменяет PAM,
login.defs,chageиfaillock.conf, пока явно не включена. - Перед настройкой
pam_pwqualityустанавливаются и проверяютсяlibpam-pwquality,cracklib-runtime,wamericanи словари Cracklib. - Из обработки
chageисключены заблокированные, пустые и служебные учётные записи. - Заблокированный root не получает конечный срок действия пароля.
- Удалено принудительное изменение
ENCRYPT_METHOD. pam_wheelактивируется только после проверки администраторов из явногоWHEEL_USERSлибо автоматически определённогоSUDO_USERи их добавления вwheel.- Пустая группа
wheelбольше не считается корректной конфигурацией. - Restore удаляет только добавленные текущим apply членства
wheel. - До
chageсохраняются исходные параметры aging; restore возвращает их черезchage. - Скрипт ждёт фактического освобождения блокировок
apt/dpkgи не завершает чужие процессы. - При отсутствии
fuserвладелец блокировки определяется черезlslocks. - Сохранён
DPkg::Lock::Timeout=300для защиты от гонки перед запускомapt-get. - Итоговые счётчики приведены к
done=39,partial=20,implemented=59. - Restore парольной политики удаляет только пакеты и зависимости, которых не было до apply и которые записаны в
installed_packages. - Исходное состояние
/etc/security/pwquality.confфиксируется до установки зависимостей; созданный пакетами файл корректно удаляется при restore. - Более строгие значения
kernel.perf_event_paranoid,kernel.unprivileged_bpf_disabledиvm.mmap_min_addrне понижаются. - Исправлены restore пустых паролей, обработка runtime-путей, критических файлов и безопасная конфигурация wheel.
- Поиск
pam_faillock.soдополнен поддержкой Debian/Ubuntu multiarch-каталогов, включая ARM64. - Исправлено поведение пустого
WHEEL_USERS: обычный запуск черезsudoавтоматически использует проверенногоSUDO_USER; ошибка остаётся только для случая, когда безопасно определить администратора невозможно. - Исправлены устаревшие счётчики и неверные ссылки на пункты внутреннего стандарта в документации.
- Удалены неподтверждённые утверждения об обосновании выбора
YESCRYPT. - Все изменения системных файлов после создания backup блокируются при ошибке
cp. - Неактивный UFW с предварительно настроенными правилами больше не сбрасывается и не включается автоматически.
- SSH-порт для UFW и fail2ban проверяется как число в диапазоне
1–65535.
- Полный цикл
apply → reboot → check → restoreпроверен на Debian 12. - Полный цикл
apply → reboot → check → restoreпроверен на Ubuntu Server 24.04.4. - На обеих ОС подтверждено точное восстановление aging и безопасный restore
wheel. - На Ubuntu подтверждено ожидание реальной блокировки
apt/dpkgв течение 399 секунд. - Проходят syntax, smoke, все одиннадцать regression-наборов и
git diff --check. - Полный цикл
apply → check → restore → rebootподтверждён на Ubuntu Server 24.04.4, Debian 12 и Ubuntu 24.04.4 Minimal. - Подтверждено удаление 6 новых пакетов на Ubuntu Server, 5 на Debian 12 и 9 на Ubuntu Minimal; ранее установленные пакеты не удаляются.
- На всех трёх системах write-once runtime sysctl вернулись к исходным значениям после reboot.
- На Ubuntu Minimal подтверждён функциональный restore GRUB: параметры SecureLinux удалены, повторная генерация стабильна; побайтовое совпадение generated
grub.cfgне гарантируется.
- Актуализированы README и документы архитектуры, совместимости, соответствия ФСТЭК и restore.
- Документированы
ENABLE_CORPORATE_PASSWORD_POLICY,WHEEL_USERS, ожиданиеapt/dpkgи manifest-снимки aging. - Синхронизированы
README.md, все документы вdocs/и три примера конфигурации с финальной реализацией v16.2.11.
tests/smoke.shтеперь задаёт полный системныйPATH, включая/usr/sbinи/sbin; smoke-тест корректно находитvisudoиsysctlпри запуске обычным пользователем на Debian 12.- Подтверждено baseline-тестирование после перезагрузки на Ubuntu Server 24.04.4 и Debian 12:
risky=0,warnings=0,errors=0.
- Модули sysctl
2.4,2.5,2.6и сетевой модуль применяют только собственные drop-in черезsysctl -p; устранены ложные ошибки из-за посторонних файлов в/etc/sysctl.d - systemd-unit
securelinux-ng-sysctl.serviceзапускает только/etc/sysctl.d/62-securelinux-ng-network.conf, а не глобальныйsysctl --system - restore sysctl-модулей больше не применяет все системные drop-in одновременно
- перед изменением sysctl сохраняются исходные runtime-значения модулей
kernel,attack-surface,userspaceиnetwork; при restore они адресно возвращаются черезsysctl -w auditdwatch-правила добавляются только для существующих путей; отсутствие/dev/bus/usbбольше не ломаетaugenrules --load--checkпроверяетaugenrules --check, загруженные runtime rules, обязательные ключи и существующие watch-пути- отсутствующие cron-файлы на системе без установленного cron классифицируются как
SKIP, а неRISKY - существующий
/var/log/securelinux-ng/account_audit.txtархивируется и корректно восстанавливается - существующий
securelinux-ng-sysctl.serviceархивируется вместе с исходным состоянием enabled/disabled/masked и корректно восстанавливается - runtime-значение
kernel.core_patternсохраняется в manifest и восстанавливается без глобальногоsysctl --system - отмена повторного
--applyвозвращает ненулевой код - завершение
--applyс элементами вERRORSвозвращает ненулевой код - исправлены итоговые счётчики:
done=41,partial=18,implemented=59;kernel.kexec_load_disabled=1классифицирован как partial, поскольку значение write-once не откатывается без перезагрузки
- Ubuntu 24.04 minimal, профиль
baseline:apply,check,restore— без ошибок - Проверено отсутствие
sysctl --systemв исходном коде - Проверено сохранение существующих account audit и systemd unit по хэшу и состоянию unit
- Проверено применение auditd на системе без
/dev/bus/usb - Обновлены smoke-тесты для новых проверок и точных итоговых счётчиков
- На Ubuntu 24.04 minimal проверено восстановление четырёх runtime sysctl-значений после полного цикла
apply→restore
- Обновлены
architecture.md,compatibility.md,fstec-mapping.mdиrestore-model.md - Исправлены примеры
UFW_EXTRA_RULESв трёх config-файлах - Уточнены ограничения restore для пустых паролей,
kernel.kexec_load_disabledи установленных пакетов - Добавлено техническое обоснование
securelinux-ng-sysctl.service, состоянияactive (exited)и повторного применения сетевых sysctl послеnetwork-online.target
- A1:
manifest_initбольше не вызываетdieпосле подтверждения повторного--apply— существующий manifest архивируется - A2:
backup_file_checked()— 16 backup-операций теперь проверяют успехcpперед перезаписью конфига - A3: запись
/etc/shadowатомарная (temp + fsync +os.replace)
- B1:
flock-защита от параллельного--apply/--restore(acquire_run_lock) - B2: все
record_manifest_*переведены на атомарную запись JSON (temp +os.replace) - B3:
sysctl --systemвызывается всегда после restore sysctl dropin-файлов
- C1:
sysctl_network_check_moduleпроверяетtcp_syn_retries=3 - C2: GRUB
python3 -cзаменён на heredoc - C3: уточнён edge case в
normalize_common_password_stack - C4:
apply_user_cron_permissions_moduleпроверяет права передchmod - C5:
check_cron_command_paths_moduleполучилEXCLUDED_PARENTS - C6:
apt_update_onceставит флаг только при успехе
- D1:
--profileиз CLI всегда приоритетнее config - D2: дедуплицирован dry-run в
apply_empty_passwords_module - D3: убраны дублирующие вызовы в
main() - D4: унифицирован IFS tab
- D5:
--help/--versionработают без проверки системных команд
SYSCTL_NETWORK_CONTENT: добавленnet.ipv4.tcp_syn_retries = 3, все профили (Стандарт безопасной настройки п. 8.3)apply_auditd_module: в auditd baseline rules добавлены правила аудита сетевых вызововbind/connect(k=network, arch b64/b32) и наблюдение за/dev/bus/usb(k=usb_devices) — Стандарт безопасной настройки п. 11.1
-
apply_sysctl_kernel_module,apply_sysctl_attack_surface_module,apply_sysctl_network_module: запись drop-in больше не считается успешной при сбоеsysctl --system; теперь фиксируетсяERRORи warning в manifest -
check_apparmor_module: дляbaselineнеактивный AppArmor больше не помечается какRISKY; выводится какSKIP, поскольку мера не обязательна для профиля -
check_unattended_upgrades_module: проверка переведена сsystemctl is-activeнаsystemctl is-enabled; для этого модуля оценивается включение автоматических обновлений, а не постоянный runtime-статус -
restore_rkhunter_module: предупреждение заменено на информационное сообщение; отсутствие автоматического удаления пакета больше не считается warning restore -
restore_empty_passwords_module: восстановление пустых полей пароля в/etc/shadowзапрещено по соображениям безопасности; restore теперь явно оставляет backup и сообщает об ограничении -
restore_ufw_module: для сценария с заранее активным UFW зафиксирован partial restore; существующие правила и исходное состояние firewall не откатываются автоматически -
run_restore_mode: разрешение manifest выполняется до fallback-логикиSTATE_DIR, чтобы restore не пытался искать manifest в подменённом каталоге -
check_apport_module/apply_apport_module: убрана неверная привязкаapportк ФСТЭК 2.6.6;apportтеперь отражается как дополнительная мера отключения crash-reporting -
sysctl_attack_surface_check_module: проверкаuser.max_user_namespacesбольше не уходит вSKIPтолько из-за отсутствияUSER_NAMESPACES_LIMITв конфиге; после интерактивного apply учитывается фактическое live-значение0/10000 -
apply_grub_kernel_params_module:chmod 600дляgrub.cfgприменяется на всех профилях, в соответствии с внутренним стандартом -
check_apparmor_module: наbaselineактивный AppArmor больше не засчитывается как обязательныйOKпункта профиля; выводится как не требуемый профилем -
restore_apparmor_module,restore_aide_module,restore_apport_module: убраны лишниеWARNна профилях/сценариях, где модуль не применялся
-
README.md: оформлено осознанное отступление по/etc/shadow = 640 root:shadowвместо буквального600из ФСТЭК 2.3.1 / внутреннего стандарта -
ФСТЭК 2.5.2/2.5.6/2.6.1:
perf_event_paranoid,unprivileged_bpf_disabled,ptrace_scopeтеперь применяются для всех профилей включая baseline (ранее требовался strict+) -
USER_NAMESPACES_LIMIT: передаётся в check-модуль через argv вместо env — проверка namespaces теперь работает корректно
-
Интерактивные prompt: добавлена проверка TTY и timeout 60с — скрипт не зависает в неинтерактивном окружении (ansible/CI)
-
SSH hardening check: проверяет значения параметров, а не только их наличие
-
UFW: убран hardcoded порт 15000/udp Kaspersky — заменён на конфигурируемый
UFW_EXTRA_RULES -
coredump: добавлен
kernel.core_pattern=|/bin/falseчерез sysctl dropin -
pam_wheel: regex принимает аргументы
use_uidиgroup=wheelв любом порядке -
grep -Fv: исправлен unescaped dot в grep для user.max_user_namespaces
-
check_password_policy_module: убрана зависимость от DRY_RUN — aging проверяется всегда
-
sshd -t: подавлен вывод в apply_ssh_root_login_module
-
read /dev/tty: manifest overwrite prompt читает из /dev/tty
-
import sys: убран дубль в sysctl_network_check_module
-
Broken systemd symlinks: silent skip в apply_systemd_unit_one
-
Manifest overwrite prompt: принимает y и yes
-
Debian 13: протестировано baseline/strict/paranoid — errors=0
-
Интерактивный prompt user.max_user_namespaces: убран timeout — ждёт ввод администратора бесконечно
-
Broken systemd symlinks: вывод перенесён в debug log вместо SKIP
-
Manifest overwrite prompt: принимает y и yes
apply_ssh_root_login_module: добавлен rollback файла при провалеsshd -tapply_password_policy_module: ошибка merge pwquality.conf теперь ERROR+return — partial-apply невозможенrestore_account_audit_module: согласован с apply — удаляет файл через manifest если трекалсяwrite_report: исправлены устаревшие fstec_items (2.5.3 debugfs, 2.5.5 user_namespaces, account_audit/17.1/17.2)apply_mount_hardening_module: убран двойнойmanifest_has_backup_forдля fstabcheck_password_policy_module: проверка minlen теперь сверяет конкретное значение по профилю
run_apply_mode: добавлен guard — при наличии существующего manifest запрашивается явное подтверждение перед перезаписьюapply_*: повторный--applyбез--restoreбольше не перезаписывает оригинальные backup — добавлена функцияmanifest_has_backup_forи проверка передcpдля всех системных файлов (fstab, pwquality.conf, common-password, login.defs, faillock.conf, pam su, GRUB)
apply_mount_hardening_module:/var/tmpзаменён сbindна отдельныйtmpfs; устранено зависание при shutdown на Ubuntu 24.04apply_password_policy_module: ошибка установкиlibpam-pwqualityтеперь выдаётERRORи прерывает модуль — PAM стек больше не ломаетсяrestore_faillock_module: добавлен тихий пропуск если модуль не применялся — устранён ложный warning на baseline- Исправлен мусорный комментарий у
_APT_UPDATED account_audit: добавленыrecord_manifest_created_file/record_manifest_modified_fileдля файла отчётаapply_mount_hardening_module,apply_tmp_tmpfs_module: временные файлы/tmp/_sl_*.pyзаменены на inlinepython3 -heredocapply_password_policy_module: добавлена проверка кода возврата mergepwquality.confsysctl_attack_surface_check_module:user.max_user_namespacesпроверяется только если заданUSER_NAMESPACES_LIMIT; при пустом значении выдаётсяskippedвместоriskyrun_check_mode: добавлена обработкаINFO-строк отsysctl_attack_surface_check_modulerestore_sysctl_network_module: добавленыsystemctl disableиdaemon-reloadдляsecurelinux-ng-sysctl.serviceapply_ssh_hardening_module: при ошибкеsshd -tвосстанавливается backup вместо простогоrm -fcheck_ssh_hardening_module: расширен список проверяемых параметров; дляstrict+добавлена проверка криптографических параметровnormalize_common_password_stack: существующая строкаpam_pwquality.soзаменяется на эталонную сretry=3restore_ufw_module: сохраняется и восстанавливается состояниеnftables(active/enabled) черезapply_reportв manifest
net.ipv4.tcp_syncookies = 1— защита от SYN-флуд; добавлен вSYSCTL_NETWORK_CONTENT, все профили (Чайка А.А. «Практическая безопасность Linux», гл. 15)net.ipv4.icmp_echo_ignore_broadcasts = 1— защита от Smurf-атак; добавлен вSYSCTL_NETWORK_CONTENT, все профилиnet.ipv4.icmp_ignore_bogus_error_responses = 1— защита от поддельных ICMP-ошибок; добавлен вSYSCTL_NETWORK_CONTENT, все профили (CIS/KSPP)usb_storageblacklist — блокировка USB-накопителей добавлена вKERNEL_MODULE_BLACKLIST; только профильparanoid; добавляется сadd_warning(корпоративная политика)kernel.modules_disabled=1— новый модульapply/check/restore_modules_disabled_module(); только профильparanoid; write-once параметр ядра; dropin63-securelinux-ng-modules-disabled.conf; фиксируется какirreversible_changeв manifest
-
pam_faillock: применение и проверка ограничены профилямиstrict/paranoid; baseline больше не требуетfaillock.conf; параметры приведены к корпоративному стандарту:deny=5,unlock_time=900 -
GRUB 2.5.3: параметр
debugfsпереведён сdebugfs=no-mountнаdebugfs=off; apply-логика теперь заменяет уже существующее значение того же ключа вGRUB_CMDLINE_LINUX_DEFAULT, а не только добавляет отсутствующие параметры -
Password policy: после обновления
/etc/login.defsпараметры aging теперь применяются к существующим локальным учётным записям черезchage(root + UID>=UID_MIN, кромеnologin/false) -
common-password: добавлена нормализация порядкаpam_pwquality -> pam_pwhistory -> pam_unix; устранён сценарий некорректной вставкиpam_pwhistory -
check_password_policy_module(): проверка приведена в соответствие apply-логике — проверяются точные значенияPASS_MAX_DAYS/PASS_MIN_DAYS/PASS_WARN_AGE, порядок PAM-стека и факт примененияchage -
README.md: описание меры 2.1 уточнено — отраженыchageдля существующих УЗ и порядокcommon-password -
apply_empty_passwords_module(): устранена лишняя перезапись/etc/shadowи ложная запись в manifest/report при отсутствии УЗ с пустым паролем -
apply_pam_wheel_module(): добавлена проверка успешностиgroupadd wheel; manifest/report больше не фиксируют создание группы при ошибке -
password policy: устранено расхождение
check/applyдля профиляparanoid;PASS_MAX_DAYSсинхронизирован как 45 дней -
check_password_policy_module(): проверка aging переведена с locale-зависимогоchage -lна числовые поля/etc/shadow(min/max/warn), устранено ложное срабатывание на системах с неанглийской локалью -
check_password_policy_module(): при запуске без root проверка aging больше не падает на/etc/shadow, а помечается как неполная (warning) -
check_password_policy_module(): уточнено итоговое сообщение для non-root режима — теперь явно отражается неполная проверка, а не отсутствие локальных УЗ -
apply_password_policy_existing_accounts(): для уже просроченных существующих УЗ добавлен bootstrap-режим —lastchgсдвигается на текущую дату перед применением нового aging, чтобы не вызывать принудительную смену пароля и lockout при первом входе -
README.md: добавлено предупреждение о password aging для существующих локальных УЗ, историческом риске немедленной экспирации в старых версиях и bootstrap-поведении текущей версии
-
restore: для
fail2ban,rkhunter,mount hardeningи/tmp tmpfsдобавлен тихий пропуск, если модуль не применялся в исходном apply/manifest -
paranoid restore: устранено двойное восстановление
/etc/fstab, если одновременно применялисьmount hardeningи/tmp tmpfs -
apply_apparmor_module(): предупреждение уточнено — скрипт не заявляет автоматический перевод уже существующих профилей в enforce; оставлена только ручная командаaa-enforce -
run_restore_mode(): профиль для restore-report теперь берётся из manifest, чтобы послеstrict/paranoidrestore не показывал ложныйbaseline -
write_report(): дляpassword_policyуточнён тип restore — файловый откат не восстанавливает runtime-state, уже применённый черезchage -
load_config(): добавлена обработка ключаUSER_NAMESPACES_LIMIT— ранее попадал в*→ warning «Неизвестный ключ»; значение не устанавливалось; интерактивный вопрос задавался даже при наличии ключа в конфиге -
restore_empty_passwords_module: исправлена необъявленная переменная$empty_users_file→$backup(два места) -
restore_empty_passwords_module: исправлены буквальные LF внутри строкового литерала Python в heredoc (shadow.write_text("\n".join(...))) -
wait_for_dpkg_lock(): ожидание lock вынесено в отдельную функцию; проверяетlock-frontendиlock; вызывается перед каждымapt-get installчерез-o DPkg::Lock::Timeout=300; устраняет race condition при postinst предыдущего пакета -
apply_modules_disabled_module: убран немедленныйsysctl -w kernel.modules_disabled=1— параметр применяется только через dropin при следующей загрузке; немедленное применение ломало UFW/iptables при boot (emergency mode) -
check_modules_disabled_module: проверяет наличие dropin-файла вместо live-значения sysctl — значение вступает в силу только после reboot -
sysctl_network_check_module: добавлены три пропущенных параметра в проверку —tcp_syncookies,icmp_echo_ignore_broadcasts,icmp_ignore_bogus_error_responses; несоответствие apply (15 параметров) и check (12 параметров) устранено -
Комментарий
# Version:в заголовке скрипта обновлён до 16.2.3 -
FSTEC_DONE_ITEMSобновлён с 37 до 42 (dry-run вывод) -
apply_modules_disabled_moduleперемещён в конецrun_apply_mode— dropin больше не активируется при промежуточных вызовахsysctl --system -
apply_mount_hardening_module: backup fstab переименован сfstab.mount.bakнаfstab.bak;apply_tmp_tmpfs_moduleпропускает backup если mount_hardening уже сохранил его в этом сеансе — устранён конфликт двойной записи fstab -
apply_modules_disabled_module: временно отключён —kernel.modules_disabled=1через dropin в/etc/sysctl.d/применяется при каждомsysctl --systemи блокирует загрузку модулейbinfmt_misc/xt_*(UFW), что приводит к emergency mode при загрузке; требует реализации механизма предварительной загрузки модулей -
print_report_stdout: меткифстэк: применено полностью/частичнозаменены настатус done/partial— старые метки были семантически некорректны
load_config(): выполнение прерывается (die) при некорректном config-файле вместо продолженияapply_sudo_command_paths_module(2.3.4): добавленchown root:root— соответствие READMEapply_runtime_paths_module(2.3.2) иapply_sudo_command_paths_module(2.3.4):parent_go_wриск теперь выводит[WARN]с указанием каталога вместо молчаливого пропускаimplemented_itemsв отчёте: исключены записи со статусомnot_applicableиз счётчика реализованных позиций (было 60, стало 59)run_report_mode: добавлено предупреждение что режим--reportне выполняет проверку системыtests/smoke.sh: исправлены устаревшие ожидания (фстэк: всего мер: 52→позиций: 60,фстэк: применено частично:→статус partial)docs/compatibility.md: исправлены формулировки preflight —policy_gateдобавляет запись в отчёт, автоматического запрета мер нетdocs/architecture.md: то же — уточнена модель preflightREADME.md:2.3.1 /etc/shadow— исправлено наchmod 640 root:shadow(соответствие коду); добавлены пропущенные зависимостиuname,date,visudo
pam_pwhistory: запрет повторного использования паролей (/etc/pam.d/common-password) — Стандарт 4.3; remember=5/10/24 по профилям baseline/strict/paranoidaccount audit: добавлен вывод активных systemd-служб (17.1) и открытых портов (17.2) вaccount_audit.txt
restore_empty_passwords_module: restore больше не перезаписывает текущие пароли пользователей — восстанавливается только пустое поле для УЗ у которых оно было при applyapply_empty_passwords_module: вместо полного backup/etc/shadow(хэши паролей) сохраняется только список имён пользователей с пустым паролем (empty-password-users-TIMESTAMP.txt, chmod 600)restore_auditd_module: extended rules пропускаются при restore если не применялись (профиль baseline) — устранён spurious warningrestore_empty_passwords_module: файл со списком пользователей удаляется после restorerestore_auditd_module: исправленAttributeError: 'str' object has no attribute 'get'при проверкеcreated_files
- Стандарт 4.6 (автоблокировка неиспользуемых УЗ) — не реализуется автоматически: риск блокировки служебных УЗ; отчёт для ручного контроля формируется в
account_audit.txt - Стандарт 9.5 (AllowUsers/AllowGroups SSH) — зависит от инфраструктуры; настраивается вручную согласно внутреннему стандарту организации
- Стандарт 14.3 (хранение журналов ≥3 мес.) — зависит от дискового пространства и инфраструктуры; настраивается вручную
- Стандарт 16.1–16.3 (защита учётных данных в файлах) — выходит за рамки OS hardening; реализуется на уровне приложений
ENCRYPT_METHOD=YESCRYPTвместоSHA512(Приложение А Стандарта) — осознанное решение проекта
user.max_user_namespacesprompt: невалидный ввод теперь повторяет запрос вместо молчаливого skip; добавлен явныйcase 3для пропускаgrub_kernel_params_check_module: добавлены пропущенные параметрыvsyscall=none(ФСТЭК 2.5.1),debugfs=no-mount(2.5.3),tsx=off(2.5.9); для strict/paranoid добавлена проверкаapparmor=1 security=apparmor; модуль принимает профиль как аргументcheck_systemd_unit_one/apply_systemd_unit_one: удалён дублирующийсяreturn 0(мёртвый код)apply_pam_wheel_module: удалён избыточныйifпослеdie(мёртвый код)apply_sysctl_network_module: исправлен отступ блока создания systemd unittests/smoke.sh: добавленrun_unprivileged()— root-guard проверки корректно работают при запуске тестов от root
resolve_restore_manifest: добавлен fallback наmanifest.jsonеслиmanifest-*.jsonне найденrestore_systemd_unit_targets_module: восстановление только файлов из manifest (было: сканирование всей системы → 114 spurious warnings → 9)restore_metadata_from_stat_snapshot: ложные[WARN]при отсутствии снапшота и при попытке парсить backup содержимого как metadata понижены до[i]- Вывод
фстэк: всего мер→позиций: N (40 пунктов ФСТЭК 25.12.2022 + N дополнительных мер)— счётчик теперь берётся изFSTEC_TOTAL_ITEMS
apply_ufw_module: обязательное правило15000/udp Kaspersky— все профилиexamples/config.*.conf: закомментированные примеры правил UFW для сетей (UFW_ALLOW_FROM_1/2)
sysctl --systemRC временно игнорируется для dropin-модулей (на тот момент для устранения ложных[ERROR]при reapply, напримерptrace_scope=3); в более поздних версиях логика частично пересмотрена- Двойной
--force-confoldво всех 10 вызовахapt-get installустранён pwquality.conf: перезапись заменена на merge — параметры дополнительной корпоративной политики применяются поверх существующей конфигурацииfaillock.conf: перезапись заменена на merge — параметры дополнительной корпоративной политики применяются поверх существующей конфигурации- AIDE: инициализация базы данных пропускается если
/var/lib/aide/aide.dbуже существует - AppArmor: если пакет уже установлен — профили не изменяются, только проверяется статус enforce;
[WARN]с требованием дополнительной политики проекта - fail2ban:
jail.localне перезаписывается если файл уже существует;[WARN]с требованием дополнительной политики проекта - UFW:
--force resetне выполняется если ufw уже активен; проверяется политика default incoming —[ERROR]если неdeny - Предупреждение о нехватке RAM вынесено в отдельную функцию
check_memory_requirements(), вызывается вrun_apply_modeдо начала работы
apply_sysctl_network_module/check_sysctl_network_module/restore_sysctl_network_module: сетевые sysctl (п.8.1-8.3) —ip_forward=0,ipv6.forwarding=0,log_martians=1,rp_filter=1,accept_redirects=0,send_redirects=0— все профилиapply_coredump_module/check_coredump_module/restore_coredump_module: полное отключение core dumps (п.7.6) —limits.d/99-securelinux-ng-coredump.conf+systemd/coredump.conf.d/99-securelinux-ng.conf— все профилиapply_rkhunter_module/check_rkhunter_module/restore_rkhunter_module: установка rkhunter (п.10.5) — paranoid- sudo policy (п.5.2): добавлены
Defaults use_pty,logfile=/var/log/sudo.log,timestamp_timeout=5,passwd_tries=3,secure_path— все профили - SSH baseline: добавлен
LogLevel VERBOSE(п.9.3) — все профили - SSH strict+: добавлен
Banner /etc/issue.net(п.9.4) - GRUB strict+: добавлены
apparmor=1 security=apparmor(п.7.3) - GRUB strict+:
chmod 600 grub.cfgпосле update-grub (п.7.7) - Network sysctl paranoid: добавлен
tcp_timestamps=0(п.8.3)
- Внутренний стандарт безопасной настройки (пп. 5.2, 7.3, 7.6, 7.7, 8.1-8.3, 9.3, 9.4, 10.5)
- Чайка А.А. «Практическая безопасность Linux», БХВ-Петербург 2026
partiallabel: уточнена формулировка — откат требует reboot или ручных действий (не «применено частично»)- Выравнивание тегов вывода
[i],[?],[WARN],[FAIL]до 8 символов для единообразия с[OK],[RISKY],[SKIP],[ERROR] aide --init: добавлен--config /etc/aide/aide.confдля корректной работы на Ubuntu 24.04apply_empty_passwords_module: убран постороннийprint(changed)выводивший0в stdout- Убрано безусловное
[SKIP] framework в активной разработкеиз preflight apply_mount_hardening_module,apply_tmp_tmpfs_module: замененыpython3 -cheredoc на temp-файл для устранения SyntaxError на Ubuntu 24.04
- Лог-сообщения перед каждым
apt-get installдля индикации прогресса - Секция «Конфигурационный файл» в README с примерами
--configиUSER_NAMESPACES_LIMIT - Таблица покрытия ФСТЭК (done/partial) в README
- Ссылка на методдокумент ФСТЭК 25.12.2022 в README
apply_apport_module/check_apport_module/restore_apport_module: отключение apport (ФСТЭК 2.6.6 — конфликт сfs.suid_dumpable=0)user.max_user_namespaces=0в61-securelinux-ng-attack-surface.conf(ФСТЭК 2.5.5); пропускается с WARNING при наличии Docker/Podman/K8s
- GRUB hardening (
apply_grub_kernel_params_module) теперь применяется на всех профилях включая baseline (ФСТЭК 2.4.3–2.4.7 не имеет ограничений по профилю) check_aide_module: profile gate strict — baseline не получает risky за отсутствие AIDEcheck_fail2ban_module: profile gate paranoid — baseline/strict не получают riskycheck_mount_hardening_module: profile gate paranoidcheck_tmp_tmpfs_module: profile gate paranoidsysctl_attack_surface_check_module: profile-aware — baseline не проверяетperf_event_paranoid,unprivileged_bpf_disabledsysctl_userspace_protection_check_module: profile-aware — baseline не проверяетptrace_scoperun_restore_mode: добавлены вызовыrestore_rsyslog_module,restore_chrony_module,restore_unattended_upgrades_module,restore_apport_moduleSYSCTL_USERSPACE_PROTECTION_DROPIN: переименован с62-на99-для переопределения/usr/lib/sysctl.d/99-protect-links.conf- Runtime paths check: исключены системные директории
/var/log,/tmp,/run,/dev/shmиз проверкиparent_go_w check_systemd_unit_one/apply_systemd_unit_one: отсутствующие symlink targets →skippedвместоrisky- Подавлен вывод сообщений
symlink skipped (target managed by package)в 2.3.5
add_safe/add_risky/add_warning/add_error/add_skipped: немедленный вывод в терминал в реальном времениprint_report_stdout: вывод risky/warnings/errors в конце отчётаSCRIPT_VERSION: 16.1.0 → 16.1.2
check_aide_module: profile gate strictcheck_fail2ban_module: profile gate paranoidcheck_mount_hardening_module: profile gate paranoidcheck_tmp_tmpfs_module: profile gate paranoidrun_restore_mode: добавлены rsyslog/chrony/unattended_upgradessysctl_attack_surface_check_module: profile-aware (perf/bpf skip on baseline)sysctl_userspace_protection_check_module: profile-aware (ptrace skip on baseline)
set -Eeuo pipefail→set -uo pipefail: убран-e, устранены аварийные выходы по RC≠0 от systemctl/grepapply_ufw_module:systemctl is-active/is-enabled nftables— заменено наif..thenвместо&&/||apply_systemd_unit_one/check_systemd_unit_one: пропуск симлинков (-L), устранены 98 ложных ошибок 2.3.5- dry-run:
fstec_done: 0/fstec_partial: 51→ используютFSTEC_DONE_ITEMS/FSTEC_PARTIAL_ITEMS - dry-run: FileNotFoundError при чтении несуществующего report — убран python3-блок
- login.defs: разорванный f-string в embedded Python → заменено на heredoc
- Без аргументов:
die→usage; exit 0
- Модули
apply_rsyslog_module,apply_chrony_module,apply_unattended_upgrades_module— baseline (соответствие v15) - Установка
libpam-pwqualitycracklib-runtimeвapply_password_policy_module FSTEC_DONE_ITEMS=33,FSTEC_PARTIAL_ITEMS=18— константы для dry-run вывода
apply_aide_module: профиль без изменений (strict+)apply_fail2ban_module: профиль без изменений (paranoid)
- framework skeleton in
securelinux-ng.sh - config examples in
examples/ - basic
syntaxandsmoketests - expanded
docs/architecture.md - strict initial
docs/fstec-mapping.md - first real hardening module
2.1.2: disable SSH root login via/etc/ssh/sshd_config.d/60-securelinux-ng-root-login.conf --checkand--applycoverage for SSH root login enforcementsshd -tvalidation after apply2.2.1: restrictsuviapam_wheel.so use_uid group=wheel- group
wheelcreation during apply if absent - managed block insertion into
/etc/pam.d/su 2.3.1: check/apply owner, group and mode for/etc/passwd,/etc/group,/etc/shadow2.2.2: add managed sudo policy drop-in/etc/sudoers.d/60-securelinux-ng-policywithvisudovalidation2.3.3: add initial cron ownership/perms module for standard cron targets (later reclassified to2.3.6)2.3.5: add initial systemd unit/drop-in ownership/perms module for/etc/systemd/system- add basic restore flow for managed SSH/PAM/sudo files and created group
wheel - add
--manifest FILEsupport for restore - extend restore to
2.3.1,2.3.5and cron-target permissions module (later reclassified from2.3.3to2.3.6) using metadata snapshots - fix
record_manifest_backupcall in systemd permissions module - switch metadata restore snapshots to machine-readable
MODE/UID/GIDformat with fallback for legacy snapshots - add writable fallback
STATE_DIRfor non-rootcheck/report/restoreruns - add
fstec_itemsandfstec_summaryto generated report output - extend smoke test with
--restore --manifestpath - add smoke assertions for FSTEC summary in stdout
2.3.2: add runtime executable/library permissions scan with policy-gated detect-only apply2.3.4: add sudo command paths permissions scan with policy-gated detect-only apply2.4.1,2.4.2,2.4.8: add base kernel sysctl hardening module with restore support- suppress non-root sysctl stderr noise in kernel sysctl check module
2.4.3..2.4.7: add audit/detect-only GRUB kernel params module based on/proc/cmdline2.5.2,2.5.4,2.5.6,2.5.7,2.5.8,2.5.10,2.5.11: add attack-surface sysctl module with restore support2.6.1..2.6.6: add userspace-protection sysctl module with restore support2.5.1,2.5.3,2.5.9: extend GRUB audit module for remaining attack-surface boot params2.1.1: add empty-password account detection and lock module based on/etc/shadow- handle non-root
/etc/shadowaccess gracefully in2.1.1without Python traceback - add centralized execution-context guard: non-dry-run apply and restore now require root
2.3.10,2.3.11: add home files and home directories permissions module with metadata restore2.3.7: add user cron files permissions module with metadata restore2.3.8: add standard system paths permissions audit module (detect-only apply)2.3.9: add SUID/SGID audit module (detect-only apply)- reclassify cron config targets module from
2.3.3to2.3.6in mapping/report 2.3.3: add detect-only audit module for command paths referenced from system cron configs- fix broken embedded Python quoting in
2.3.8standard system paths audit module - isolate smoke-test scans from host
/proc,/home, user-cron, standard-system-path and suid/sgid trees via test-only environment overrides - align
tests/smoke.shwith enforced root-guard: non-root restore is now checked as a denial path, not executed as a success path
- normalize explicit
add_policy_gate(...)markers across remaining detect-only/policy-gated modules, not only2.3.2and2.3.3 - add
restore_policy_gated_detect_onlytofstec_summaryand stdout summary, so detect-only modules are counted explicitly in report output - record explicit policy-gate entries in code for detect-only modules
2.3.2and2.3.3, instead of relying only on warnings/skipped markers - add missing
--manifestmention to theCLI frameworkrow indocs/fstec-mapping.md - document
--manifest FILEindocs/architecture.mdas a supported framework-level option for explicit restore input - align remaining
2.3.7,2.3.10,2.3.11restore wording with machine-readable metadata snapshots inREADME.mdanddocs/fstec-mapping.md - ignore local state and research worktrees in
.gitignoreto keepgit statusclean during iterative development - clarify
2.3.6documentation wording for machine-readable metadata snapshots and cron-target reclassification history - align
docs/fstec-mapping.mdwording with machine-readable metadata snapshots and the later2.3.3→2.3.6cron reclassification - align per-module support bullets in
README.mdwith actual restore coverage for SSH/PAM/sudo and metadata-based permission modules - document actual restore coverage in
README.mdanddocs/restore-model.mdfor metadata-based modules and managed sysctl drop-ins - fix unset shell variable in
2.3.2dry-run summary output - dry-run summary output without reading a non-existent report file
- smoke test now uses a local writable state directory