Настройка безопасности SSH на Linux: полное руководство по защите сервера
SSH (Secure Shell) — основной протокол удалённого управления серверами Linux. Каждый день тысячи ботов сканируют интернет в поисках открытых SSH-портов, пробуя стандартные логины и пароли. Даже в локальных сетях злоумышленник может медленно перебирать пароли, делая по одной попытке в минуту — и через несколько месяцев получить доступ. В этой статье разберём все ключевые методы защиты SSH-сервера: от базовых настроек sshd_config до двухфакторной аутентификации и аудита подключений.
Почему стандартная конфигурация SSH опасна?
По умолчанию SSH-сервер на большинстве дистрибутивов Linux настроен для удобства, а не для безопасности. Вот что обычно включено «из коробки»:
- Порт 22 — стандартный, сканируется ботами в первую очередь
- Парольная аутентификация — уязвима для брутфорса
- Разрешён вход root — атакующему достаточно подобрать один пароль
- Нет ограничения попыток — можно перебирать бесконечно
- Прослушивание на всех интерфейсах — SSH доступен отовсюду
Один незащищённый сервер в сети без файрвола — это открытая дверь. Разберём защиту по шагам.
Как перейти на авторизацию по SSH-ключам?
Ключевая аутентификация — самый важный шаг. Она полностью исключает брутфорс паролей. Алгоритм ed25519 считается наиболее безопасным и быстрым на сегодняшний день.
Генерация ключевой пары на клиенте
На вашей рабочей машине (не на сервере) выполните:
ssh-keygen -t ed25519 -C "admin@company.ru"
При запросе пароля (passphrase) рекомендуется задать его — это дополнительный уровень защиты. Если ключ будет скомпрометирован, без пароля его не использовать.
Копирование ключа на сервер
# Автоматическое копирование
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
# Или вручную
cat ~/.ssh/id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
После копирования проверьте подключение без пароля:
ssh user@server
Отключение парольной аутентификации
Убедившись, что ключи работают, отредактируйте /etc/ssh/sshd_config:
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
Примените изменения:
sudo systemctl restart sshd
Какие параметры sshd_config нужно изменить в первую очередь?
Файл /etc/ssh/sshd_config — центр управления безопасностью SSH. Вот обязательные параметры:
# Привязка к конкретному IP (не ко всем интерфейсам)
ListenAddress 192.168.1.10
# Смена стандартного порта
Port 54322
# Только протокол версии 2
Protocol 2
# Запрет входа root
PermitRootLogin no
# Время на аутентификацию — 10 секунд
LoginGraceTime 10
# Максимум попыток аутентификации за сессию
MaxAuthTries 3
# Максимум одновременных сессий
MaxSessions 3
# Отключить пустые пароли
PermitEmptyPasswords no
# Отключить X11-проброс (если не нужен)
X11Forwarding no
# Отключить TCP-форвардинг (если не нужен)
AllowTcpForwarding no
# Разрешить вход только определённым пользователям
AllowUsers admin deploy
# Баннер предупреждения
Banner /etc/ssh/banner.txt
ListenAddress особенно важен — если на сервер добавят новый сетевой интерфейс, SSH не будет автоматически слушать на нём. Это часто упускают из виду.Зачем менять порт SSH и как это сделать правильно?
Смена порта — не защита от целевых атак, но отсекает 99% автоматических ботов. Это простая мера с большим эффектом.
# /etc/ssh/sshd_config
Port 54322
Не забудьте открыть новый порт в файрволе до перезагрузки SSH:
# Для UFW
sudo ufw allow 54322/tcp
sudo ufw delete allow 22/tcp
# Для iptables
sudo iptables -A INPUT -p tcp --dport 54322 -j ACCEPT
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
Подробнее о настройке правил файрвола читайте в нашей статье iptables: настройка файрвола в Linux.
После перезагрузки SSH подключайтесь с указанием порта:
ssh -p 54322 user@server
~/.ssh/config на клиенте, чтобы не указывать порт каждый раз:Host myserver HostName 192.168.1.10 Port 54322 User admin IdentityFile ~/.ssh/id_ed25519Как настроить Fail2Ban для защиты от брутфорса?
Fail2Ban анализирует логи и блокирует IP-адреса после нескольких неудачных попыток входа. Это обязательный инструмент для любого Linux-сервера.
Установка
# Debian/Ubuntu
sudo apt install fail2ban -y
# CentOS/RHEL
sudo yum install epel-release -y
sudo yum install fail2ban -y
Настройка jail для SSH
Создайте файл /etc/fail2ban/jail.local (не редактируйте jail.conf — он перезапишется при обновлении):
[sshd]
enabled = true
port = 54322
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
ignoreip = 127.0.0.1/8 192.168.1.0/24
Параметры:
maxretry = 3— блокировка после 3 неудачных попытокbantime = 3600— блокировка на 1 час (3600 секунд)findtime = 600— попытки считаются за 10 минутignoreip— белый список IP (обязательно добавьте свои адреса)
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Проверка статуса
# Статус всех jail
sudo fail2ban-client status
# Детали по SSH
sudo fail2ban-client status sshd
# Разблокировать конкретный IP
sudo fail2ban-client set sshd unbanip 10.0.0.5
Как настроить двухфакторную аутентификацию SSH?
Двухфакторная аутентификация (2FA) добавляет одноразовый код к ключу или паролю. Даже если ключ украден, без второго фактора войти не получится.
Установка Google Authenticator
sudo apt install libpam-google-authenticator -y
Запустите настройку от имени пользователя (не root):
google-authenticator
Ответьте на вопросы:
- Time-based tokens — да (y)
- Update .google_authenticator — да (y)
- Disallow multiple uses — да (y)
- Rate limiting — да (y)
Отсканируйте QR-код приложением (Google Authenticator, Authy, Microsoft Authenticator) и сохраните резервные коды.
Настройка PAM и SSHD
Добавьте в /etc/pam.d/sshd:
auth required pam_google_authenticator.so
В /etc/ssh/sshd_config:
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
Перезапустите SSH:
sudo systemctl restart sshd
Как ограничить доступ по IP и подсетям?
Кроме ListenAddress в sshd_config, существуют дополнительные способы ограничения:
Через AllowUsers с привязкой к IP
# Разрешить admin только с определённой подсети
AllowUsers admin@192.168.1.*
# Несколько пользователей с разных адресов
AllowUsers admin@192.168.1.* deploy@10.0.0.*
Через TCP Wrappers
Файл /etc/hosts.allow:
sshd: 192.168.1.0/255.255.255.0
sshd: 10.0.0.0/255.255.255.0
Файл /etc/hosts.deny:
sshd: ALL
Через UFW/iptables
# Разрешить SSH только из офисной подсети
sudo ufw allow from 192.168.1.0/24 to any port 54322 proto tcp
sudo ufw deny 54322/tcp
Эти методы хорошо сочетаются с настройкой iptables и дают несколько уровней защиты.
Как настроить аудит SSH-подключений?
Мониторинг подключений — обязательная практика. Вы должны знать, кто, когда и откуда входил на сервер.
Основные команды аудита
# Последние успешные входы
last -n 20
# Неудачные попытки
sudo lastb -n 20
# Кто сейчас подключён
who
w
# Лог SSH в реальном времени
sudo tail -f /var/log/auth.log
# Для systemd
sudo journalctl -u sshd -f
Расширенное логирование в sshd_config
# Уровень логирования
LogLevel VERBOSE
С уровнем VERBOSE в логи попадут отпечатки ключей, что позволит идентифицировать конкретного пользователя:
# Пример лога
Accepted publickey for admin from 192.168.1.50 port 43210 ssh2: ED25519 SHA256:xxxxxxxxxxx
/etc/profile.d/ssh-notify.sh:echo "SSH Login: $(whoami) from $(echo $SSH_CLIENT | awk '{print $1}') at $(date)" | mail -s "SSH Alert" admin@company.ruПодробнее о мониторинге Linux-серверов читайте в нашей статье Мониторинг Debian-сервера.
Какие дополнительные меры безопасности SSH существуют?
Помимо основных настроек, есть продвинутые техники:
SSH-ловушка (Tarpit / Endlessh)
Endlessh — программа, которая висит на порту 22 и бесконечно медленно отправляет SSH-баннер. Боты «застревают» в ней на часы, не мешая реальному SSH на другом порту.
sudo apt install endlessh -y
# Настройте на порт 22, а реальный SSH — на нестандартный порт
Ограничение криптографических алгоритмов
# /etc/ssh/sshd_config — только современные алгоритмы
KexAlgorithms curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com
HostKeyAlgorithms ssh-ed25519
Автоматическое отключение неактивных сессий
# Отключать после 5 минут неактивности
ClientAliveInterval 300
ClientAliveCountMax 0
Как безопасно настроить межсерверное SSH-взаимодействие?
Для автоматизации (бэкапы, деплой, репликация) серверам нужно подключаться друг к другу без пароля. Как сделать это безопасно:
- Создайте отдельного пользователя с минимальными правами (например,
backup-agent) - Сгенерируйте ключи на сервере-источнике:
ssh-keygen -t ed25519 - Скопируйте ключ на целевой сервер:
ssh-copy-id backup-agent@target-server - Ограничьте команды в
authorized_keysна целевом сервере:
# ~/.ssh/authorized_keys на целевом сервере
command="/usr/local/bin/backup-only.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAA... backup-agent@source
Параметр command= разрешает выполнение только одной команды — даже если ключ скомпрометирован, злоумышленник не получит shell.
Как проверить текущую безопасность SSH-сервера?
После внесения всех настроек выполните проверку:
Тестирование конфигурации
# Проверка синтаксиса sshd_config
sudo sshd -t
# Показать активную конфигурацию
sudo sshd -T | grep -i "passwordauthentication\|permitrootlogin\|port\|listenaddress"
Аудит с помощью ssh-audit
# Установка
pip3 install ssh-audit
# Запуск аудита
ssh-audit localhost:54322
Утилита ssh-audit покажет используемые алгоритмы, уязвимости и рекомендации по улучшению.
Чеклист безопасности SSH
- Авторизация по ключам — включена
- Парольная аутентификация — отключена
- Вход root — запрещён
- Порт — нестандартный
- Fail2Ban — настроен и работает
- AllowUsers — ограничен список пользователей
- LogLevel — VERBOSE
- 2FA — настроена (для критичных серверов)
- Файрвол — SSH разрешён только из доверенных подсетей
Часто задаваемые вопросы (FAQ)
Почему нельзя оставлять SSH на стандартном порту 22?
Порт 22 сканируется ботами автоматически. Смена порта на нестандартный значительно снижает количество брутфорс-атак — по статистике, до 99% автоматического сканирования направлено именно на порт 22. Это не защита от целевых атак, но эффективно против массового сканирования.
Как настроить SSH-авторизацию по ключам вместо пароля?
Сгенерируйте ключевую пару командой ssh-keygen -t ed25519, скопируйте публичный ключ на сервер через ssh-copy-id, затем отключите парольную аутентификацию в /etc/ssh/sshd_config, установив PasswordAuthentication no. Обязательно протестируйте вход по ключу перед отключением паролей.
Что делать, если Fail2Ban блокирует мой IP?
Разблокируйте IP командой sudo fail2ban-client set sshd unbanip ВАШ_IP. Для предотвращения повторных блокировок добавьте свой IP или подсеть в параметр ignoreip в файле /etc/fail2ban/jail.local.
Нужно ли отключать вход root по SSH?
Да, это обязательная мера безопасности. Установите PermitRootLogin no в sshd_config. Используйте обычного пользователя с sudo. Если root-доступ необходим удалённо — разрешите только по ключу: PermitRootLogin prohibit-password.
Как проверить, кто подключался к серверу по SSH?
Используйте команды: last — список последних входов, lastb — неудачные попытки, journalctl -u sshd — полный лог SSH-демона. Для мониторинга в реальном времени: tail -f /var/log/auth.log.
Мы берём заботу о серверах вашей компании на себя
Настроим безопасный SSH-доступ, файрволы, мониторинг и резервное копирование. Защитим вашу инфраструктуру от взлома и обеспечим бесперебойную работу серверов.