← Назад в блог

Программирование и скриптинг для кибербезопасности: часть 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-минутный звонок