скрипт настройки безопасности SSH

Модератор: padonki

Ответить
Аватара пользователя
Padonak
padonki
Сообщения: 3841
Зарегистрирован: 14 авг 2006, 20:43
Контактная информация:

скрипт настройки безопасности SSH

Сообщение Padonak »

🚀 ИНТЕРАКТИВНЫЙ УСТАНОВЩИК SSH MONITOR

Код: Выделить всё

#!/bin/bash
# ============================================================
# SSH MONITOR - ИНТЕРАКТИВНАЯ УСТАНОВКА
# Версия: 4.0
# ============================================================

if [[ $EUID -ne 0 ]]; then
   echo "❌ Ошибка: Запустите от root (sudo)"
   exit 1
fi

# ==================== ФУНКЦИИ ДЛЯ КРАСИВОГО ВЫВОДА ====================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

print_header() {
    echo ""
    echo -e "${BLUE}========================================${NC}"
    echo -e "${CYAN}  $1${NC}"
    echo -e "${BLUE}========================================${NC}"
    echo ""
}

print_success() {
    echo -e "${GREEN}✅ $1${NC}"
}

print_error() {
    echo -e "${RED}❌ $1${NC}"
}

print_info() {
    echo -e "${YELLOW}ℹ️  $1${NC}"
}

print_question() {
    echo -e "${CYAN}❓ $1${NC}"
}

# ==================== ФУНКЦИЯ ВВОДА С ПРОВЕРКОЙ ====================
get_input() {
    local prompt="$1"
    local default="$2"
    local input=""
    
    if [[ -n "$default" ]]; then
        read -p "$prompt [$default]: " input
        input="${input:-$default}"
    else
        read -p "$prompt: " input
    fi
    
    echo "$input"
}

# ==================== ФУНКЦИЯ ПРОВЕРКИ EMAIL ====================
validate_email() {
    local email="$1"
    if [[ -z "$email" ]]; then
        return 1
    fi
    if [[ "$email" =~ ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$ ]]; then
        return 0
    else
        return 1
    fi
}

