Программирование и скриптинг для кибербезопасности: часть 1 - аудит bash-скриптов для бэкапов
- Опубликовано
- • 4 мин чтения•--- просмотров
Введение
Когда security-команде нужно быстро что-то автоматизировать, Bash остаётся надёжным союзником. Этот урок открывает серию Программирование и скриптинг для кибербезопасности двумя короткими скриптами для бэкапов от вымышленной компании Dharma. Анализируя базовый скрипт и его улучшенную версию, мы разберём строительные блоки shell-автоматизации, выявим слабые места и наметим конкретные улучшения, которые делают повседневную работу безопаснее.
Цели обучения
- Распознавать ключевые элементы, из которых состоит bash-скрипт (shebang, команды, переменные, коды завершения, условия).
- Объяснять, почему скриптинг - подходящее решение для лёгких, повторяющихся административных задач.
- Сравнивать минимальный скрипт с харденной версией и описывать, как каждое улучшение повышает надёжность или безопасность.
- Предлагать следующие шаги для развития скриптов до production-уровня автоматизации.
Сценарий: автоматизация защитных мер в Dharma
Инфраструктурная группа Dharma внедряет автоматизацию процессов. Младших аналитиков просят проаудировать существующие скрипты перед их изменением, чтобы убедиться, что они понимают каждую инструкцию, защищающую критичные данные. Команда начинает с простой операции копирования, которая запускается в нерабочее время. Дальше они итерируют, добавляя защитные механизмы, не жертвуя гибкостью, которую даёт Bash.
Скрипт 1 - устанавливаем базовую версию
Первый скрипт намеренно лаконичен. Он повторяет то, что многие команды планируют через cron на ранних этапах автоматизации.
#!/bin/bash
# Copy file "usuarios" to specified path (create backup)
cp /home/dharma/usuarios.txt /home/dharma/backup/
# If exit code of last command is 0 (which means success), print notification message
if [ $? -eq 0 ]; then
echo "Backup completed successfully."
fi
Как работает скрипт
Shebang #!/bin/bash фиксирует интерпретатор, поэтому скрипт ведёт себя одинаково, даже если его вызвали из другого шелла. Строка с cp выполняет весь бэкап одной операцией, а значит предполагает, что целевая директория уже существует и что у аккаунта хватает прав туда писать. Проверка $? читает код возврата: ноль означает, что копирование прошло, любое другое значение - что нет, и подтверждение выводится только в первом случае.
Почему Bash подходит для этой задачи
Для такой узкой задачи Bash - прагматичный выбор:
- Скрипт легко деплоить, версионировать и изменять без перекомпиляции.
- Интеграция с cron тривиальна; вывод логов можно перенаправить в централизованный мониторинг.
- Зависимостей минимум - аналитики Dharma могут итерировать сразу, попутно накапливая опыт shell-скриптинга внутри компании.
Скрипт 2 - поднимаем планку
После того как базовая версия показала свою ценность, Dharma инвестировала в более безопасный вариант, который учитывает уроки из production-инцидентов.
#!/bin/bash
SOURCE_FILE="some/path/to/file.txt"
DESTINATION="/home/dharma/backup"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
TARGET_FILE="${DESTINATION}/users_backup_${TIMESTAMP}.txt"
mkdir -p "$DESTINATION"
cp "$SOURCE_FILE" "$TARGET_FILE" 2> /dev/stderr
if [ $? -eq 0 ]; then
echo "Backup completed successfully: $TARGET_FILE"
else
echo "Backup failed" >&2
fi
Что улучшилось?
Явные переменные (SOURCE_FILE, DESTINATION) делают скрипт самодокументируемым и позволяют перенацелить его на другое окружение одной правкой. TIMESTAMP не даёт каждому запуску затирать предыдущий бэкап, и только благодаря этому историческая проверка вообще возможна. mkdir -p подготавливает целевую директорию, если её нет, поэтому первый запуск проходит, а не падает на пути, который никто не создал. А перенаправление ошибок cp в stderr оставляет сообщения об ошибках мониторингу, а сообщения об успехе - в stdout.
Возможности для дальнейшего харденинга
Даже у этого улучшенного скрипта есть простор для лучших практик, которые стоит учитывать каждому инженеру, думающему о безопасности:
- Замени ручную проверку
$?наif cp "$SOURCE_FILE" "$TARGET_FILE"; then … fi, чтобы ветка успеха была привязана прямо к копированию, а при ошибке скрипт выходил сразу. - Добавь механизм ротации (
findс-mtimeилиlogrotate), чтобы файлы бэкапов перестали занимать место без ограничений. - Введи lock-файл или используй
flock, чтобы пересекающиеся запуски не повредили результат. - Генерируй SHA-256 хеши для архивных копий и храни их в защищённом от подмены месте, тогда несанкционированные изменения становятся заметны.
- Синхронизируй бэкап хотя бы с одной дополнительной системой, а лучше с несколькими провайдерами в разных юрисдикциях, чтобы пережить локальную катастрофу.
Ключевые выводы
- Базовые возможности Bash - shebang, коды завершения и условия - образуют основу автоматизации, и их нужно освоить, прежде чем браться за более сложные воркфлоу.
- Понятные имена переменных и защитное создание директорий сильно повышают читаемость и устойчивость скрипта.
- Простые улучшения вроде разделения логов, политик ротации и механизмов взаимного исключения дают непропорционально большую пользу для операционной стабильности.
- Скриптинг перестаёт быть быстрым хаком, как только к нему подходят продуманно. Тогда он становится надёжным слоем в инструментарии кибербезопасности.
Вооружившись этим анализом, новые участники команды автоматизации Dharma смогут рассуждать о существующих скриптах, сообщать о рисках и планировать постепенные улучшения. Следующая часть серии будет опираться на эти основы и добавит логирование, разбор аргументов и более сложные проверки безопасности.
Открыт для работы по контракту
Я доступен для работы по контракту. Если у вас есть интересная идея проекта, запишитесь на звонок через Calendly.
Записаться на 30-минутный звонок