
Привет, Хабр! В данной статье хочу разобрать auditd - полезный инструмент аудита в Linux, который записывает каждое действие, а скрипт превратит логи в читаемые отчёты и алерты.
Linux-сервер без мониторинга активности пользователей — как дом с открытыми окнами. Проблемы, которые помогает решить auditd:
Несанкционированный доступ (кто и когда использовал, например,
sudo)Подозрительные команды (
rm -rf, изменение прав, доступ к каким-либо файлам)Расследование инцидентов (кто что натыкал перед падением сервера)
Соответствие корпоративным стандартам (возможно, ИБ требует логирования действий или вы любите контроль)
Решение: auditd + Python-скрипт для анализа и алертов.
Настройка auditd
Установка и включение auditd
Проверяем, установлен ли
auditd:
sudo apt install auditd -y # Если Debian/Ubuntu sudo yum install audit # Если CentOS
Запускаем и добавляем в автозагрузку:
sudo systemctl enable --now auditd sudo systemctl status auditd # Проверяем статус
Основные команды auditctl:
Просмотр текущих установленных правил:
sudo auditctl -lДобавление временного правила (исчезнет после рестарта):
sudo auditctl -w /etc/passwd -p rwa -k sensitive_filesГде:
-w- путь к файлу/директории.-p- права (r — чтение, w — запись, x — выполнение, a — изменение атрибутов).-k- ключ (метка для фильтрации логов).
Удаление всех правил:
sudo auditctl -D
Постоянные правила аудита
Правила хранятся в /etc/audit/rules.d/audit.rules. Пример конфига:
# Мониторинг изменений в /etc/passwd и /etc/shadow -w /etc/passwd -p wa -k passwd_changes -w /etc/shadow -p wa -k shadow_changes # Логирование всех команд, запущенных через sudo -w /usr/bin/sudo -p x -k sudo_usage # Логирование удаления файлов -a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -k file_deletion # Логирование всех запущенных shell-команд (bash, zsh, sh) -w /bin/bash -p x -k shell_commands -w /bin/zsh -p x -k shell_commands -w /bin/sh -p x -k shell_commands # Логирование изменений в системных файлах -w /etc/ -p wa -k etc_changes
Применяем правила:
sudo auditctl -R /etc/audit/rules.d/audit.rules
Просмотр и анализ логов
Основные утилиты для работы с логами
ausearch— поиск по логам.sudo ausearch -k sudo_usage # Фильтр по ключу sudo ausearch -m EXECVE # Только выполненные командыaureport— генерация отчетов.
sudo aureport --summary # Общая статистика sudo aureport -f # Отчет по файлам sudo aureport -u # Отчет по пользователям
Пример лога auditd
Стандартная запись в /var/log/audit/audit.log:
type=SYSCALL msg=audit(1620000000.123:456): arch=c000003e syscall=59 success=yes exit=0 a0=123 a1=456 a2=789 a3=0 items=2 ppid=1234 pid=5678 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 comm="sudo" exe="/usr/bin/sudo" key="sudo_usage"
Разбор:
uid=0— команда выполнена от root.comm="sudo"— запущена командаsudo.key="sudo_usage"— метка правила.
Python-скрипт для анализа и алертов
Скрипт для парсинга логов
Создаем
audit_monitor.py:
#!/usr/bin/env python3 import subprocess import re from datetime import datetime # Конфигурация ALERT_RULES = { "sudo_usage": "Использование sudo: {details}", "shadow_changes": "Доступ к /etc/shadow: {details}", "file_deletion": "Удаление файлов: {details}", } def parse_audit_log(): alerts = [] for key, message in ALERT_RULES.items(): # Поиск лога по ключу cmd = f"ausearch -k {key} --raw | aureport -i -f" logs = subprocess.getoutput(cmd).split('\n') for line in logs: if not line: continue # Парсинг строки лога time_match = re.search(r"msg=audit\((\d+\.\d+)", line) user_match = re.search(r"auid=(\d+)", line) cmd_match = re.search(r'exe="([^"]+)"', line) if time_match and user_match: timestamp = datetime.fromtimestamp(float(time_match.group(1))) user = f"UID {user_match.group(1)}" details = f"{timestamp} | {user} | {line}" alerts.append(message.format(details=details)) return alerts if __name__ == "__main__": alerts = parse_audit_log() if alerts: print("\n".join(alerts)) # Отправка в Telegram (раскомментировать) # import requests # requests.post("https://api.telegram.org/botTOKEN/sendMessage", json={"chat_id": "ID", "text": "\n".join(alerts)}) else: print("Подозрительных событий не обнаружено.")
Пример использования:
Тестим триггер:
sudo cat /etc/shadowЗапускаем скрипт:
chmod +x audit_monitor.py ./audit_monitor.pyПример вывода:
Доступ к /etc/shadow: 2023-05-01 12:00:00 | UID 1000 | type=SYSCALL ... exe="/usr/bin/cat"Добавление в cron для проверки каждые 5 минут:
(crontab -l ; echo "*/5 * * * * /path/to/audit_monitor.py >> /var/log/audit_monitor.log") | crontab -
Интеграция с Telegram для получения алертов
Создаем Telegram-бота:
Модифицируем скрипт:
Раскомментируем блок с
requests.post()и подставляем своиTOKENиchat_id.
Пример алерта в Telegram:
!!! Использование sudo: 2023-05-01 12:05:00 | UID 1000 | exe="/usr/bin/rm"
Заключение
В статье была описана настройка auditd для мониторинга критичных действий, описан скрипт для анализа логов и, потенциально рассмотрена возможность добавления алертов в Telegram. Какое применение данного инструмента (и есть ли оно?) необходимо Вам - решит каждый для себя. Буду рад увидеть комментарии о практической значимости данного способа, обсудить.
Потенциальные доработки описанного решения:
Добавить фильтрацию по времени (действия после 24:00 = подозрительно)
Включить мониторинг подключений по ssh (
-w /etc/ssh/sshd_config)
P.S. В моей группе в Телеграмм разбираем практические кейсы: скрипты (Python/Bash/PowerShell), тонкости ОС и инструменты для эффективной работы.
