
Привет, Хабр! В данной статье хочу разобрать 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. Я запустил свою группу в Телеграмм, буду рад видеть всех, кому интересен процесс написания скриптов и автоматизация в мире IT.
Комментарии (10)
 - Shaman_RSHU08.07.2025 14:16- Главное не переборщить с политиками, иначе демон auditd будет сильно утилизировать CPU и iops 
 - Lx6g1ZG108.07.2025 14:16- Вместо python скрипта для парсинга, на мой взгляд, проще использовать скрипт на bash  - eternaladm Автор08.07.2025 14:16- Спасибо за комментарий! Определенно, согласен с вами, это проще. Я вижу Питон более гибким, больше потенциальных доработок можно осуществить, поэтому выбор и пал на него.  - Lx6g1ZG108.07.2025 14:16- вижу Питон более гибким, больше потенциальных доработок можно осуществить - Под «проще» я подразумевал, что возможностей bash, который есть везде, больше, чем нужно для подобной задачи, даже с учётом каких-то доработок. - Python же несомненно обладает большими возможностями, но применим для задач другого уровня и типа. - Каждый выбирает то, что ему кажется правильным. Это просто моё мнение  - eternaladm Автор08.07.2025 14:16- Спасибо за комментарий! - Каждый выбирает то, что ему кажется правильным - Вы определенно правы, солидарен полностью! 
  - tomrayt08.07.2025 14:16- Я сейчас свой личный сервер ковыряю, в начале пути. Выбираю какой нибудь инструмент который бы изучил и создавал на нём скрипты автоматизации, например по определённым событиям в логах, делал перезапуск демона и тд. Не могли бы вы объяснить по подробнее на счёт питона и его применения и bash? Буду очень признателен!  - eternaladm Автор08.07.2025 14:16- Спасибо за комментарий! Направьте, пожалуйста, Ваш телеграм в личные сообщения, постараюсь помочь! 
 
 
 
 
 - AVX08.07.2025 14:16- Кажется, изобрели SIEM ) - Можно же настроить отправку событий auditd в syslog, а в syslog настроить отправку логов на удалённый сервер. Либо другой вариант - прямо в плагине audisp настроить отправку, но это будет не совсем стандартный формат (отличается от того, что шлёт syslog). 
 
           
 
MaxAkaAltmer
А аудитору точно можно доверять?