- Home »

Как мониторить логи аутентификации в Ubuntu
Каждый день наши сервера подвергаются тысячам попыток взлома. И если вы думаете, что ваш скромный VPS где-то в глубинах интернета никому не интересен — вы жестоко ошибаетесь. Боты сканируют IP-адреса 24/7, пытаясь подобрать пароли к SSH, брутфорсят аутентификацию и ищут слабые места в конфигурации. Именно поэтому мониторинг логов аутентификации — это не просто хорошая практика, а жизненная необходимость для любого сисадмина.
В этой статье мы разберём, как настроить эффективный мониторинг логов аутентификации в Ubuntu, автоматизировать процесс обнаружения подозрительной активности и настроить уведомления о потенциальных угрозах. Покажу реальные примеры атак, поделюсь готовыми скриптами и расскажу о тонкостях настройки системы логирования.
Архитектура системы логирования в Ubuntu
Прежде чем нырнуть в настройку мониторинга, важно понимать, как работает система логирования в Ubuntu. За это отвечает systemd-journald в связке с rsyslog. Логи аутентификации по умолчанию попадают в несколько мест:
- /var/log/auth.log — основной лог аутентификации
- /var/log/syslog — системный лог (включает события аутентификации)
- systemd journal — бинарные логи, доступные через journalctl
- /var/log/secure — в некоторых дистрибутивах (чаще в CentOS/RHEL)
Основная магия происходит в /var/log/auth.log
. Здесь фиксируются все попытки входа через SSH, sudo, su, login и другие механизмы аутентификации. Формат записей стандартизирован и легко парсится скриптами.
Базовый мониторинг: изучаем логи руками
Начнём с простого — научимся читать логи аутентификации и понимать, что происходит на сервере прямо сейчас.
# Смотрим последние записи аутентификации
sudo tail -f /var/log/auth.log
# Фильтруем только SSH-подключения
sudo grep "sshd" /var/log/auth.log | tail -20
# Ищем неудачные попытки входа
sudo grep "Failed password" /var/log/auth.log
# Успешные подключения
sudo grep "Accepted" /var/log/auth.log
# Подозрительная активность за последний час
sudo grep "$(date --date='1 hour ago' '+%b %d %H')" /var/log/auth.log | grep -E "(Failed|Invalid)"
Вот пример того, что вы увидите в логах при атаке:
Dec 15 14:23:45 server sshd[12345]: Failed password for invalid user admin from 192.168.1.100 port 54321 ssh2
Dec 15 14:23:47 server sshd[12346]: Failed password for invalid user root from 192.168.1.100 port 54322 ssh2
Dec 15 14:23:49 server sshd[12347]: Failed password for invalid user test from 192.168.1.100 port 54323 ssh2
Это классический брутфорс — один IP пытается подобрать пароли к разным пользователям. Такие паттерны легко автоматизировать для обнаружения.
Настройка автоматического мониторинга
Ручной мониторинг — это хорошо для разовых проверок, но для продакшена нужна автоматизация. Создадим скрипт, который будет анализировать логи и отправлять уведомления.
#!/bin/bash
# /usr/local/bin/auth_monitor.sh
LOG_FILE="/var/log/auth.log"
THRESHOLD=5 # Порог неудачных попыток
TIME_WINDOW=300 # Временное окно в секундах (5 минут)
ALERT_EMAIL="admin@example.com"
# Функция для отправки уведомлений
send_alert() {
local message="$1"
echo "$(date): $message" >> /var/log/auth_alerts.log
echo "$message" | mail -s "Security Alert: $HOSTNAME" $ALERT_EMAIL
}
# Анализ неудачных попыток входа
analyze_failed_attempts() {
local current_time=$(date +%s)
local time_threshold=$((current_time - TIME_WINDOW))
# Получаем неудачные попытки за последние 5 минут
failed_attempts=$(grep "Failed password" $LOG_FILE | \
awk -v threshold="$time_threshold" '
{
# Парсим время из лога
cmd = "date -d \"" $1 " " $2 " " $3 "\" +%s"
cmd | getline log_time
close(cmd)
if (log_time >= threshold) {
print $0
}
}')
# Группируем по IP-адресам
if [[ -n "$failed_attempts" ]]; then
echo "$failed_attempts" | \
grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" | \
sort | uniq -c | \
while read count ip; do
if [[ $count -ge $THRESHOLD ]]; then
send_alert "Brute force attack detected from $ip: $count failed attempts in last 5 minutes"
fi
done
fi
}
# Проверка на подозрительные пользователи
check_suspicious_users() {
# Список пользователей, которых быть не должно
suspicious_users=("admin" "administrator" "test" "guest" "oracle" "postgres")
for user in "${suspicious_users[@]}"; do
if grep -q "invalid user $user" $LOG_FILE; then
last_attempt=$(grep "invalid user $user" $LOG_FILE | tail -1)
send_alert "Attempt to login as suspicious user '$user': $last_attempt"
fi
done
}
# Мониторинг успешных подключений в нерабочее время
check_off_hours_login() {
local current_hour=$(date +%H)
# Считаем нерабочим временем с 22:00 до 06:00
if [[ $current_hour -ge 22 || $current_hour -le 6 ]]; then
recent_logins=$(grep "Accepted" $LOG_FILE | grep "$(date '+%b %d %H')")
if [[ -n "$recent_logins" ]]; then
send_alert "Login detected during off-hours: $recent_logins"
fi
fi
}
# Запуск всех проверок
analyze_failed_attempts
check_suspicious_users
check_off_hours_login
Делаем скрипт исполняемым и добавляем в cron:
sudo chmod +x /usr/local/bin/auth_monitor.sh
# Добавляем в crontab для запуска каждые 5 минут
sudo crontab -e
# Добавляем строку:
*/5 * * * * /usr/local/bin/auth_monitor.sh
Продвинутый мониторинг с помощью fail2ban
Fail2ban — это швейцарский нож для защиты от брутфорса. Он не только мониторит логи, но и автоматически блокирует подозрительные IP-адреса.
# Устанавливаем fail2ban
sudo apt update
sudo apt install fail2ban
# Создаём локальную конфигурацию
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Настройка для SSH в /etc/fail2ban/jail.local
:
[DEFAULT]
# Время бана в секундах (10 минут)
bantime = 600
# Количество попыток перед баном
maxretry = 5
# Временное окно для подсчёта попыток (10 минут)
findtime = 600
# Игнорируемые IP (ваши доверенные адреса)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
Полезные команды для управления fail2ban:
# Перезапускаем fail2ban
sudo systemctl restart fail2ban
# Проверяем статус
sudo fail2ban-client status
# Статус конкретного jail
sudo fail2ban-client status sshd
# Разбаниваем IP
sudo fail2ban-client set sshd unbanip 192.168.1.100
# Баним IP вручную
sudo fail2ban-client set sshd banip 192.168.1.100
# Просмотр забаненных IP
sudo fail2ban-client get sshd banip
Мониторинг с помощью journalctl
Systemd journal предоставляет мощные возможности для фильтрации и анализа логов. Особенно полезно для серверов с systemd.
# Логи SSH за последний час
sudo journalctl -u ssh -S "1 hour ago"
# Только ошибки аутентификации
sudo journalctl -p err -g "authentication"
# Логи в реальном времени
sudo journalctl -f -u ssh
# Логи с конкретного IP
sudo journalctl -g "192.168.1.100"
# Статистика по пользователям
sudo journalctl -g "Accepted" --since "today" | grep -o "user [a-zA-Z0-9]*" | sort | uniq -c
Настройка централизованного логирования
Для множества серверов имеет смысл настроить централизованное логирование. Покажу простую схему с rsyslog.
На сервере-сборщике логов в /etc/rsyslog.conf
:
# Включаем UDP-приём логов
module(load="imudp")
input(type="imudp" port="514")
# Создаём отдельные файлы для каждого сервера
$template RemoteHost,"/var/log/remote/%HOSTNAME%/%programname%.log"
*.* ?RemoteHost
На клиентских серверах:
# Отправляем логи аутентификации на центральный сервер
auth.* @@log-server.domain.com:514
Интеграция с системами мониторинга
Для enterprise-решений стоит рассмотреть интеграцию с системами мониторинга. Вот пример скрипта для отправки метрик в Prometheus:
#!/bin/bash
# /usr/local/bin/auth_metrics.sh
METRICS_FILE="/var/lib/prometheus/node-exporter/auth_metrics.prom"
# Считаем неудачные попытки за последний час
failed_attempts=$(grep "Failed password" /var/log/auth.log | \
grep "$(date --date='1 hour ago' '+%b %d %H')" | wc -l)
# Считаем успешные подключения
successful_logins=$(grep "Accepted" /var/log/auth.log | \
grep "$(date --date='1 hour ago' '+%b %d %H')" | wc -l)
# Уникальные IP-адреса атакующих
unique_attackers=$(grep "Failed password" /var/log/auth.log | \
grep "$(date --date='1 hour ago' '+%b %d %H')" | \
grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq | wc -l)
# Записываем метрики
cat > $METRICS_FILE << EOF
# HELP auth_failed_attempts_total Total number of failed authentication attempts
# TYPE auth_failed_attempts_total counter
auth_failed_attempts_total $failed_attempts
# HELP auth_successful_logins_total Total number of successful logins
# TYPE auth_successful_logins_total counter
auth_successful_logins_total $successful_logins
# HELP auth_unique_attackers_total Number of unique IP addresses with failed attempts
# TYPE auth_unique_attackers_total gauge
auth_unique_attackers_total $unique_attackers
EOF
Сравнение инструментов мониторинга
Инструмент | Сложность настройки | Функциональность | Автоматизация | Ресурсы |
---|---|---|---|---|
Ручной мониторинг | Низкая | Базовая | Нет | Минимальные |
Fail2ban | Средняя | Высокая | Частичная | Низкие |
Custom scripts | Высокая | Настраиваемая | Полная | Средние |
ELK Stack | Очень высокая | Максимальная | Полная | Высокие |
OSSEC/WAZUH | Высокая | Максимальная | Полная | Высокие |
Альтернативные решения
Помимо классических подходов, существуют специализированные решения:
- OSSEC — open-source HIDS с мощными возможностями анализа логов
- Wazuh — форк OSSEC с современным веб-интерфейсом
- Logwatch — классическая утилита для анализа логов
- GoAccess — быстрый анализатор логов в реальном времени
- Graylog — централизованное управление логами
Ссылки на официальные ресурсы:
Продвинутые техники и интересные фишки
Несколько нестандартных подходов, которые могут оказаться полезными:
Honeypot для SSH
Создаём ложный SSH-сервис на стандартном порту 22, а настоящий переносим на нестандартный:
# Устанавливаем endlessh — SSH-тарпит
sudo apt install endlessh
# Конфигурируем endlessh на порт 22
echo "Port 22" | sudo tee /etc/endlessh/config
echo "LogLevel 1" | sudo tee -a /etc/endlessh/config
# Переносим настоящий SSH на порт 2222
sudo sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config
sudo systemctl restart sshd
sudo systemctl enable endlessh
sudo systemctl start endlessh
Геолокационная аналитика
Скрипт для анализа географического распределения атак:
#!/bin/bash
# Анализ атак по странам (требует geoip-bin)
sudo apt install geoip-bin
grep "Failed password" /var/log/auth.log | \
grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" | \
sort | uniq -c | \
while read count ip; do
country=$(geoiplookup $ip | cut -d: -f2 | cut -d, -f1)
echo "$count attempts from $ip ($country)"
done | sort -rn
Интеграция с Telegram
Отправка уведомлений в Telegram:
#!/bin/bash
# Функция отправки в Telegram
TELEGRAM_BOT_TOKEN="YOUR_BOT_TOKEN"
TELEGRAM_CHAT_ID="YOUR_CHAT_ID"
send_telegram() {
local message="$1"
curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
-d "chat_id=$TELEGRAM_CHAT_ID" \
-d "text=$message" \
-d "parse_mode=HTML"
}
# Использование
if [[ $(grep "Failed password" /var/log/auth.log | wc -l) -gt 100 ]]; then
send_telegram "🚨 Security Alert: More than 100 failed login attempts detected!"
fi
Автоматизация и интеграция в CI/CD
Мониторинг логов можно интегрировать в процессы разработки и развёртывания:
- Ansible playbooks для автоматического развёртывания мониторинга
- Docker containers с предустановленными инструментами мониторинга
- Kubernetes operators для управления мониторингом в кластере
- Terraform modules для создания инфраструктуры мониторинга
Пример Ansible playbook для настройки мониторинга:
---
- name: Setup authentication monitoring
hosts: all
become: yes
tasks:
- name: Install fail2ban
apt:
name: fail2ban
state: present
- name: Configure fail2ban
template:
src: jail.local.j2
dest: /etc/fail2ban/jail.local
notify: restart fail2ban
- name: Deploy monitoring script
copy:
src: auth_monitor.sh
dest: /usr/local/bin/auth_monitor.sh
mode: '0755'
- name: Setup cron job
cron:
name: "Auth monitoring"
minute: "*/5"
job: "/usr/local/bin/auth_monitor.sh"
Выводы и рекомендации
Мониторинг логов аутентификации — это многослойная система защиты, которая должна быть адаптирована под ваши конкретные потребности. Для небольших проектов достаточно fail2ban и простого скрипта мониторинга. Для enterprise-решений стоит рассмотреть полноценные SIEM-системы.
Ключевые рекомендации:
- Начинайте с базового мониторинга — fail2ban обязателен на любом публичном сервере
- Настройте уведомления об атаках — лучше получить лишнее уведомление, чем пропустить взлом
- Регулярно анализируйте логи вручную — автоматика может пропустить нестандартные атаки
- Используйте нестандартные порты для SSH — это снизит количество автоматических атак
- Настройте централизованное логирование для множества серверов
- Интегрируйте мониторинг с вашими процессами разработки
Если вам нужен качественный сервер для экспериментов с мониторингом, рекомендую обратить внимание на VPS-решения или выделенные серверы — на них можно безопасно тестировать любые конфигурации безопасности.
Помните: безопасность — это не разовая настройка, а постоянный процесс. Логи нужно не только собирать, но и анализировать, а инструменты мониторинга — регулярно обновлять и дорабатывать под новые угрозы.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.