Home » Как мониторить логи аутентификации в Ubuntu
Как мониторить логи аутентификации в Ubuntu

Как мониторить логи аутентификации в 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-решения или выделенные серверы — на них можно безопасно тестировать любые конфигурации безопасности.

Помните: безопасность — это не разовая настройка, а постоянный процесс. Логи нужно не только собирать, но и анализировать, а инструменты мониторинга — регулярно обновлять и дорабатывать под новые угрозы.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked