Безопасность

Полное руководство по защите Битрикс CENTOS: от файрвола до Telegram-уведомлений

Полное руководство по защите Битрикс CENTOS: от файрвола до Telegram-уведомлений

Безопасность сервера или даже обычного рабочего компьютера под 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