# ==================== ФУНКЦИЯ ПРОВЕРКИ IP ====================
validate_ip() {
    local ip="$1"
    if [[ -z "$ip" ]]; then
        return 1
    fi
    # Простая проверка IP
    if [[ "$ip" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        return 0
    elif [[ "$ip" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}$ ]]; then
        return 0
    else
        return 1
    fi
}

# ==================== ЗАГОЛОВОК ====================
clear
print_header "🔐 SSH MONITOR - ИНТЕРАКТИВНАЯ УСТАНОВКА"

echo -e "${YELLOW}Этот скрипт установит систему мониторинга SSH подключений.${NC}"
echo -e "${YELLOW}Вы будете получать уведомления на email при подозрительных подключениях.${NC}"
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

# ==================== 1. НАСТРОЙКИ ПОЧТЫ ====================
print_header "📧 НАСТРОЙКИ ПОЧТЫ"

echo -e "${YELLOW}Укажите email, куда будут приходить уведомления${NC}"
echo ""

while true; do
    EMAIL_TO=$(get_input "📧 Ваш email" "admin@padonak.su")
    if validate_email "$EMAIL_TO"; then
        print_success "Email принят: $EMAIL_TO"
        break
    else
        print_error "Неверный формат email. Попробуйте снова."
    fi
done

echo ""

# ==================== 2. РАЗРЕШЕННЫЕ IP ====================
print_header "🛡️ РАЗРЕШЕННЫЕ IP АДРЕСА"

echo -e "${YELLOW}Укажите IP адреса, с которых разрешены подключения.${NC}"
echo -e "${YELLOW}Можно указать отдельные IP или подсети (например, 192.168.1.0/24).${NC}"
echo -e "${YELLOW}Если ничего не ввести, будет добавлен текущий IP сервера.${NC}"
echo ""

# Определяем текущий IP сервера
CURRENT_IP=$(hostname -I | awk '{print $1}')
if [[ -z "$CURRENT_IP" ]]; then
    CURRENT_IP="127.0.0.1"
fi

ALLOWED_IPS=()
IP_COUNT=0

while true; do
    IP_COUNT=$((IP_COUNT + 1))
    echo -e "${CYAN}IP #$IP_COUNT:${NC}"
    
    # Если первый раз, предлагаем текущий IP
    if [[ $IP_COUNT -eq 1 ]]; then
        DEFAULT_IP="$CURRENT_IP"
        echo -e "${YELLOW}💡 Рекомендуется добавить ваш текущий IP: $CURRENT_IP${NC}"
    else
        DEFAULT_IP=""
    fi
    
    read -p "Введите IP (или нажмите Enter для завершения): " ip_input
    
    if [[ -z "$ip_input" ]]; then
        if [[ $IP_COUNT -eq 1 ]]; then
            print_info "Добавляю текущий IP: $CURRENT_IP"
            ALLOWED_IPS+=("$CURRENT_IP")
        else
            break
        fi
    else
        if validate_ip "$ip_input"; then
            ALLOWED_IPS+=("$ip_input")
            print_success "Добавлен IP: $ip_input"
        else
            print_error "Неверный формат IP. Используйте: 192.168.1.1 или 192.168.1.0/24"
            IP_COUNT=$((IP_COUNT - 1))
        fi
    fi
    
    echo ""
done

echo ""
print_info "Добавлено разрешенных IP: ${#ALLOWED_IPS[@]}"
for ip in "${ALLOWED_IPS[@]}"; do
    echo -e "  ${GREEN}•${NC} $ip"
done

# ==================== 3. ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ ====================
print_header "⚙️ ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ"

echo ""

# Интервал проверки
echo -e "${CYAN}Интервал проверки (секунды):${NC}"
echo -e "${YELLOW}Как часто проверять новые подключения.${NC}"
echo -e "${YELLOW}Рекомендуется: 5-10 секунд${NC}"
CHECK_INTERVAL=$(get_input "⏱️  Интервал" "5")
print_success "Интервал: $CHECK_INTERVAL секунд"
echo ""

# Автоблокировка
echo -e "${CYAN}Автоматическая блокировка подозрительных IP:${NC}"
echo -e "${YELLOW}Включить автоматическую блокировку через iptables?${NC}"
echo "  1) Да - блокировать автоматически"
echo "  2) Нет - только уведомления (рекомендуется)"
read -p "Выберите [1-2]: " auto_block_choice

case "$auto_block_choice" in
    1)
        AUTO_BLOCK="yes"
        print_success "Автоблокировка включена"
        ;;
    *)
        AUTO_BLOCK="no"
        print_success "Автоблокировка выключена (только уведомления)"
        ;;
esac
echo ""

# Уведомления о разрешенных
echo -e "${CYAN}Уведомления о разрешенных подключениях:${NC}"
echo -e "${YELLOW}Отправлять уведомления даже с разрешенных IP?${NC}"
echo "  1) Только подозрительные (рекомендуется)"
echo "  2) Все подключения"
read -p "Выберите [1-2]: " notify_choice

case "$notify_choice" in
    2)
        NOTIFY_ONLY_SUSPICIOUS="no"
        print_success "Уведомления будут приходить на все подключения"
        ;;
    *)
        NOTIFY_ONLY_SUSPICIOUS="yes"
        print_success "Уведомления только о подозрительных"
        ;;
esac
echo ""

# ==================== 4. ПОДТВЕРЖДЕНИЕ ====================
print_header "📋 ПРОВЕРЬТЕ НАСТРОЙКИ"

echo -e "${CYAN}Почта:${NC} $EMAIL_TO"
echo -e "${CYAN}Разрешенные IP:${NC}"
for ip in "${ALLOWED_IPS[@]}"; do
    echo -e "  • $ip"
