Привет, Хабр! В данной статье хочу разобрать 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
  1. Постоянные правила аудита

Правила хранятся в /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

Просмотр и анализ логов

  1. Основные утилиты для работы с логами

  • ausearch — поиск по логам.

    sudo ausearch -k sudo_usage  # Фильтр по ключу
    sudo ausearch -m EXECVE      # Только выполненные команды
  • aureport — генерация отчетов.

sudo aureport --summary     # Общая статистика
sudo aureport -f            # Отчет по файлам
sudo aureport -u            # Отчет по пользователям
  1. Пример лога 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 для получения алертов

  1. Создаем Telegram-бота:

  2. Модифицируем скрипт:

    • Раскомментируем блок с requests.post() и подставляем свои TOKEN и chat_id.

  3. Пример алерта в 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.

Комментарии (7)


  1. MaxAkaAltmer
    08.07.2025 14:16

    А аудитору точно можно доверять?


  1. rare_an0maly
    08.07.2025 14:16

    Отличная публикация для молодых админов и сотрудников ИБ.


  1. Shaman_RSHU
    08.07.2025 14:16

    Главное не переборщить с политиками, иначе демон auditd будет сильно утилизировать CPU и iops


  1. Lx6g1ZG1
    08.07.2025 14:16

    Вместо python скрипта для парсинга, на мой взгляд, проще использовать скрипт на bash


    1. eternaladm Автор
      08.07.2025 14:16

      Спасибо за комментарий! Определенно, согласен с вами, это проще. Я вижу Питон более гибким, больше потенциальных доработок можно осуществить, поэтому выбор и пал на него.


      1. Lx6g1ZG1
        08.07.2025 14:16

        вижу Питон более гибким, больше потенциальных доработок можно осуществить

        Под «проще» я подразумевал, что возможностей bash, который есть везде, больше, чем нужно для подобной задачи, даже с учётом каких-то доработок.

        Python же несомненно обладает большими возможностями, но применим для задач другого уровня и типа.

        Каждый выбирает то, что ему кажется правильным. Это просто моё мнение


        1. eternaladm Автор
          08.07.2025 14:16

          Спасибо за комментарий!

          Каждый выбирает то, что ему кажется правильным

          Вы определенно правы, солидарен полностью!