Безопасность сервера или даже обычного рабочего компьютера под Linux — это не разовое действие, а постоянный процесс. Сегодня я хочу поделиться полным, пошаговым руководством, которое мы прошли на реальном примере, чтобы превратить стандартную систему в хорошо защищенную крепость с автоматизированным мониторингом и мгновенными уведомлениями об угрозах.
Это практическая инструкция, которую вы сможете адаптировать для своего сервера или десктопа на базе Ubuntu, Debian или их производных.
Шаг 1: Первичная разведка. Что запущено в системе?
Прежде чем что-то защищать, нужно понять, *что* именно мы защищаем. Какие службы "смотрят" в сеть? Какие процессы активны?
Для этого мы использовали две ключевые команды:
- **Проверка открытых портов:**
ss -tuln
Эта команда показывает все TCP и UDP порты, которые ожидают входящих подключений. В нашем случае мы обнаружили веб-сервер Apache (порт 80), базу данных MariaDB (порт 3306) и несколько других служб.
- **Проверка запущенных процессов:**
ps aux
Это дает нам полный список процессов, подтверждая, что наш веб-сервер — это `apache2`, а база данных — `mariadbd`.
Шаг 2: Базовая защита. Настраиваем файрвол
Самый первый рубеж обороны — это файрвол. Мы использовали `ufw` (Uncomplicated Firewall) — простой и мощный инструмент.
- **Включаем файрвол:** По умолчанию он все запретит.
sudo ufw enable
- **Открываем нужные порты:** Мы разрешили доступ только к тем службам, которые должны быть доступны извне.
# Разрешаем доступ к веб-серверу
sudo ufw allow 80/tcp
# Разрешаем доступ для интеграции с телефоном (если нужно)
sudo ufw allow 1716
# НЕ ЗАБУДЬТЕ, если подключаетесь удаленно!
sudo ufw allow 22/tcp
Шаг 3: Тяжелая артиллерия. Устанавливаем сканеры безопасности
Теперь, когда периметр защищен, добавим несколько уровней внутренней безопасности для обнаружения уже проникших угроз.
Сканеры руткитов: rkhunter и chkrootkit
Это утилиты для поиска руткитов — вредоносных программ, которые маскируют свое присутствие.
sudo apt install rkhunter chkrootkit
Важная первоначальная настройка rkhunter:
sudo rkhunter --update
sudo rkhunter --propupd
Сканер для веб-серверов: maldet
Если у вас есть веб-сервер, этот инструмент незаменим. Он ищет вредоносные PHP-скрипты, бэкдоры и прочие угрозы.
Устанавливаем зависимость:
sudo apt install inotify-tools
Устанавливаем maldet вручную:
wget http://www.rfxn.com/downloads/maldetect-current.tar.gz
tar -xzf maldetect-current.tar.gz
cd maldetect-*
sudo ./install.sh
Шаг 4: Автоматизация. Настраиваем регулярные проверки
Запускать сканеры вручную — хорошо, но легко забыть. Настроим автоматический запуск каждые 3 дня с помощью `cron`.
- Открываем редактор `cron` для `root`-пользователя:
sudo crontab -e
- Добавляем в конец файла следующие строки:
# Запускать сканеры безопасности каждые 3 дня в 3:30 ночи
30 3 */3 * * /usr/bin/rkhunter --check --cronjob
35 3 */3 * * /usr/sbin/chkrootkit
40 3 */3 * * /usr/local/sbin/maldet -a /var/www/html
Шаг 5: Мгновенные уведомления в Telegram
Что толку от сканирования, если вы не узнаете о результатах? Настроим отправку алертов в Telegram — это быстрее и удобнее почты.
- **Создаем бота:** В Telegram находим `@BotFather`, пишем ему `/newbot` и следуем инструкциям. Сохраняем **токен**.
- **Узнаем Chat ID:** Находим нашего нового бота, пишем ему `/start`. Затем открываем в браузере `https://api.telegram.org/botВАШ_ТОКЕН/getUpdates` и находим в ответе `chat.id`.
- **Создаем скрипт-отправщик:**
sudo nano /usr/local/bin/notify-telegram.sh
Вставляем в него код, подставив свои данные:
#!/bin/bash
TOKEN="ВАШ_ТОКЕН"
CHAT_ID="ВАШ_CHAT_ID"
MESSAGE="$1"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
--data-urlencode "chat_id=$CHAT_ID" \
--data-urlencode "text=$MESSAGE"
- **Делаем скрипт исполняемым:**
sudo chmod +x /usr/local/bin/notify-telegram.sh
Шаг 6: Интеграция и финальная проверка
Обновим наши `cron` задания, чтобы они вызывали скрипт только при обнаружении угрозы.
- Снова открываем `sudo crontab -e`.
- Заменяем блок сканирования на этот, с улучшенной логикой:
# Запускать сканеры и отправлять отчет в Telegram при наличии угроз
30 3 */3 * * /usr/bin/rkhunter --check --cronjob | grep -q 'Warning:' && /usr/local/bin/notify-telegram.sh "Rkhunter обнаружил угрозы! Проверьте лог /var/log/rkhunter.log"
35 3 */3 * * /usr/sbin/chkrootkit | grep -q 'INFECTED' && /usr/local/bin/notify-telegram.sh "Chkrootkit обнаружил угрозы!"
40 3 */3 * * /usr/local/sbin/maldet -a /var/www/html | grep -q '{hits}' && /usr/local/bin/notify-telegram.sh "Maldet обнаружил угрозы! Проверьте отчет."
- **Проверяем!** Имитируем тревогу, чтобы убедиться, что уведомление придет:
echo "Test: [ Warning: File not found ]" | grep -q 'Warning:' && /usr/local/bin/notify-telegram.sh "Тестовая тревога: Уведомление работает!"
Пошаговая защита сервера CentOS 9 Stream: от firewalld и Fail2Ban до Telegram-алертов
Защита Linux-сервера — это не магия, а последовательный процесс. В этом руководстве мы на реальном примере по шагам укрепим безопасность сервера под управлением CentOS 9 Stream, на котором работает сложный проект (например, 1С-Битрикс). Мы настроим файрвол, установим автоматическую защиту от атак, добавим несколько сканеров безопасности и настроим мгновенные уведомления в Telegram.
Шаг 1: Аудит системы. С чего начать?
Прежде всего, нужно понять, какие службы уже работают и слушают сеть. Это наша отправная точка.
Проверяем открытые порты:
ss -tuln
Смотрим на запущенные процессы:
ps aux
Этот аудит поможет нам понять, какие порты нужно будет разрешить в файрволе.
Шаг 2: Настройка файрвола с помощью firewalld
В CentOS стандартным инструментом для управления файрволом является `firewalld`.
Проверяем статус и текущие правила:
sudo firewall-cmd --state
sudo firewall-cmd --list-all
Добавляем базовые разрешающие правила для SSH (удаленный доступ) и веб-сервера (HTTP/HTTPS). Флаг --permanent сохраняет правила после перезагрузки.
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
Применяем изменения:
sudo firewall-cmd --reload
Примечание: Если вашим приложениям нужны другие порты, их следует добавить аналогично, например: sudo firewall-cmd --permanent --add-port=3000/tcp. Но помните: все, что не должно быть доступно извне (например, базы данных), должно быть закрыто.
Шаг 3: Автоматическая защита от атак с Fail2Ban
Если ваш сервер доступен из интернета, его SSH-порт постоянно подвергается атакам подбора пароля. Вместо ручной блокировки IP-адресов мы автоматизируем этот процесс с помощью `Fail2Ban`.
Устанавливаем репозиторий EPEL, в котором находится много полезных пакетов, включая fail2ban:
sudo dnf install epel-release -y
Устанавливаем Fail2Ban:
sudo dnf install fail2ban -y
Включаем и запускаем службу:
sudo systemctl enable --now fail2ban
Создаем локальный файл конфигурации, чтобы наши настройки не затерлись при обновлениях:
sudo nano /etc/fail2ban/jail.local
Вставляем в него конфигурацию для защиты SSH:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
Перезапускаем Fail2Ban и проверяем статус:
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
Теперь Fail2Ban автоматически блокирует атакующих.
Шаг 4: Установка сканеров безопасности
Добавим три мощных инструмента для поиска руткитов и вредоносного ПО.
Устанавливаем rkhunter и chkrootkit:
sudo dnf install rkhunter chkrootkit -y
Исправляем конфигурацию rkhunter: На CentOS может возникнуть проблема с обновлением. Чтобы ее исправить, откройте sudo nano /etc/rkhunter.conf, найдите строку WEB_CMD=... и замените ее на WEB_CMD="".
Проводим первоначальную настройку rkhunter:
sudo rkhunter --update
sudo rkhunter --propupd
Устанавливаем maldet (сканер для веб-серверов):
# Устанавливаем зависимость для режима мониторинга
sudo dnf install inotify-tools -y
# Скачиваем и устанавливаем maldet
wget http://www.rfxn.com/downloads/maldetect-current.tar.gz
tar -xzf maldetect-current.tar.gz
cd maldetect-* && sudo ./install.sh
Важный урок: Расследование ложного срабатывания. Во время первого скана maldet может найти угрозы. В нашем случае он нашел 2 файла с сигнатурой {YARA}eval_post. Мы проверили отчет (sudo maldet --report ) и изучили код с помощью grep. Оказалось, что угрозы нет — сканер ошибочно среагировал на безопасную PHP-функцию doubleval(). Мы добавили эти файлы в исключения, чтобы избежать ложных тревог в будущем: sudo maldet --add-ignore /path/to/file. Это показывает, как важно анализировать, а не удалять все подряд.
Шаг 5: Автоматизация и уведомления в Telegram
Финальный этап — настроим автоматический запуск сканеров и отправку уведомлений в Telegram.
Создаем скрипт-уведомитель:
sudo nano /usr/local/bin/notify-telegram.sh
Вставляем код, указав свои токен и ID чата, полученные от `@BotFather`:
#!/bin/bash
TOKEN="ВАШ_ТОКЕН"
CHAT_ID="ВАШ_CHAT_ID"
MESSAGE="$1"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
--data-urlencode "chat_id=$CHAT_ID" \
--data-urlencode "text=$MESSAGE"
Делаем скрипт исполняемым:
sudo chmod +x /usr/local/bin/notify-telegram.sh
Создаем cron задания:
Сначала уточняем пути к программам: `which rkhunter chkrootkit`. В нашем случае для `chkrootkit` путь оказался нестандартным: `/usr/local/bin/chkrootkit`.
Открываем `crontab`:
sudo crontab -e
Вставляем финальную, корректную конфигурацию:
# Запускать сканеры и отправлять отчет в Telegram при наличии угроз
30 3 */3 * * /usr/bin/rkhunter --check --cronjob | grep -q 'Warning:' && /usr/local/bin/notify-telegram.sh "Rkhunter на сервере nash обнаружил угрозы! Проверьте лог /var/log/rkhunter.log"
35 3 */3 * * /usr/local/bin/chkrootkit | grep -q 'INFECTED' && /usr/local/bin/notify-telegram.sh "Chkrootkit на сервере nash обнаружил угрозы!"
40 3 */3 * * /usr/local/sbin/maldet -a /home/bitrix/www | grep -q '{hits}' && /usr/local/bin/notify-telegram.sh "Maldet на сервере nash обнаружил угрозы! Проверьте отчет."
Не забудьте сохранить и выйти (для `nano`: `Ctrl+X`, `Y`, `Enter`).
Шаг 6: Финальное тестирование
Убедимся, что уведомления работают. Имитируем тревогу:
echo "Test: [ Warning: File not found ]" | grep -q 'Warning:' && /usr/local/bin/notify-telegram.sh "Тестовая тревога с сервера nash: Уведомление работает!"
Если сообщение пришло в Telegram — все настроено верно.
🎯 УПРАВЛЕНИЕ СИСТЕМОЙ БЕЗОПАСНОСТИ ПОСЛЕ УСТАНОВКИ
📊 ОСНОВНЫЕ КОМАНДЫ ПРОВЕРКИ СТАТУСА
# Общий статус безопасности
/usr/local/bin/security_status.sh
# Проверка работы мониторинга
tail -f /var/log/security_monitor.log
# Просмотр Telegram уведомлений
tail -f /var/log/telegram_notifications.log
# Статус всех защитных сервисов
systemctl status fail2ban
systemctl status firewalld
🛡️ УПРАВЛЕНИЕ FAIL2BAN
# Посмотреть общий статус
fail2ban-client status
# Статус защиты SSH
fail2ban-client status sshd
# Посмотреть заблокированные IP
fail2ban-client status sshd | grep "Banned IP"
# Разблокировать IP адрес
fail2ban-client set sshd unbanip 192.168.1.100
# Заблокировать IP вручную
fail2ban-client set sshd banip 192.168.1.100
# Перезапустить Fail2ban
systemctl restart fail2ban
# Посмотреть логи Fail2ban
tail -f /var/log/fail2ban.log
🔍 МОНИТОРИНГ УГРОЗ
# Запустить проверку вручную
/usr/local/bin/security_monitor.sh
# Проверить cron задачи
crontab -l
# Посмотреть последние обнаруженные угрозы
grep "ALERT\|WARNING" /var/log/security_monitor.log | tail -20
# Проверить процессы на майнеры
ps aux | grep -E "xmrig|minerd|kworker.*cpu"
# Найти подозрительные PHP файлы
find /home/bitrix/www -name "*.php" -type f -exec grep -l "eval\|base64_decode\|system" {} \; 2>/dev/null
📱 TELEGRAM УВЕДОМЛЕНИЯ
# Отправить тестовое сообщение
/usr/local/bin/notify-telegram.sh "Тест уведомления" "INFO"
# Отправить критическое уведомление
/usr/local/bin/notify-telegram.sh "Обнаружена угроза!" "CRITICAL"
# Проверить логи отправленных сообщений
tail -20 /var/log/telegram_notifications.log
🦠 АНТИВИРУС CLAMAV
# Обновить базы вирусов
freshclam
# Запустить сканирование вручную
clamscan -ri /home/bitrix/www --exclude-dir="/home/bitrix/www/bitrix/cache"
# Сканировать конкретный файл
clamscan /path/to/suspicious/file.php
# Запустить полное сканирование в фоне
/usr/local/bin/daily_av_scan.sh
# Посмотреть логи сканирования
tail -f /var/log/clamav_scan.log
📈 ОТЧЁТЫ И СТАТИСТИКА
# Ежедневный отчёт вручную
/usr/local/bin/daily_report.sh
# Статистика SSH атак за сегодня
grep "Failed password" /var/log/secure | grep "$(date '+%b %e')" | wc -l
# Топ 10 атакующих IP
grep "Failed password" /var/log/secure | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq -c | sort -rn | head -10
# Проверка нагрузки
uptime
htop
iotop
🔧 ЭКСТРЕННЫЕ КОМАНДЫ
# ЕСЛИ ОБНАРУЖЕН МАЙНЕР:
pkill -9 -f "xmrig|minerd|kworker|cryptonight"
ps aux | grep -v grep | grep -E "xmrig|minerd"
# ЕСЛИ ВЫСОКАЯ НАГРУЗКА:
top -b -n 1 | head -20
ps aux --sort=-%cpu | head -10
# ЕСЛИ ИДЁТ DDOS АТАКА:
netstat -an | grep :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head
# БЛОКИРОВКА АТАКУЮЩЕГО IP:
iptables -I INPUT -s IP_ADDRESS -j DROP
service iptables save
# РАЗБЛОКИРОВКА СЛУЧАЙНО ЗАБЛОКИРОВАННОГО:
iptables -D INPUT -s IP_ADDRESS -j DROP
fail2ban-client set sshd unbanip IP_ADDRESS
⚙️ НАСТРОЙКА И ИЗМЕНЕНИЯ
# Изменить настройки Fail2ban
nano /etc/fail2ban/jail.local
systemctl restart fail2ban
# Изменить частоту мониторинга (по умолчанию 5 минут)
crontab -e
# Измените */5 на нужное значение
# Добавить новый IP в белый список
echo "IP_ADDRESS" >> /etc/fail2ban/jail.local
# В секции [DEFAULT] добавьте в ignoreip
# Изменить токен Telegram
nano /usr/local/bin/notify-telegram.sh
# Измените TOKEN и CHAT_ID
📁 РАСПОЛОЖЕНИЕ ВАЖНЫХ ФАЙЛОВ
# Конфигурации
/etc/fail2ban/jail.local # Настройки Fail2ban
/etc/ssh/sshd_config # Настройки SSH
/etc/sysctl.d/99-security.conf # Параметры ядра
# Скрипты
/usr/local/bin/security_monitor.sh # Основной мониторинг
/usr/local/bin/notify-telegram.sh # Telegram уведомления
/usr/local/bin/security_status.sh # Проверка статуса
/usr/local/bin/daily_report.sh # Ежедневный отчёт
/usr/local/bin/daily_av_scan.sh # Антивирусное сканирование
# Логи
/var/log/security_monitor.log # Лог мониторинга
/var/log/telegram_notifications.log # Лог Telegram
/var/log/fail2ban.log # Лог Fail2ban
/var/log/clamav_scan.log # Лог антивируса
/var/log/secure # Системный лог безопасности
# Документация
/root/SECURITY_README.md # Инструкция по системе
🚨 БЫСТРАЯ ДИАГНОСТИКА ПРОБЛЕМ
# Создайте скрипт быстрой проверки
cat > /root/quick_check.sh << 'EOF'
#!/bin/bash
echo "=== QUICK SECURITY CHECK ==="
echo "Fail2ban: $(systemctl is-active fail2ban)"
echo "Blocked IPs: $(fail2ban-client status sshd 2>/dev/null | grep "Currently banned" | awk '{print $NF}')"
echo "SSH attacks today: $(grep "Failed password" /var/log/secure | grep "$(date '+%b %e')" | wc -l)"
echo "Load: $(uptime | awk -F'load average:' '{print $2}')"
echo "Suspicious processes: $(ps aux | grep -E "xmrig|minerd" | grep -v grep | wc -l)"
echo "Last monitor check: $(tail -1 /var/log/security_monitor.log)"
EOF
chmod +x /root/quick_check.sh
# Запускайте для быстрой проверки:
/root/quick_check.sh
📝 ЕЖЕДНЕВНЫЕ ЗАДАЧИ АДМИНИСТРАТОРА
-
Утром:
/usr/local/bin/security_status.sh
tail -20 /var/log/security_monitor.log
-
При подозрении на взлом:
/root/quick_check.sh
fail2ban-client status sshd
ps aux | grep -E "xmrig|minerd"
-
Раз в неделю:
freshclam
clamscan -ri /home/bitrix/www
-
При высокой нагрузке:
htop
netstat -an | grep ESTABLISHED | wc -l
💡 Совет: Сохраните эту инструкцию локально - она вам пригодится для управления защитой на всех серверах!
ПРИ ВОССТАНОВЛЕНИИ ИЗ БЭКАПА:
# 1. Проверьте что система безопасности все еще работает
fail2ban-client status
systemctl status fail2ban
# 2. Убедитесь что мониторинг активен
crontab -l | grep security_monitor
# 3. После восстановления бэкапа ОБЯЗАТЕЛЬНО удалите вебшелл
rm -f /home/bitrix/www/bitrix/components/bitrix/main.field.url/79a457191b47.php
# 4. Проверьте права на файлы после восстановления
chown -R bitrix:bitrix /home/bitrix/www/
find /home/bitrix/www -type f -exec chmod 644 {} \;
find /home/bitrix/www -type d -exec chmod 755 {} \;
ПОСЛЕ ВОССТАНОВЛЕНИЯ:
# Быстрая проверка безопасности
cat > /tmp/check_after_restore.sh << 'EOF'
#!/bin/bash
echo "=== ПРОВЕРКА ПОСЛЕ ВОССТАНОВЛЕНИЯ ==="
echo ""
echo "1. Вебшелл удален: $([ ! -f /home/bitrix/www/bitrix/components/bitrix/main.field.url/79a457191b47.php ] && echo "✓" || echo "✗ ТРЕБУЕТСЯ УДАЛЕНИЕ!")"
echo "2. Fail2ban: $(systemctl is-active fail2ban)"
echo "3. Мониторинг: $(crontab -l | grep -c security_monitor) задач"
echo "4. Telegram: $([ -f /usr/local/bin/notify-telegram.sh ] && echo "✓" || echo "✗")"
echo "5. Заблокировано IP: $(fail2ban-client status sshd | grep "Currently banned" | awk '{print $NF}')"
echo ""
echo "Сервисы:"
echo " Nginx: $(systemctl is-active nginx)"
echo " Apache: $(systemctl is-active httpd)"
echo " MySQL: $(systemctl is-active mysqld)"
echo ""
EOF
chmod +x /tmp/check_after_restore.sh
/tmp/check_after_restore.sh
ВАЖНЫЕ МОМЕНТЫ:
-
Сохраните настройки безопасности перед восстановлением:
# Бэкап настроек безопасности
tar -czf /root/security_backup_$(date +%Y%m%d).tar.gz \
/etc/fail2ban/jail.local \
/usr/local/bin/security_monitor.sh \
/usr/local/bin/notify-telegram.sh \
/usr/local/bin/security_status.sh \
/etc/sysctl.d/99-security.conf
-
После восстановления проверьте конфигурацию PHP/MySQL:
# Часто хостинг меняет пути к сокетам
grep -r "mysql.sock" /etc/php* /home/bitrix/www/bitrix/.settings.php
-
Документируйте изменения хостинга:
# Сохраните информацию о конфигурации
cat > /root/hosting_config_$(date +%Y%m%d).txt << EOF
Дата: $(date)
Изменения хостинга: добавление RAM
Старая конфигурация: $(free -h | grep Mem)
Новая конфигурация: [заполнить после восстановления]
Проблемы: сайт перестал работать после изменений
Решение: восстановление из бэкапа
EOF
РЕКОМЕНДАЦИИ НА БУДУЩЕЕ:
-
Перед изменениями на хостинге:
<li>Делайте снапшот VDS
- Сохраняйте конфигурации nginx/apache
- Записывайте текущие настройки PHP
-
Создайте скрипт быстрого бэкапа:
cat > /root/quick_backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M)
echo "Creating quick backup..."
# Конфигурации
tar -czf /root/configs_$DATE.tar.gz /etc/nginx /etc/httpd /etc/php* /etc/my.cnf
# База данных
mysqldump --all-databases > /root/all_databases_$DATE.sql
echo "Backup completed: /root/configs_$DATE.tar.gz"
EOF
chmod +x /root/quick_backup.sh
Вижу проблему с отображением цветов - escape-последовательности не интерпретируются. Давайте исправим:
ИСПРАВЛЯЕМ ОТОБРАЖЕНИЕ ЦВЕТОВ:
# Исправленная версия menu.sh с правильными цветами
cat > /root/menu.sh << 'EOF'
#!/usr/bin/bash
# Функция для цветного вывода
print_color() {
local color=$1
local text=$2
case $color in
red) echo -en "\e[31m${text}\e[0m" ;;
green) echo -en "\e[32m${text}\e[0m" ;;
yellow) echo -en "\e[33m${text}\e[0m" ;;
blue) echo -en "\e[34m${text}\e[0m" ;;
magenta) echo -en "\e[35m${text}\e[0m" ;;
cyan) echo -en "\e[36m${text}\e[0m" ;;
*) echo -en "${text}" ;;
esac
}
# Быстрая проверка безопасности
quick_security_check() {
local fail2ban_status=$(systemctl is-active fail2ban 2>/dev/null || echo "не установлен")
local blocked_ips=$(fail2ban-client status sshd 2>/dev/null | grep "Currently banned" | awk '{print $NF}' || echo "0")
local ssh_attacks=$(grep "Failed password" /var/log/secure 2>/dev/null | grep "$(date '+%b %e')" | wc -l)
if [ "$fail2ban_status" = "active" ]; then
print_color green "🛡️ Защита активна"
echo -n " | Заблокировано: "
print_color red "$blocked_ips"
echo -n " IP | SSH атак сегодня: "
print_color yellow "$ssh_attacks"
echo ""
else
print_color red "⚠️ Защита не активна!"
echo ""
fi
}
show_enhanced_menu() {
clear
print_color cyan "╔════════════════════════════════════════════════════════════╗\n"
print_color cyan "║ BITRIX ENVIRONMENT + SECURITY ║\n"
print_color cyan "╚════════════════════════════════════════════════════════════╝\n"
echo -n " Статус: "
quick_security_check
echo ""
print_color blue " ОСНОВНОЕ МЕНЮ:\n"
echo -n " "; print_color green "B"; echo ") 📦 Bitrix Menu - Стандартное меню Bitrix"
echo ""
print_color magenta " БЕЗОПАСНОСТЬ:\n"
echo -n " "; print_color green "S"; echo ") 🛡️ Security Panel - Полное меню безопасности"
echo -n " "; print_color green "C"; echo ") 🔍 Quick Check - Быстрая проверка"
echo -n " "; print_color green "L"; echo ") 📜 Security Logs - Просмотр логов"
echo -n " "; print_color green "F"; echo ") 🚫 Fail2ban Status - Статус блокировок"
echo ""
print_color yellow " БЫСТРЫЕ КОМАНДЫ:\n"
echo -n " "; print_color green "T"; echo ") 📱 Test Telegram - Тест уведомлений"
echo -n " "; print_color green "R"; echo ") 📊 Daily Report - Отчёт за день"
echo -n " "; print_color green "A"; echo ") 🦠 AntiVirus Scan - Быстрое сканирование"
echo ""
echo -n " "; print_color red "0"; echo ") Exit"
echo ""
print_color cyan "════════════════════════════════════════════════════════════\n"
echo -n "Выберите опцию: "
}
# Основной цикл
while true; do
show_enhanced_menu
read -n1 choice
echo ""
case ${choice,,} in
b)
print_color green "\nЗапуск Bitrix Menu...\n"
. /opt/webdir/bin/bitrix_utils.sh
/opt/webdir/bin/pool_menu.sh
;;
s)
print_color magenta "\nЗапуск Security Panel...\n"
if [ -f /root/security_menu.sh ]; then
/root/security_menu.sh
else
print_color red "Security menu не найдено!\n"
read -p "Нажмите Enter..."
fi
;;
c)
print_color blue "\nБыстрая проверка безопасности:\n"
echo "═══════════════════════════════════════"
/usr/local/bin/quick_check 2>/dev/null || /usr/local/bin/security_status.sh
echo "═══════════════════════════════════════"
read -p "Нажмите Enter для продолжения..."
;;
l)
print_color blue "\nПоследние записи логов безопасности:\n"
tail -30 /var/log/security_monitor.log
echo ""
read -p "Нажмите Enter для продолжения..."
;;
f)
print_color yellow "\nСтатус Fail2ban:\n"
fail2ban-client status
echo ""
echo "Заблокированные IP в SSH:"
fail2ban-client status sshd 2>/dev/null | grep "Banned IP"
read -p "Нажмите Enter для продолжения..."
;;
t)
print_color green "\nОтправка тестового уведомления...\n"
/usr/local/bin/notify-telegram.sh "✅ Тест из расширенного меню $(hostname)" "INFO"
echo "Проверьте Telegram!"
read -p "Нажмите Enter для продолжения..."
;;
r)
print_color blue "\nГенерация отчёта...\n"
/usr/local/bin/daily_security_report.sh 2>/dev/null || {
echo "SSH атак сегодня: $(grep "Failed password" /var/log/secure | grep "$(date '+%b %e')" | wc -l)"
echo "Заблокировано IP: $(fail2ban-client status sshd 2>/dev/null | grep "Currently banned" | awk '{print $NF}')"
}
read -p "Нажмите Enter для продолжения..."
;;
a)
print_color red "\nЗапуск быстрого антивирусного сканирования...\n"
echo "Сканируем критические директории..."
clamscan -ri /home/bitrix/www/bitrix/admin/ --max-filesize=5M 2>/dev/null | tail -10
read -p "Нажмите Enter для продолжения..."
;;
0|q)
print_color green "До свидания!\n"
exit 0
;;
*)
print_color red "Неверный выбор!\n"
sleep 1
;;
esac
done
EOF
chmod +x /root/menu.sh
АЛЬТЕРНАТИВНЫЙ ВАРИАНТ БЕЗ ЦВЕТОВ (если не работают):
cat > /root/menu_simple.sh << 'EOF'
#!/usr/bin/bash
show_menu() {
clear
echo "========================================================"
echo " BITRIX ENVIRONMENT + SECURITY "
echo "========================================================"
# Статус
local fail2ban_status=$(systemctl is-active fail2ban 2>/dev/null || echo "не установлен")
local blocked_ips=$(fail2ban-client status sshd 2>/dev/null | grep "Currently banned" | awk '{print $NF}' || echo "0")
local ssh_attacks=$(grep "Failed password" /var/log/secure 2>/dev/null | grep "$(date '+%b %e')" | wc -l)
echo " Статус: Защита $fail2ban_status | Заблокировано: $blocked_ips IP | Атак: $ssh_attacks"
echo ""
echo " ОСНОВНОЕ МЕНЮ:"
echo " [B] Bitrix Menu - Стандартное меню Bitrix"
echo ""
echo " БЕЗОПАСНОСТЬ:"
echo " [S] Security Panel - Полное меню безопасности"
echo " [C] Quick Check - Быстрая проверка"
echo " [L] Security Logs - Просмотр логов"
echo " [F] Fail2ban Status - Статус блокировок"
echo ""
echo " БЫСТРЫЕ КОМАНДЫ:"
echo " [T] Test Telegram - Тест уведомлений"
echo " [R] Daily Report - Отчёт за день"
echo " [A] AntiVirus Scan - Быстрое сканирование"
echo ""
echo " [0] Exit"
echo "========================================================"
echo -n "Выберите опцию: "
}
while true; do
show_menu
read -n1 choice
echo ""
case ${choice,,} in
b) /opt/webdir/bin/pool_menu.sh ;;
s) /root/security_menu.sh ;;
c) /usr/local/bin/quick_check; read -p "Enter..." ;;
l) tail -30 /var/log/security_monitor.log; read -p "Enter..." ;;
f) fail2ban-client status sshd; read -p "Enter..." ;;
t) /usr/local/bin/notify-telegram.sh "Test" "INFO"; read -p "Enter..." ;;
r) /usr/local/bin/daily_security_report.sh; read -p "Enter..." ;;
a) clamscan -ri /home/bitrix/www/bitrix/admin/ --max-filesize=5M | tail -10; read -p "Enter..." ;;
0|q) exit 0 ;;
*) echo "Неверный выбор!"; sleep 1 ;;
esac
done
EOF
chmod +x /root/menu_simple.sh
Теперь запустите:
# Основное меню с цветами
/root/menu.sh
# Или простое меню без цветов
/root/menu_simple.sh
Рекомендую выбрать опцию F чтобы посмотреть кто атакует, или R для полного отчёта.
Добавляем в .bashrc
cat >> /root/.bashrc << ‘EOF’
Security aliases
alias menu=‘/root/menu.sh’ alias bmenu=‘/opt/webdir/bin/pool_menu.sh’ # Bitrix original menu alias security=‘sec’ alias check=‘sec check’ alias seclog=‘sec log’ alias banned=‘sec ban’
Функция для красивого вывода статуса при входе
show_security_status() { local fail2ban=$(systemctl is-active fail2ban 2>/dev/null) local blocked=$(fail2ban-client status sshd 2>/dev/null | grep “Currently banned” | awk ‘{print $NF}’ || echo “0”) local attacks=$(grep “Failed password” /var/log/secure 2>/dev/null | grep ”$(date ’+%b %e’)” | wc -l)
if [ "$fail2ban" = "active" ]; then
echo -e "\033[0;32m✅ Security: Active\033[0m | Blocked: \033[0;31m$blocked\033[0m IPs | Attacks: \033[0;33m$attacks\033[0m today"
else
echo -e "\033[0;31m⚠️ Security: Not Active!\033[0m"
fi
}
Показываем статус при входе
echo -e “\033[0;36m═══════════════════════════════════════\033[0m” show_security_status echo -e “\033[0;36m═══════════════════════════════════════\033[0m” echo “Commands: menu | sec | sec help” echo "" EOF
source /root/.bashrc
cat > /usr/local/bin/sec << ‘EOF’
#!/bin/bash
Цвета
RED=‘\033[0;31m’ GREEN=‘\033[0;32m’ YELLOW=‘\033[1;33m’ BLUE=‘\033[0;34m’ NC=‘\033[0m’
case “$1” in "")
# Без аргументов - показываем меню
/root/security_menu.sh 2>/dev/null || /root/menu.sh
;;
check|c)
/usr/local/bin/quick_check 2>/dev/null || {
echo "🔍 Быстрая проверка:"
echo "Fail2ban: $(systemctl is-active fail2ban)"
echo "Blocked: $(fail2ban-client status sshd 2>/dev/null | grep "Currently banned" | awk '{print $NF}') IPs"
echo "Attacks today: $(grep "Failed password" /var/log/secure | grep "$(date '+%b %e')" | wc -l)"
}
;;
status|s)
/usr/local/bin/security_status.sh
;;
log|l)
tail -f /var/log/security_monitor.log
;;
ban|b)
fail2ban-client status sshd
;;
unban|u)
if [ -z "$2" ]; then
echo "Usage: sec unban IP_ADDRESS"
else
fail2ban-client set sshd unbanip $2
fail2ban-client set sshd-aggressive unbanip $2 2>/dev/null
echo -e "${GREEN}✅ IP $2 разблокирован${NC}"
fi
;;
telegram|t)
shift
/usr/local/bin/notify-telegram.sh "$*" "INFO"
;;
report|r)
/usr/local/bin/daily_security_report.sh
;;
help|h)
echo -e "${BLUE}Security Commands:${NC}"
echo " sec [menu] - Security menu"
echo " sec check - Quick security check"
echo " sec status - Full status report"
echo " sec log - View security logs"
echo " sec ban - Show banned IPs"
echo " sec unban IP - Unban specific IP"
echo " sec telegram MESSAGE - Send Telegram notification"
echo " sec report - Generate daily report"
echo " sec help - Show this help"
;;
*)
echo -e "${RED}Unknown command: $1${NC}"
echo "Use 'sec help' for available commands"
;;
esac EOF
chmod +x /usr/local/bin/sec
Посмотрим реальное меню
head -100 /opt/webdir/bin/pool_menu.sh
Сделаем бэкап
cp /opt/webdir/bin/pool_menu.sh /opt/webdir/bin/poolmenu.sh.backup$(date +%Y%m%d)
Найдем где пункты меню
grep -n “Sites|EXIT|exit” /opt/webdir/bin/pool_menu.sh | head -10