done
echo -e "${CYAN}Интервал проверки:${NC} $CHECK_INTERVAL секунд"
echo -e "${CYAN}Автоблокировка:${NC} $AUTO_BLOCK"
echo -e "${CYAN}Уведомления:${NC} $([ "$NOTIFY_ONLY_SUSPICIOUS" == "yes" ] && echo "Только подозрительные" || echo "Все подключения")"
echo ""

read -p "Продолжить установку? (y/n): " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    print_error "Установка отменена"
    exit 1
fi

# ==================== 5. СОЗДАНИЕ СКРИПТА ====================
print_header "📝 СОЗДАНИЕ СКРИПТА"

# Формируем список IP для вставки в скрипт
ALLOWED_IPS_STR=""
for ip in "${ALLOWED_IPS[@]}"; do
    ALLOWED_IPS_STR+="    \"$ip\"\n"
done

# Создаём скрипт с подставленными настройками
cat > /usr/local/bin/ssh-monitor.sh << EOF
#!/bin/bash
# ============================================================
# SSH MONITOR - Автоматически создан $(date)
# ============================================================
#
#  НАСТРОЙКИ (можно изменить):
# ============================================================

EMAIL_TO="$EMAIL_TO"
EMAIL_FROM="ssh-alert@\$(hostname -f)"

ALLOWED_IPS=(
$ALLOWED_IPS_STR
)

CHECK_INTERVAL="$CHECK_INTERVAL"
AUTO_BLOCK="$AUTO_BLOCK"
NOTIFY_ONLY_SUSPICIOUS="$NOTIFY_ONLY_SUSPICIOUS"

# ============================================================
#  ДАЛЬШЕ НИЧЕГО НЕ МЕНЯЙТЕ
# ============================================================

LOG_FILE="/var/log/ssh-monitor.log"
STATE_DIR="/var/lib/ssh-monitor"
STATE_FILE="\$STATE_DIR/last_state"
PID_FILE="/var/run/ssh-monitor.pid"

log_message() {
    echo "[\$(date '+%Y-%m-%d %H:%M:%S')] \$1" | tee -a "\$LOG_FILE"
}

send_email() {
    local subject="\$1"
    local body="\$2"
    
    local email_content="From: \$EMAIL_FROM
To: \$EMAIL_TO
Subject: \$subject
Content-Type: text/plain; charset=UTF-8

\$body

---
Сервер: \$(hostname -f)
IP сервера: \$(hostname -I | awk '{print \$1}')
Время: \$(date '+%Y-%m-%d %H:%M:%S')
"
    
    if command -v sendmail &> /dev/null; then
        echo "\$email_content" | sendmail -t && return 0
    fi
    
    if command -v mail &> /dev/null; then
        echo "\$body" | mail -s "\$subject" -a "From: \$EMAIL_FROM" "\$EMAIL_TO" && return 0
    fi
    
    log_message "❌ НЕТ СПОСОБОВ ОТПРАВКИ ПОЧТЫ!"
    log_message "   Установите: apt install mailutils"
    return 1
}

is_ip_allowed() {
    local ip="\$1"
    
    if [[ -z "\$ip" ]] || [[ "\$ip" == "unknown" ]]; then
        return 1
    fi
    
    for allowed in "\${ALLOWED_IPS[@]}"; do
        if [[ "\$ip" == "\$allowed" ]]; then
            return 0
        fi
        
        if [[ "\$allowed" == *"/24" ]]; then
            local ip_prefix=\$(echo "\$ip" | cut -d'.' -f1-3)
            local net_prefix=\$(echo "\$allowed" | cut -d'/' -f1 | cut -d'.' -f1-3)
            if [[ "\$ip_prefix" == "\$net_prefix" ]]; then
                return 0
            fi
        fi
        
        if [[ "\$allowed" == *"/16" ]]; then
            local ip_prefix=\$(echo "\$ip" | cut -d'.' -f1-2)
            local net_prefix=\$(echo "\$allowed" | cut -d'/' -f1 | cut -d'.' -f1-2)
            if [[ "\$ip_prefix" == "\$net_prefix" ]]; then
                return 0
            fi
        fi
        
        if [[ "\$allowed" == *"/8" ]]; then
            local ip_prefix=\$(echo "\$ip" | cut -d'.' -f1)
            local net_prefix=\$(echo "\$allowed" | cut -d'/' -f1 | cut -d'.' -f1)
            if [[ "\$ip_prefix" == "\$net_prefix" ]]; then
                return 0
            fi
        fi
    done
    
    return 1
}

