10 важнейших рекомендаций по усилению защиты вашего SSH-сервера
Усильте защиту SSH-сервера с помощью более безопасной аутентификации, доступа с минимальными привилегиями, правил брандмауэра, ограничения скорости, обновлений и проверки журналов.
10 важнейших рекомендаций по усилению защиты вашего SSH-сервера
Secure Shell (SSH) обычно является входной дверью на ваш сервер. Если эта дверь принимает слабые пароли, прямой вход от root или трафик со всего интернета, злоумышленники быстро ее найдут.
Это руководство содержит 10 практических шагов по усилению защиты SSH-сервера, которые можно применить к OpenSSH на распространенных дистрибутивах Linux. Держите одну рабочую сессию открытой при тестировании каждого изменения, чтобы иметь возможность восстановить доступ, если правило брандмауэра или изменение конфигурации заблокирует новые входы.
1. Измените порт SSH по умолчанию
Порт SSH по умолчанию — 22. Он общеизвестен и постоянно сканируется автоматическими ботами в поисках уязвимых серверов. Изменение порта по умолчанию обеспечивает простой, но эффективный уровень маскировки. Хотя это не является самостоятельной мерой безопасности, это значительно снижает шум от автоматических сканирований и помогает избежать многих оппортунистических атак.
Чтобы изменить порт, отредактируйте файл sshd_config, обычно расположенный по пути /etc/ssh/sshd_config.
sudo nano /etc/ssh/sshd_config
Найдите строку Port 22 (или добавьте ее, если она отсутствует) и измените 22 на нестандартный, незанятый номер порта (например, 2222, 49152-65535 — пользовательские/динамические порты).
#Port 22
Port 2222
Перед перезапуском SSH разрешите новый порт в брандмауэре. Затем протестируйте новый вход на новом порту, прежде чем удалять доступ к порту 22.
# Для UFW (Uncomplicated Firewall):
sudo ufw allow 2222/tcp
sudo ufw reload
# Для Firewalld:
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo sshd -t
sudo systemctl restart sshd
Совет: Всегда держите хотя бы одну сессию SSH открытой при тестировании изменений конфигурации. Если вы будете заблокированы, вы сможете отменить изменения в активной сессии.
2. Отключите вход от root
Прямой вход от root через SSH крайне не рекомендуется. Пользователь root имеет неограниченные привилегии, что делает его главной целью для злоумышленников. Если злоумышленник получит доступ к root, он получит полный контроль над вашей системой. Вместо этого входите как обычный непривилегированный пользователь, а затем используйте sudo для выполнения административных задач.
В sshd_config найдите директиву PermitRootLogin и установите ее в no.
PermitRootLogin no
Сохраните и перезапустите службу SSH:
sudo systemctl restart sshd
3. Используйте аутентификацию по ключам
Аутентификация на основе пароля подвержена атакам методом подбора и словарным атакам, особенно если пользователи выбирают слабые пароли. Аутентификация по SSH-ключам является гораздо более безопасной альтернативой. Она использует пару криптографических ключей: открытый ключ хранится на сервере, а закрытый ключ — на вашем локальном компьютере. Только клиенты с соответствующим закрытым ключом могут пройти аутентификацию.
Шаги по внедрению аутентификации по ключам (кратко):
Сгенерируйте пару ключей на вашем локальном компьютере:
ssh-keygen -t ed25519 -C "[email protected]"ed25519— современный безопасный алгоритм с фиксированным размером ключа.rsaтакже распространен; если вы используете RSA, сгенерируйте большой ключ, напримерssh-keygen -t rsa -b 4096.
Скопируйте открытый ключ на ваш сервер:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your_server_ipАльтернативно, вручную добавьте содержимое
~/.ssh/id_ed25519.pubв файл~/.ssh/authorized_keysна сервере для пользователя, от имени которого вы хотите входить.Убедитесь в правильных разрешениях на сервере:
- Каталог
~/.ssh:700(rwx только для владельца) - Файл
~/.ssh/authorized_keys:600(rw только для владельца)
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys- Каталог
4. Отключите аутентификацию по паролю
После того как вы успешно настроили и протестировали аутентификацию по ключам для всех необходимых пользователей, следует полностью отключить аутентификацию по паролю. Это устраняет самое слабое звено в безопасности SSH, делая атаки методом подбора паролей невозможными.
В sshd_config установите PasswordAuthentication в no.
PasswordAuthentication no
KbdInteractiveAuthentication no
В некоторых дистрибутивах PAM или клавиатурно-интерактивная аутентификация все еще могут запрашивать пароль, если вы также не отключите их. Протестируйте в новом терминале, прежде чем закрывать существующую сессию.
Сохраните и перезапустите службу SSH:
sudo systemctl restart sshd
Предупреждение: Никогда не отключайте аутентификацию по паролю, не убедившись, что аутентификация по ключам работает правильно для всех пользователей, которым нужен доступ. В противном случае вы рискуете заблокировать себя на сервере.
5. Ограничьте доступ пользователей
По умолчанию любая учетная запись пользователя на сервере может попытаться войти через SSH. Вы можете ограничить доступ по SSH только для определенных пользователей или групп, минимизируя поверхность атаки.
Используйте директивы AllowUsers или AllowGroups в sshd_config.
Чтобы разрешить только определенных пользователей (например, adminuser, devuser):
AllowUsers adminuser devuser
Чтобы разрешить только членов определенной группы (например, sshusers):
AllowGroups sshusers
Совет: Обычно лучше использовать AllowGroups, если у вас несколько пользователей. Создайте выделенную группу для доступа по SSH и добавьте в нее авторизованных пользователей.
sudo groupadd sshusers
sudo usermod -aG sshusers adminuser
sudo usermod -aG sshusers devuser
После внесения изменений сохраните и перезапустите SSH.
6. Используйте надежные парольные фразы для SSH-ключей
Хотя аутентификация по ключам надежна, ваш закрытый ключ остается критически важным активом. Если злоумышленник получит доступ к вашему локальному компьютеру, он может украсть ваш закрытый ключ. Надежная парольная фраза шифрует ваш закрытый ключ, требуя ее ввода для разблокировки перед использованием. Это добавляет дополнительный уровень безопасности, защищая ваш ключ, даже если он попадет в чужие руки.
При генерации SSH-ключа (как в шаге 3) вам будет предложено ввести парольную фразу. Выберите длинную, сложную и запоминающуюся парольную фразу, отличную от всех других используемых вами паролей.
7. Внедрите ограничение скорости подключений (Fail2Ban)
Даже при аутентификации по ключам SSH-сервер все еще подвержен попыткам подключения. Инструменты, такие как Fail2Ban, могут активно отслеживать журналы SSH на предмет повторяющихся неудачных попыток входа с одного и того же IP-адреса и автоматически блокировать этот IP-адрес с помощью правил брандмауэра на заданный период.
Установка (пример для Debian/Ubuntu):
sudo apt update
sudo apt install fail2ban
Fail2Ban работает из коробки с правилами SSH по умолчанию, но вы можете настроить его конфигурацию, скопировав jail.conf в jail.local и отредактировав его.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Внутри jail.local вы можете настроить bantime, findtime и maxretry для раздела [sshd].
[sshd]
enabled = true
port = 2222 # Ваш новый порт SSH
logpath = %(sshd_log)s
maxretry = 3
bantime = 1h
findtime = 10m
Перезапустите Fail2Ban после изменений конфигурации:
sudo systemctl restart fail2ban
8. Регулярно обновляйте программное обеспечение SSH-сервера
Уязвимости программного обеспечения постоянно обнаруживаются и исправляются. Использование устаревшего программного обеспечения демона SSH (OpenSSH) означает, что вы можете быть подвержены известным эксплойтам. Регулярное обновление программного обеспечения сервера, включая пакет OpenSSH-сервера, имеет решающее значение для устранения уязвимостей безопасности.
# Для Debian/Ubuntu:
sudo apt update && sudo apt upgrade
# Для CentOS/RHEL:
sudo yum update
# или
sudo dnf update
Настройте систему на автоматическое применение обновлений безопасности, где это уместно, или установите регулярный график ручных обновлений.
9. Мониторьте журналы SSH на предмет подозрительной активности
Даже при надежных превентивных мерах бдительность является ключевым фактором. Регулярно просматривайте журналы аутентификации SSH для обнаружения необычных шаблонов, неудачных попыток входа или попыток несанкционированного доступа. Это помогает выявить потенциальные взломы или текущие атаки.
Журналы SSH обычно находятся в:
/var/log/auth.log(Debian/Ubuntu)/var/log/secure(CentOS/RHEL)- С помощью
journalctl(системы systemd):sudo journalctl -u sshd -f
Ищите повторяющиеся неудачные попытки аутентификации, входы с необычных IP-адресов или успешные входы незнакомых пользователей. Инструменты, такие как Logwatch или Elastic Stack (ELK), могут автоматизировать анализ журналов и оповещение для более крупных сред.
10. Настройте правила брандмауэра для ограничения доступа
Брандмауэр — это ваша первая линия защиты. По умолчанию он должен блокировать весь входящий трафик, кроме тех служб, которые вам явно необходимо открыть. Для SSH это означает разрешение подключений только на выбранном порту (например, 2222) и, в идеале, только с определенных доверенных IP-адресов или сетей.
Пример с использованием UFW (Uncomplicated Firewall):
Разрешить SSH с определенного IP-адреса 192.168.1.100 на порту 2222:
sudo ufw allow from 192.168.1.100 to any port 2222
Разрешить SSH с определенной подсети 192.168.1.0/24:
sudo ufw allow from 192.168.1.0/24 to any port 2222
Пример с использованием Firewalld (CentOS/RHEL):
Разрешить SSH с определенного IP-адреса 192.168.1.100 на порту 2222:
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port=2222 protocol="tcp" accept'
sudo firewall-cmd --reload
Предупреждение: Если вы управляете сервером с динамического IP-адреса, будьте осторожны со строгими правилами брандмауэра. Возможно, вам потребуется разрешить доступ из более широкого диапазона или использовать VPN.
Дополнительные советы по усилению защиты
Помимо 10 основных, рассмотрите следующие директивы для еще большей безопасности:
MaxAuthTries: Ограничивает количество попыток аутентификации на одно соединение. По умолчанию — 6. Уменьшение (например, до3) снижает вероятность подбора. Устанавливается вsshd_config.MaxAuthTries 3LoginGraceTime: Ограничивает время, отведенное пользователю на аутентификацию. По умолчанию — 2 минуты. Уменьшение (например, до30s) сокращает окно для медленных атак.LoginGraceTime 30sClientAliveIntervalиClientAliveCountMax: Предотвращают бесконечное удержание бездействующих SSH-сессий.ClientAliveIntervalотправляет сообщение keepalive каждые X секунд. Если пропущеноClientAliveCountMaxответов, соединение разрывается.ClientAliveInterval 300 ClientAliveCountMax 2Banner: Отображает предупреждающее сообщение перед аутентификацией. Это служит юридическим уведомлением для потенциальных неавторизованных пользователей.
Создайте файлBanner /etc/issue.net/etc/issue.netс вашим желаемым предупреждающим сообщением.
Практический вывод
Начните с изменений, которые устраняют наибольший риск: отключите вход от root, требуйте SSH-ключи, ограничьте, кто может подключаться, и, когда возможно, ограничьте исходные сети. Тестируйте каждое изменение с помощью sshd -t и новой сессии входа, прежде чем закрывать текущую.