Практикум: Безопасный SSH

Настройка ключей, fail2ban и порт-нокинг для "неприступного" сервера.

🖥️ Ваше Окружение

Для этой практики вам понадобится **две** машины: ваш **локальный компьютер (клиент)** и **удаленный сервер (сервер)**. Все команды для сервера требуют sudo. Если у вас нет сервера, вы можете использовать `localhost` (самого себя) для практики, установив пакет `openssh-server`.

1. Основы SSH (Secure Shell)

SSH — это протокол, позволяющий безопасно подключаться к удаленной машине. Он шифрует весь трафик.

  • Подключение к серверу: Основная команда. Вам будет предложено ввести пароль.

    # ssh [имя_пользователя]@[IP-адрес или домен]
    ssh user@192.168.1.100
  • Подключение к нестандартному порту: Если SSH слушает не порт 22, а, например, 2222.

    ssh user@192.168.1.100 -p 2222
  • Файл конфигурации клиента: (На **локальной** машине). Упрощает жизнь. Создайте файл `~/.ssh/config`.

    # Создаем/редактируем файл
    nano ~/.ssh/config
    
    # Добавляем в него запись:
    Host myserver
        HostName 192.168.1.100
        User user
        Port 2222

    Теперь для подключения достаточно ввести: ssh myserver.

🚀 ЧЕЛЛЕНДЖ:

1. Подключитесь к своему серверу по SSH.
2. Создайте файл `~/.ssh/config` на **клиенте**.
3. Добавьте в него запись для вашего сервера и попробуйте подключиться, используя псевдоним (как `ssh myserver`).

2. Настройка SSH-ключей

Вход по паролю — это слабое место. SSH-ключи — это криптографическая пара (приватный и публичный), которая намного безопаснее.

Как это работает?

У вас есть два ключа:

  • id_rsa (или `id_ed25519`) — **Приватный ключ**. Он хранится у вас на **клиенте**. Вы никому его не показываете. Это ваш "паспорт".
  • id_rsa.pub — **Публичный ключ**. Он не секретный. Вы копируете его на **сервер**. Это "замок", который открывается только вашим паспортом.

Сервер хранит ваш публичный ключ в файле `~/.ssh/authorized_keys`.

  • (НА КЛИЕНТЕ) Генерация ключей: Создаем пару ключей. Рекомендуется использовать `ed25519` или `rsa` с длиной 4096 бит. Нажимайте Enter, чтобы принять пути по умолчанию.

    ssh-keygen -t ed25519 -C "your_email@example.com"
    
    # Или более старый, но совместимый вариант:
    # ssh-keygen -t rsa -b 4096

    Настоятельно рекомендуется задать **пароль (passphrase)** для ключа. Это зашифрует ваш приватный ключ на диске.

  • (НА КЛИЕНТЕ) Копирование ключа на сервер: Самый простой способ. Эта утилита сама найдет нужный файл на сервере и добавит туда ваш `.pub` ключ.

    ssh-copy-id user@192.168.1.100
  • Проверка: Попробуйте подключиться снова. Если вы задали пароль для ключа, вас попросят ввести **его**, а не пароль от сервера.

    ssh user@192.168.1.100

3. Защита Сервера (Отключение паролей)

Теперь, когда ключи работают, мы можем отключить вход по паролю, чтобы боты не могли его подобрать.

⚠️ КРИТИЧЕСКОЕ ПРЕДУПРЕЖДЕНИЕ ⚠️

НЕ ВЫПОЛНЯЙТЕ ШАГ 3 (Отключение пароля), пока вы на 100% не уверены, что ваш вход по SSH-ключу работает.

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

  • (НА СЕРВЕРЕ) Откройте конфиг SSH:

    sudo nano /etc/ssh/sshd_config
  • (НА СЕРВЕРЕ) Найдите и измените эти строки:

    # Запрещаем вход по паролю
    PasswordAuthentication no
    
    # (Опционально, но рекомендуется) Запрещаем вход от root
    PermitRootLogin no
    
    # (Опционально) Разрешаем только вход по ключам
    PubkeyAuthentication yes
  • (НА СЕРВЕРЕ) Проверьте синтаксис конфига:

    sudo sshd -t

    Если команда ничего не выводит, значит, ошибок нет.

  • (НА СЕРВЕРЕ) Перезапустите сервис SSH:

    sudo systemctl restart sshd

🚀 ЧЕЛЛЕНДЖ:

1. Убедитесь, что ваш ключ работает (Шаг 2).
2. Откройте **второй** терминал и подключитесь к серверу (ваш "спасательный круг").
3. В **первом** терминале отключите `PasswordAuthentication`.
4. Перезапустите `sshd`.
5. **Не закрывая** старые сессии, попробуйте открыть **третью**. Сервер не должен спросить пароль (он должен либо сразу пустить по ключу, либо отказать, если ключ не найден).

4. Установка Fail2Ban

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

  • (НА СЕРВЕРЕ) Установка:

    sudo apt update
    sudo apt install fail2ban
  • (НА СЕРВЕРЕ) Создание локального конфига: Никогда не редактируйте `jail.conf`. Создайте `jail.local`, который его переопределит.

    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  • (НА СЕРВЕРЕ) Настройка: Откройте `jail.local` и найдите секцию `[sshd]`.

    sudo nano /etc/fail2ban/jail.local
    
    # Найдите секцию [sshd] и убедитесь, что она включена:
    [sshd]
    enabled = true
    port    = ssh
    logpath = %(sshd_log)s
    backend = %(sshd_backend)s
    
    # Можно поменять время бана (bantime) или кол-во попыток (maxretry)
  • (НА СЕРВЕРЕ) Перезапуск и проверка:

    sudo systemctl restart fail2ban
    sudo fail2ban-client status
    sudo fail2ban-client status sshd
💡 Как посмотреть, кого забанили?

Вы можете проверить лог Fail2Ban:

sudo tail -f /var/log/fail2ban.log

Или посмотреть правила файрвола (если используется `iptables`):

sudo iptables -L -n

5. Порт-нокинг (Port Knocking)

Это продвинутая техника "безопасности через неизвестность" (security through obscurity). Ваш SSH-порт (22) будет **полностью закрыт** файрволом. Чтобы его открыть, вы должны "постучать" в определенной последовательности по другим портам.

Как это работает?

1. Демон `knockd` слушает все пакеты.
2. Вы (клиент) отправляете пакеты на порты (например, 7000, 8000, 9000).
3. `knockd` видит эту последовательность и выполняет команду (например, `iptables -A INPUT ...` ), чтобы открыть порт 22 **только для вашего IP**.
4. Вы подключаетесь по SSH.
5. (Опционально) `knockd` ждет N секунд и закрывает порт обратно.

⚠️ КРИТИЧЕСКОЕ ПРЕДУПРЕЖДЕНИЕ ⚠️

Это **очень** рискованная настройка. Если вы ошибетесь в конфиге `knockd` или правилах файрвола, вы **гарантированно заблокируете себе доступ навсегда**. Практикуйтесь **ТОЛЬКО** на виртуальной машине, к которой у вас есть доступ через консоль (например, VNC или веб-интерфейс провайдера).

  • (НА СЕРВЕРЕ) Установка `knockd` и `iptables`:

    sudo apt install knockd iptables
  • (НА СЕРВЕРЕ) Настройка файрвола: Сначала **закрываем** порт 22.

    # Разрешаем уже установленные соединения
    sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    # Блокируем ВСЕ новые SSH-соединения
    sudo iptables -A INPUT -p tcp --dport 22 -j DROP
  • (НА СЕРВЕРЕ) Настройка `knockd`: Редактируем `/etc/knockd.conf`.

    sudo nano /etc/knockd.conf
    
    [options]
            logfile = /var/log/knockd.log
    
    [openSSH]
            sequence    = 7000,8000,9000
            seq_timeout = 15
            command     = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
            tcpflags    = syn
    
    [closeSSH]
            sequence    = 9000,8000,7000
            seq_timeout = 15
            command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
            tcpflags    = syn
  • (НА СЕРВЕРЕ) Включение `knockd`: Редактируем `/etc/default/knockd` и ставим `START_KNOCKD=1`. Затем запускаем сервис.

    sudo nano /etc/default/knockd
    # ... поставить START_KNOCKD=1
    sudo systemctl start knockd
  • (НА КЛИЕНТЕ) "Стук": Используем `knock` или `nmap`.

    # Установка (apt install knockd)
    knock 192.168.1.100 7000 8000 9000
    
    # ИЛИ через nmap (не требует установки knock)
    nmap -p 7000 --host-timeout 101ms 192.168.1.100
    nmap -p 8000 --host-timeout 101ms 192.168.1.100
    nmap -p 9000 --host-timeout 101ms 192.168.1.100

    После этого у вас есть несколько секунд, чтобы подключиться по SSH, пока порт не закрылся (если не настроено авто-закрытие).