get_ip_for_pid() {
    local pid="\$1"
    
    if command -v ss &> /dev/null; then
        local ip=\$(ss -tnp 2>/dev/null | grep "pid=\$pid" | head -1 | awk '{print \$5}' | cut -d':' -f1)
        if [[ -n "\$ip" ]] && [[ "\$ip" != "0.0.0.0" ]] && [[ "\$ip" != "::" ]] && [[ "\$ip" != "*" ]]; then
            echo "\$ip"
            return 0
        fi
    fi
    
    if command -v netstat &> /dev/null; then
        local ip=\$(netstat -tnp 2>/dev/null | grep "\$pid/sshd" | head -1 | awk '{print \$5}' | cut -d':' -f1)
        if [[ -n "\$ip" ]] && [[ "\$ip" != "0.0.0.0" ]] && [[ "\$ip" != "::" ]] && [[ "\$ip" != "*" ]]; then
            echo "\$ip"
            return 0
        fi
    fi
    
    local tty=\$(ps -o tty= -p "\$pid" 2>/dev/null | tr -d ' ')
    if [[ -n "\$tty" ]] && [[ "\$tty" != "?" ]]; then
        local ip=\$(who -u 2>/dev/null | grep "\$tty" | awk '{print \$NF}' | sed 's/[()]//g')
        if [[ -n "\$ip" ]] && [[ "\$ip" != "0.0.0.0" ]] && [[ "\$ip" != "::" ]] && [[ "\$ip" != "*" ]]; then
            echo "\$ip"
            return 0
        fi
    fi
    
    echo "unknown"
}

get_ssh_sessions() {
    ps aux | grep -E 'sshd-session:.*@|sshd:.*@' | grep -v grep | grep -v "listener" | grep -v "accepted" | awk '{print \$2}'
}

block_ip() {
    local ip="\$1"
    
    if [[ "\$AUTO_BLOCK" != "yes" ]]; then
        return 0
    fi
    
    log_message "🔒 БЛОКИРУЮ IP: \$ip"
    
    if command -v iptables &> /dev/null; then
        iptables -I INPUT -s "\$ip" -j DROP 2>/dev/null
        if [[ \$? -eq 0 ]]; then
            log_message "✅ IP \$ip заблокирован через iptables"
            return 0
        fi
    fi
    
    if command -v ufw &> /dev/null; then
        ufw deny from "\$ip" 2>/dev/null
        if [[ \$? -eq 0 ]]; then
            log_message "✅ IP \$ip заблокирован через ufw"
            return 0
        fi
    fi
    
    log_message "❌ НЕ УДАЛОСЬ ЗАБЛОКИРОВАТЬ IP \$ip"
    return 1
}

