Настройка ключей, fail2ban и порт-нокинг для "неприступного" сервера.
🖥️ Ваше Окружение
Для этой практики вам понадобится **две** машины: ваш **локальный компьютер (клиент)** и **удаленный сервер (сервер)**. Все команды для сервера требуют sudo. Если у вас нет сервера, вы можете использовать `localhost` (самого себя) для практики, установив пакет `openssh-server`.
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`).
Вход по паролю — это слабое место. 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
-
Проверка: Попробуйте подключиться снова. Если вы задали пароль для ключа, вас попросят ввести **его**, а не пароль от сервера.
Теперь, когда ключи работают, мы можем отключить вход по паролю, чтобы боты не могли его подобрать.
⚠️ КРИТИЧЕСКОЕ ПРЕДУПРЕЖДЕНИЕ ⚠️
НЕ ВЫПОЛНЯЙТЕ ШАГ 3 (Отключение пароля), пока вы на 100% не уверены, что ваш вход по SSH-ключу работает.
Перед тем как продолжить, откройте **второе окно терминала** и подключитесь к серверу. **Держите его открытым.** Если вы что-то сломаете, у вас будет этот "запасной" вход, чтобы откатить изменения.
-
(НА СЕРВЕРЕ) Откройте конфиг SSH:
sudo nano /etc/ssh/sshd_config
-
(НА СЕРВЕРЕ) Найдите и измените эти строки:
# Запрещаем вход по паролю
PasswordAuthentication no
# (Опционально, но рекомендуется) Запрещаем вход от root
PermitRootLogin no
# (Опционально) Разрешаем только вход по ключам
PubkeyAuthentication yes
-
(НА СЕРВЕРЕ) Проверьте синтаксис конфига:
Если команда ничего не выводит, значит, ошибок нет.
-
(НА СЕРВЕРЕ) Перезапустите сервис SSH:
sudo systemctl restart sshd
🚀 ЧЕЛЛЕНДЖ:
1. Убедитесь, что ваш ключ работает (Шаг 2).
2. Откройте **второй** терминал и подключитесь к серверу (ваш "спасательный круг").
3. В **первом** терминале отключите `PasswordAuthentication`.
4. Перезапустите `sshd`.
5. **Не закрывая** старые сессии, попробуйте открыть **третью**. Сервер не должен спросить пароль (он должен либо сразу пустить по ключу, либо отказать, если ключ не найден).
Даже с отключенными паролями, боты будут "стучаться" в ваш 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`):
Это продвинутая техника "безопасности через неизвестность" (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, пока порт не закрылся (если не настроено авто-закрытие).