
Модульный Bash-инструментарий, который укрепляет системы Debian/Ubuntu для соревнований CyberPatriot, автоматизируя защиту учётных записей, межсетевого экрана, SSH, PAM и служб с ведением журналов и резервным копированием.
Модульный Bash-инструментарий для укрепления систем семейства Debian/Ubuntu в условиях соревновательного цейтнота. Создан и отточен за несколько сезонов CyberPatriot National Youth Cyber Defense Competition, последнее достижение — Platinum tier в дивизионе Linux на полуфинале 2025 года.
Это не универсальный фреймворк соответствия требованиям. Это автоматизатор чек-листа для шестичасового упражнения на время: он выполняет скриптуемую большую часть прохода по укреплению Linux правильно, быстро и идемпотентно, логирует всё, к чему прикасался, и оставляет решения, требующие суждения, человеку, который его запускает.
Раунды Linux в CyberPatriot оценивают живой образ по рубрике, которая вознаграждает довольно предсказуемый набор шагов по укреплению — гигиена учётных записей, политика паролей, настройка межсетевого экрана, экспозиция служб, права доступа к файлам, уровень патчей — в условиях жёсткого лимита времени, обычно без предварительного уведомления о том, какие именно уязвимости были заложены. Выполнение этого чек-листа вручную, правильно, под обратный отсчёт — это то место, где команды теряют лёгкие баллы из-за опечаток и забытых шагов, а не из-за незнакомого материала.
Этот инструментарий начинался как единый монолитный скрипт, написанный именно под таким давлением. Этот репозиторий — переписывание того скрипта: то же покрытие чек-листа, переструктурированное в небольшие модули с единственным назначением, которые легче читать, тестировать и осмысливать независимо, при этом каждое неочевидное решение привязано к конкретному разделу CIS Benchmark или контролю NIST SP 800-53 (см. Средства контроля безопасности и ссылки).
flowchart TD
A[bin/harden.sh] --> B[lib/common.sh<br/>logging, backups, run wrapper]
A --> C[Service-role prompts<br/>or --config file]
A --> D[lib/packages.sh<br/>updates, attack-tool removal]
A --> E[lib/firewall.sh<br/>default-deny + ufw]
A --> F[lib/ssh.sh]
A --> G[lib/services.sh<br/>samba/ftp/mail/http/mysql/dns]
A --> H[lib/users.sh<br/>account review, hidden UID 0]
A --> I[lib/kernel.sh<br/>sysctl hardening]
A --> J[lib/pam.sh<br/>password policy, lockout]
A --> K[lib/filesystem.sh<br/>permissions, cron, banners]
A --> L[lib/monitoring.sh<br/>fail2ban, auditd, rkhunter]
A --> M[lib/forensics.sh<br/>baseline snapshot]
D & E & F & G & H & I & J & K & L & M --> N[(~/hardening-run/<br/>log + backups + baseline)]Каждый модуль подключается через bin/harden.sh, который отвечает за разбор аргументов, опрос о роли служб и порядок выполнения. Модули не вызывают друг друга напрямую, и каждая команда, изменяющая состояние, в каждом модуле проходит через обёртку run() в lib/common.sh, что даёт всему проекту единое место для реализации поддержки dry-run, согласованного логирования и обработки некритичных ошибок.
git clone <this-repo>
cd cyberpatriot-linux-hardening
sudo ./bin/harden.sh
Вам будет задана короткая серия вопросов да/нет о роли машины (нужны ли ей Samba, FTP, SSH, веб-сервер и так далее), после чего он отработает без вмешательства по перечисленным выше модулям. Лог, полный набор резервных копий конфигураций с отметками времени и снимок базового состояния системы записываются в ~/hardening-run/.
В реальном раунде пропустите запросы подтверждения для каждого пакета и отвечайте на вопросы о роли из подготовленного файла ответов вместо ввода вживую:
cp examples/config.env.example my-machine.env
# edit my-machine.env for this box's actual role
sudo ./bin/harden.sh --config my-machine.env --auto-approve
Хотите увидеть точно, что он сделает, прежде чем он к чему-либо прикоснётся?
sudo ./bin/harden.sh --dry-run --config my-machine.env
| Модуль | Делает |
|---|---|
lib/packages.sh | Полное обновление системы; автоматически удаляет взломщики паролей и инструменты эксплуатации; проверяет инструменты двойного назначения (nmap, Wireshark, netcat) и устаревшие службы (VNC, NFS, telnet) перед их удалением |
lib/firewall.sh | Запрет входящих по умолчанию / разрешение исходящих по умолчанию через ufw, плюс явная блокировка известного распространённого порта бэкдора |
lib/ssh.sh | Современные шифры/KEX/MAC, запрет входа root, ограничения соединений и сессий — или полное удаление SSH, если роль в нём не нуждается |
lib/services.sh | Samba, FTP, почта, печать, MySQL, HTTP, DNS: каждая устанавливается и минимально укрепляется, если нужна роли, или удаляется и отсекается межсетевым экраном, если нет |
lib/users.sh | Интерактивный обзор существующих учётных записей (права администратора, удаление, сброс пароля), обнаружение скрытых учётных записей с UID 0 и пустых паролей |
lib/kernel.sh | Настройки sysctl для сетевого стека и самозащиты ядра (маршрутизация от источника, ICMP-редиректы, ASLR, область ptrace, ограничение dmesg/kptr) |
lib/pam.sh | Сложность и история паролей через pam_pwquality/pam_pwhistory, блокировка учётной записи через pam_faillock, срок действия пароля в login.defs |
lib/filesystem.sh | Права доступа к ключевым файлам, ограничение cron/at, минимальный rc.local, юридические баннеры входа, сканирование только для чтения по SUID/доступным на запись всем/бесхозным файлам |
lib/monitoring.sh | fail2ban и auditd по умолчанию; ClamAV и полное сканирование rkhunter/chkrootkit — по желанию (см. Заметки о безопасности на соревнованиях) |
lib/forensics.sh | Снимок только для чтения пользователей, процессов, слушающих портов и установленных пакетов для последующего сравнения |
tools/find-port-owner.sh и tools/list-nonstandard-users.sh — небольшие автономные утилиты для такой же работы по сортировке, используемые независимо от основного скрипта — см. их заголовки для использования.
Скрипт укрепления, который ломает машину, которую должен защищать, хуже бесполезен в раунде на время. Несколько значений по умолчанию отражают это, и их стоит понять, прежде чем запускать это без присмотра:
SSH_PASSWORD_AUTH=no), но значение по умолчанию здесь отдаёт предпочтение тому, чтобы не запереть команду вне её собственной машины, когда никто ещё не подготовил ключи.INSTALL_CLAMAV, RUN_BASELINE_SCAN), потому что это две самые медленные вещи, которые может делать этот скрипт, и ни одна из них сама по себе не изменяет состояние системы. Включите их, если ваш чек-лист этого требует или у вас есть время в запасе.~/hardening-run/baseline/listening_ports.txt из предыдущего запуска, если вы не уверены, что на самом деле слушается, прежде чем впервые укреплять машину.docs/security-controls.md для ручной процедуры.bin/harden.sh интерактивно спросит о роли служб машины, если вы не ответите заранее. Чтобы пропустить запросы, скопируйте examples/config.env.example, заполните фактическую роль и передайте его с --config. Любая переменная, которую вы опустите в файле, откатывается к интерактивному запросу, так что частично заполненный файл конфигурации подойдёт.
sudo ./bin/harden.sh --config my-machine.env
Флаги:
| Флаг | Эффект |
|---|---|
--config FILE | Загрузить ответы о роли/политике из env-файла |
--dry-run | Логировать каждое действие, которое было бы предпринято; ничего не менять |
--auto-approve | Пропустить запросы подтверждения удаления для каждого пакета |
.
├── bin/harden.sh orchestrator: parses args, asks role questions, runs modules in order
├── lib/
│ ├── common.sh logging, backups, idempotent file edits, the run() wrapper
│ ├── packages.sh updates, attack-tool removal
│ ├── ssh.sh SSH install/removal and hardening
│ ├── services.sh samba/ftp/telnet/mail/printing/mysql/http/dns
│ ├── firewall.sh ufw default-deny posture
│ ├── users.sh account review, hidden UID 0 / empty password detection
│ ├── kernel.sh sysctl hardening
│ ├── pam.sh password policy, account lockout
│ ├── filesystem.sh permissions, cron, rc.local, banners, anomaly scan
│ ├── monitoring.sh fail2ban, auditd, rkhunter, chkrootkit, ClamAV
│ └── forensics.sh read-only system baseline snapshot
├── tools/
│ ├── find-port-owner.sh resolve a listening TCP port to a process path
│ └── list-nonstandard-users.sh flag UID >= 1000 accounts not on an expected list
├── docs/
│ ├── security-controls.md every hardening decision, mapped to its source standard
│ └── editor-cheatsheet.md small editor commands worth remembering under pressure
├── examples/config.env.example annotated template for non-interactive runs
└── .github/workflows/shellcheck.yml lint on every push/PR
Каждый скрипт проверяется линтером ShellCheck при push через GitHub Actions (.github/workflows/shellcheck.yml). Чтобы проверить локально перед открытием PR:
shellcheck lib/*.sh bin/*.sh tools/*.sh
bin/harden.sh --dry-run также сам по себе является тестом: он прогоняет поток управления и логирование каждого модуля, не касаясь файловой системы и ничего не устанавливая, и это самый быстрый способ проверить изменение на одноразовой виртуальной машине, прежде чем запускать его по-настоящему. См. CONTRIBUTING.md для полных ожиданий по новым модулям (идемпотентность, направление деструктивных действий через run() и указание источника для любого нового шага укрепления).
Заголовочный комментарий каждого модуля и docs/security-controls.md цитируют конкретный раздел стандарта, лежащий в основе каждого решения. Основные источники, используемые повсюду:
| Стандарт | Источник |
|---|---|
| CIS Ubuntu Linux Benchmark | https://www.cisecurity.org/benchmark/ubuntu_linux |
| NIST SP 800-53 Rev. 5 | https://csrc.nist.gov/pubs/sp/800/53/r5/upd1/final |
| DISA STIG for Ubuntu | https://public.cyber.mil/stigs/downloads/ |
| Mozilla OpenSSH modern configuration guidelines | https://infosec.mozilla.org/guidelines/openssh |
| CyberPatriot National Youth Cyber Defense Competition | https://www.uscyberpatriot.org/ |
Упомянутые инструменты обнаружения (не встроены, устанавливаются через apt):
fail2ban,
Linux Audit / auditd,
rkhunter,
chkrootkit. Lynis
и OpenSCAP рекомендуются как последующий,
независимый аудит и не запускаются автоматически этим проектом.
См. docs/security-controls.md для полного обоснования каждого из этих пунктов.
MIT. См. LICENSE.