process_session() {
    local pid="\$1"
    local user=\$(ps -o user= -p "\$pid" 2>/dev/null | tr -d ' ')
    local client_ip=\$(get_ip_for_pid "\$pid")
    local start_time=\$(ps -o lstart= -p "\$pid" 2>/dev/null | tr -d ' ')
    
    log_message "🔍 НОВАЯ СЕССИЯ: PID=\$pid, USER=\$user, IP=\$client_ip"
    
    if [[ -z "\$client_ip" ]] || [[ "\$client_ip" == "unknown" ]]; then
        log_message "⚠️ НЕ УДАЛОСЬ ОПРЕДЕЛИТЬ IP для PID \$pid"
        return 1
    fi
    
    local subject=""
    local body=""
    local send=false
    
    if is_ip_allowed "\$client_ip"; then
        log_message "✅ РАЗРЕШЕННЫЙ IP: \$client_ip"
        
        if [[ "\$NOTIFY_ONLY_SUSPICIOUS" == "no" ]]; then
            subject="✅ Разрешенное SSH подключение от \$client_ip"
            body="✅ РАЗРЕШЕННОЕ SSH ПОДКЛЮЧЕНИЕ
========================================
Пользователь: \$user
IP адрес: \$client_ip
Время подключения: \$start_time
Сервер: \$(hostname -f)
========================================"
            send=true
        fi
    else
        log_message "🚨 ПОДОЗРИТЕЛЬНЫЙ IP: \$client_ip"
        
        subject="🚨 ПОДОЗРИТЕЛЬНОЕ SSH подключение с IP \$client_ip!"
        body="⚠️ ПОДОЗРИТЕЛЬНОЕ SSH ПОДКЛЮЧЕНИЕ
========================================
СТАТУС: ❌ НЕ РАЗРЕШЕН!
Пользователь: \$user
IP адрес: \$client_ip
Время подключения: \$start_time
Сервер: \$(hostname -f)
========================================

🔴 ВНИМАНИЕ! Подключение с НЕИЗВЕСТНОГО IP!

Рекомендации:
1. Проверьте логи: sudo tail -f /var/log/auth.log
2. Заблокируйте IP: sudo iptables -A INPUT -s \$client_ip -j DROP
3. Проверьте активные сессии: who -u

Текущие сессии:
\$(who -u 2>/dev/null || echo "Недоступно")
========================================"
        send=true
        
        if [[ "\$AUTO_BLOCK" == "yes" ]]; then
            block_ip "\$client_ip"
        fi
    fi
    
    if [[ "\$send" == true ]]; then
        send_email "\$subject" "\$body"
    fi
}

show_status() {
    echo "========================================="
    echo "📊 SSH MONITOR - СТАТУС"
    echo "========================================="
    echo ""
    echo "📧 Уведомления на: \$EMAIL_TO"
    echo "🛡️ Разрешенные IP:"
    for ip in "\${ALLOWED_IPS[@]}"; do
        echo "   - \$ip"
    done
    echo ""
    echo "🔄 Интервал проверки: \$CHECK_INTERVAL секунд"
    echo "🔒 Автоблокировка: \$AUTO_BLOCK"
    echo ""
    echo "📂 Лог-файл: \$LOG_FILE"
    echo ""
    echo "👥 Активные сессии:"
    who -u 2>/dev/null || echo "   Нет активных сессий"
    echo ""
    echo "📝 Последние 5 записей лога:"
    tail -5 "\$LOG_FILE" 2>/dev/null || echo "   Лог пуст"
    echo "========================================="
}

test_email() {
    echo "📧 Отправка тестового письма на \$EMAIL_TO..."
    
    local subject="🧪 Тестовое письмо от SSH Monitor"
    local body="ТЕСТОВОЕ ПИСЬМО
========================================
Это тестовое письмо от SSH Monitor.

Если вы видите это письмо, значит система работает корректно.

Сервер: \$(hostname -f)
IP: \$(hostname -I | awk '{print \$1}')
Время: \$(date '+%Y-%m-%d %H:%M:%S')
========================================"
    
    if send_email "\$subject" "\$body"; then
        echo "✅ Тестовое письмо отправлено!"
    else
        echo "❌ Не удалось отправить тестовое письмо"
        echo "   Проверьте настройки почты"
    fi
}

case "\$1" in
    --status|status)
        show_status
        exit 0
        ;;
    --test|test)
        test_email
        exit 0
        ;;
    --help|help|-h)
        echo "========================================="
        echo "SSH MONITOR - СПРАВКА"
        echo "========================================="
        echo ""
        echo "Использование: \$0 [ОПЦИЯ]"
        echo ""
        echo "Опции:"
        echo "  --status, status    - Показать статус и статистику"
        echo "  --test, test        - Отправить тестовое письмо"
        echo "  --help, help, -h    - Показать эту справку"
        echo ""
        echo "Без опций запускается в режиме мониторинга"
        echo "========================================="
        exit 0
        ;;
