
Привет, Хабр! В данной статье хочу разобрать 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.
Комментарии (7)
Shaman_RSHU
08.07.2025 14:16Главное не переборщить с политиками, иначе демон auditd будет сильно утилизировать CPU и iops
Lx6g1ZG1
08.07.2025 14:16Вместо python скрипта для парсинга, на мой взгляд, проще использовать скрипт на bash
eternaladm Автор
08.07.2025 14:16Спасибо за комментарий! Определенно, согласен с вами, это проще. Я вижу Питон более гибким, больше потенциальных доработок можно осуществить, поэтому выбор и пал на него.
Lx6g1ZG1
08.07.2025 14:16вижу Питон более гибким, больше потенциальных доработок можно осуществить
Под «проще» я подразумевал, что возможностей bash, который есть везде, больше, чем нужно для подобной задачи, даже с учётом каких-то доработок.
Python же несомненно обладает большими возможностями, но применим для задач другого уровня и типа.
Каждый выбирает то, что ему кажется правильным. Это просто моё мнение
eternaladm Автор
08.07.2025 14:16Спасибо за комментарий!
Каждый выбирает то, что ему кажется правильным
Вы определенно правы, солидарен полностью!
MaxAkaAltmer
А аудитору точно можно доверять?