Введение: почему мониторинг действий — это must-have
Сервер без должного аудита напоминает крепость с открытыми воротами: вы не узнаете, кто внутри и что происходит. Стандартные логи часто недостаточно детализированы, особенно когда нужно отследить каждое действие пользователя — от запуска команд до изменения критичных файлов. В этом материале разберем встроенный в Linux инструмент auditd, который обеспечивает глубинный контроль, и дополним его автоматизированной системой уведомлений на Python.
Что можно отслеживать с помощью auditd:
sudo (кто, когда и какую команду выполнил)Установка и базовая настройка auditd
Перед началом работы убедитесь, что auditd установлен:
# Для Debian/Ubuntu:
sudo apt install auditd -y
# Для CentOS/RHEL:
sudo yum install audit
Активируем службу и добавляем в автозагрузку:
sudo systemctl enable --now auditd
sudo systemctl status auditd # Проверяем, что служба работает
Основы управления правилами аудита
Правила можно добавлять временно (до перезагрузки) или постоянно. Для просмотра текущих правил используется:
sudo auditctl -l
Пример временного правила для мониторинга доступа к /etc/passwd:
sudo auditctl -w /etc/passwd -p rwa -k sensitive_access
Здесь:
-w — путь к файлу или директории-p — типы операций: read, write, execute, attribute change-k — метка для удобства фильтрации логовПостоянные правила и их конфигурация
Постоянные правила прописываются в /etc/audit/rules.d/audit.rules. Пример конфигурации:
# Мониторинг изменений в /etc/passwd и /etc/shadow
-w /etc/passwd -p wa -k etc_change
-w /etc/shadow -p wa -k shadow_access
# Аудит всех команд, запущенных через sudo
-w /usr/bin/sudo -p x -k sudo_log
# Фиксация операций удаления файлов
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -k file_deletion
# Мониторинг запуска shell-интерпретаторов
-w /bin/bash -p x -k shell_cmd
-w /bin/zsh -p x -k shell_cmd
Применяем правила командой:
sudo auditctl -R /etc/audit/rules.d/audit.rules
Анализ логов: ключевые утилиты
Логи сохраняются в /var/log/audit/audit.log. Для работы с ними полезны:
ausearch — поиск по записям:
sudo ausearch -k sudo_log # Фильтр по метке
sudo ausearch -m EXECVE # Только исполнение команд
aureport — генерация отчетов:
sudo aureport --summary # Общая статистика событий
sudo aureport -f -i Детальный отчет по файловым операциям
Пример записи в логе и её структура:
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_log"
Здесь uid=0 означает выполнение от root, а key="sudo_log" указывает на правило, которое сработало.
Автоматизация аудита: Python-скрипт для анализа и алертов
Предлагаем готовое решение для парсинга логов и отправки уведомлений. Создайте файл audit_monitor.py:
#!/usr/bin/env python3
import subprocess
import re
from datetime import datetime
ALERT_RULES = {
"sudo_log": "Обнаружено использование sudo: {details}",
"shadow_access": "Зафиксирован доступ к /etc/shadow: {details}",
"file_deletion": "Выполнено удаление файла: {details}",
}
def analyze_audit_log():
alerts = []
for rule_key, alert_text in ALERT_RULES.items():
log_data = subprocess.getoutput(f"ausearch -k {rule_key} --raw | aureport -i -f")
for entry in log_data.split('\n'):
if not entry.strip():
continue
time_match = re.search(r"msg=audit\((\d+\.\d+)", entry)
user_match = re.search(r"auid=(\d+)", entry)
if time_match and user_match:
timestamp = datetime.fromtimestamp(float(time_match.group(1)))
user_id = f"UID {user_match.group(1)}"
alert_details = f"{timestamp} | {user_id} | {entry}"
alerts.append(alert_text.format(details=alert_details))
return alerts
if __name__ == "__main__":
detected_events = analyze_audit_log()
if detected_events:
print("\n".join(detected_events))
# Для отправки в Telegram раскомментируйте блок ниже
# import requests
# bot_token = "YOUR_BOT_TOKEN"
# chat_id = "YOUR_CHAT_ID"
# requests.post(f"https://api.telegram.org/bot{bot_token}/sendMessage", json={"chat_id": chat_id, "text": "\n".join(detected_events)})
else:
print("Подозрительных событий не найдено.")
Тестирование:
chmod +x audit_monitor.py
sudo cat /etc/shadow # Тестовое событие
./audit_monitor.py
Интеграция с Telegram и автоматические проверки
echo "*/5 * * * * /path/to/audit_monitor.py >> /var/log/audit_monitor.log" | sudo tee -a /etc/crontab
Возможные улучшения системы
-w /etc/ssh/sshd_config -p wa -k ssh_changes
Заключение
Предложенное решение позволяет не только детально аудитить систему, но и оперативно реагировать на инциденты. Это особенно актуально для выполнения compliance-требований и расследования инцидентов. Если у вас есть опыт использования auditd или идеи по доработке скрипта — делитесь в комментариях.
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()