esac

mkdir -p "\$(dirname "\$LOG_FILE")" "\$STATE_DIR"
touch "\$LOG_FILE"

if [[ -f "\$PID_FILE" ]]; then
    local old_pid=\$(cat "\$PID_FILE" 2>/dev/null)
    if kill -0 "\$old_pid" 2>/dev/null; then
        echo "❌ Скрипт уже запущен (PID: \$old_pid)"
        echo "   Если это не так, удалите: rm -f \$PID_FILE"
        exit 1
    fi
fi
echo \$\$ > "\$PID_FILE"

log_message "========================================="
log_message "🚀 ЗАПУСК SSH MONITOR"
log_message "📧 Уведомления на: \$EMAIL_TO"
log_message "🛡️ Разрешенные IP: \${ALLOWED_IPS[*]}"
log_message "🔄 Интервал проверки: \$CHECK_INTERVAL сек"
log_message "🔒 Автоблокировка: \$AUTO_BLOCK"
log_message "📢 Уведомлять только о подозрительных: \$NOTIFY_ONLY_SUSPICIOUS"
log_message "========================================="

EXISTING_SESSIONS=\$(get_ssh_sessions)

if [[ -n "\$EXISTING_SESSIONS" ]]; then
    log_message "Найдено существующих сессий: \$(echo "\$EXISTING_SESSIONS" | wc -w)"
else
    log_message "Активных сессий не найдено"
fi

echo "\$EXISTING_SESSIONS" > "\$STATE_FILE"
log_message "✅ Инициализация завершена"

while true; do
    local current_sessions=\$(get_ssh_sessions)
    
    if [[ -n "\$current_sessions" ]]; then
        local previous_sessions=\$(cat "\$STATE_FILE" 2>/dev/null || echo "")
        
        for pid in \$current_sessions; do
            if ! echo "\$previous_sessions" | grep -q "^\$pid\$"; then
                process_session "\$pid"
            fi
        done
        
        echo "\$current_sessions" > "\$STATE_FILE"
    else
        echo "" > "\$STATE_FILE" 2>/dev/null
    fi
    
    sleep "\$CHECK_INTERVAL"
done
EOF

chmod +x /usr/local/bin/ssh-monitor.sh
print_success "Скрипт создан: /usr/local/bin/ssh-monitor.sh"

# ==================== 6. СОЗДАНИЕ СЕРВИСА ====================
print_header "📝 СОЗДАНИЕ СИСТЕМНОГО СЕРВИСА"

cat > /etc/systemd/system/ssh-monitor.service << 'EOF'
[Unit]
Description=SSH Monitor
After=network.target ssh.service
Wants=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/ssh-monitor.sh
Restart=always
RestartSec=5
User=root

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable ssh-monitor
systemctl restart ssh-monitor

print_success "Сервис создан и запущен"

# ==================== 7. ТЕСТИРОВАНИЕ ====================
print_header "🧪 ТЕСТИРОВАНИЕ"

echo -e "${YELLOW}Проверяем работу сервиса...${NC}"
sleep 2

if systemctl is-active --quiet ssh-monitor; then
    print_success "Сервис работает!"
else
    print_error "Сервис не запущен"
    systemctl status ssh-monitor --no-pager
fi

echo ""
print_question "Отправить тестовое письмо на $EMAIL_TO?"
read -p "(y/n): " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Yy]$ ]]; then
    /usr/local/bin/ssh-monitor.sh --test
fi

# ==================== 8. ИНФОРМАЦИЯ ====================
print_header "✅ УСТАНОВКА ЗАВЕРШЕНА!"

echo -e "${CYAN}📋 ВАШИ НАСТРОЙКИ:${NC}"
echo -e "  📧 Email: ${GREEN}$EMAIL_TO${NC}"
echo -e "  🛡️ Разрешенные IP:"
for ip in "${ALLOWED_IPS[@]}"; do
    echo -e "     • ${GREEN}$ip${NC}"
