← Назад в блог

Программирование и скриптинг для кибербезопасности: часть 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 …) — выполняет всю операцию бэкапа одной строкой. Предполагается, что целевая директория уже существует и что у выполняющего аккаунта достаточно прав.
  • Проверка кода завершения ($?) — читает код возврата 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-минутный звонок