done
echo -e "  ⏱️  Интервал: ${GREEN}$CHECK_INTERVAL${NC} секунд"
echo -e "  🔒 Автоблокировка: ${GREEN}$AUTO_BLOCK${NC}"
echo ""

echo -e "${CYAN}📝 КОМАНДЫ УПРАВЛЕНИЯ:${NC}"
echo -e "  ${BLUE}systemctl status ssh-monitor${NC}   - Статус"
echo -e "  ${BLUE}systemctl restart ssh-monitor${NC}  - Перезапуск"
echo -e "  ${BLUE}systemctl stop ssh-monitor${NC}     - Остановка"
echo -e "  ${BLUE}journalctl -u ssh-monitor -f${NC}   - Логи (системные)"
echo -e "  ${BLUE}tail -f /var/log/ssh-monitor.log${NC} - Логи"
echo ""

echo -e "${CYAN}📧 ДОПОЛНИТЕЛЬНО:${NC}"
echo -e "  ${BLUE}/usr/local/bin/ssh-monitor.sh --test${NC}   - Тестовое письмо"
echo -e "  ${BLUE}/usr/local/bin/ssh-monitor.sh --status${NC} - Статистика"
echo ""

echo -e "${CYAN}🔧 ИЗМЕНЕНИЕ НАСТРОЕК:${NC}"
echo -e "  ${BLUE}nano /usr/local/bin/ssh-monitor.sh${NC}"
echo -e "  (измените первые 15 строк и перезапустите сервис)"
echo ""

print_success "SSH Monitor успешно установлен!"
echo -e "${GREEN}Теперь вы будете получать уведомления о подозрительных SSH подключениях!${NC}"
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"

exit 0

КАК ИСПОЛЬЗОВАТЬ
# 1. Сохраните скрипт

Код: Выделить всё

vim  install-ssh-monitor.sh
# 2. Вставьте весь код выше

# 3. Сделайте исполняемым

Код: Выделить всё

chmod +x install-ssh-monitor.sh
# 4. Запустите

Код: Выделить всё

./install-ssh-monitor.sh

🔧 ЧТО ДЕЛАЕТ СКРИПТ:

✅ Создает бэкап старых файлов

✅ Проверяет и устанавливает зависимости

✅ Создает скрипт монитора с вашими настройками

✅ Создает systemd сервис

✅ Запускает сервис

✅ Отправляет тестовое письмо

✅ Показывает информацию и команды

📊 ФУНКЦИОНАЛ:

✅ Отслеживает все новые SSH сессии

✅ Определяет IP подключения (через ss, netstat, lsof, who)

✅ Проверяет IP по списку разрешенных

✅ Отправляет уведомления на email

✅ Работает как systemd сервис

✅ Автозапуск при загрузке системы

✅ Подробное логирование

✅ Поддержка подсетей (CIDR)

ЧТО БУДЕТ ВО ВРЕМЯ УСТАНОВКИ:

Запросит email для уведомлений (с проверкой формата)

Запросит разрешенные IP (можно добавить несколько)

Запросит интервал проверки (по умолчанию 5 секунд)

Спросит про автоблокировку (Да/Нет)

Спросит про уведомления (только подозрительные или все)

Покажет все настройки и запросит подтверждение

Установит скрипт и сервис

Отправит тестовое письмо (по желанию)

Покажет команды для управления

🎯 ПРЕИМУЩЕСТВА:

✅ Никакого редактирования файлов — всё через вопросы

✅ Проверка ввода — не даст ввести неверный email или IP

✅ Подсказки — для каждого параметра

✅ Цветной вывод — легко читать

✅ Подтверждение — покажет все настройки перед установкой

✅ Тестовое письмо — проверит работу почты

✅ Готовые команды — покажет как управлять
Моя характеристика с детского сада: Хорошо кушает, спит, гуляет! Прошло много лет, ничего не изменилось.
Изображение
Ответить