По умолчанию служба работает на 22 порту и подвержена множеству опасностей: брутфорс паролей ботнетом, целенаправленному подбору хакерами и даже DDoS. А утечка паролей и потеря доступа к серверу может привести к катастрофическим последствиям для бизнеса и психики.
В этой статье рассмотрим, как сделать доступ по SSH максимально закрытым и избавить себя от всевозможных рисков на примере Debian/Ubuntu.
Конфиг SSH
Первым делом правим в конфиге демона SSH:
sudo nano /etc/ssh/sshd_config
Порт, на котором будет располагаться служба. Рекомендуется ставить значение выше 1024
— так как значения ниже зарезервированы определенными службами и чаще «пробиваются» сканерами портов. Максимальное возможное значение — 65535
:
Port 29947
В этом случае при коннекте необходимо добавлять ключ -p
, пример:
ssh -p 29947 www-root@196.69.117.250
Разрешаем аутентификацию по ключам SSH. Рекомендуется использовать алгоритм Ed25519
. В этом случае закрытый ключ хранится на вашем ПК, а открытый добавляется на сервер в файл .ssh/authorized_keys
в директории нужного юзера:
PubkeyAuthentication yes
Отключение авторизации по паролю — каким бы он не был надежным, всегда есть вероятность его подбора. Важно убедиться, что подключение по SSH-ключам работает, иначе подключиться к серверу без VNC или rescue вы не сможете:
PermitEmptyPasswords no
PasswordAuthentication no
Если на сервере несколько IP-адресов, то этим параметром мы указываем, какой именно IP на сервере должна слушать служба:
ListenAddress 79.105.28.83
По умолчанию при подключении по SSH у вас есть две минуты, чтобы ввести пароль. Если не успеете, то соединение будет прервано. Ставим минуту или даже тридцать секунд:
LoginGraceTime 1m
Отключаем авторизацию суперпользователя root
. Он имеет неограниченную власть над системой и именно к нему чаще всего пытаются подобрать пароль. Важно, чтобы в системе уже были созданы другие пользователи с sudo-правами
, под которыми в дальнейшем будет осуществляться подключение по SSH:
PermitRootLogin no
Разрешаем доступ по SSH только определенным пользователям. Чтобы они имели возможность получить доступ к привилегиям суперпользователя, необходимо внести их в файл /etc/sudoers
или добавить юзера в группу sudo
. Например, usermod -aG sudo www-root
:
AllowUsers www-root vasya
Задается время (в секундах) бездействия сессии, после чего она будет прервана. Важно не ставить низкие значения, иначе кроме неудобств при работе вам это ничего не принесёт:
ClientAliveCountMax 0
Количество проверок активности сессии, тесно связанный с параметром ClientAliveCountMax
. Если в течение заданного количества попыток (по умолчанию три) сервер не получит ответа, то соединение завершится. Так как мы выставили значение ClientAliveInterval
равное десяти минутам, то этот параметр можно выключить, задав ноль.
После всех настроек перезапускаем SSH (текущая сессия при этом не обрывается):
sudo service sshd restart
Фаервол
Помимо изменения настроек самой службы, следует также разрешить подключение только с определенных IP-адресов с помощью Iptables
и блокировать слишком частые попытки авторизоваться с неправильным паролем используя Fail2ban
.
Iptables:
Утилита для управления брандмауэром netfiler
. Установлена по умолчанию. Пример команды:
iptables -I INPUT -p tcp --dport 29947 -j ACCEPT
Fail2ban:
Ставится командами apt/yum install fail2ban
в зависимости от используемой ОС. Чтобы включить службу в автозагрузку используйте systemctl enable fail2ban
После установки защита SSH работает сразу. Можно подправить правила в файле /etc/fail2ban/jail.conf
или создать отдельный конфиг /etc/fail2ban/jail.d/ssh.conf
В секции [ssh]
указываем желаемые параметры:
Пример настроек секции:
[sshd]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
findtime = 300
maxretry = 5
bantime = 7200
Если в течение пяти минут будет три неудачных попыток авторизации, то адрес, попавший под санкции, будет заблокирован на два часа.
Список заблокированных адресов можно будет посмотреть командой:
fail2ban-client status sshd
Пример вывода:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/ssh-auth.log
`- Actions
|- Currently banned: 11
|- Total banned: 34
`- Banned IP list: 118.172.217.23 123.207.231.244 138.68.75.113 150.158.179.239 154.221.19.204 192.144.171.119 20.46.114.59 202.115.29.234 45.135.232.165 46.101.132.159
Таким образом, мы разрешаем подключаться только из определенной подсети, а частые неудачные попытки будут блокироваться.
Двухфакторная аутентификация
2FA уже плотно вошла в нашу жизнь — это удобно и безопасно. Почему бы не сделать это и на сервере?
Вам нужно установить пакет libpam-google-authenticator
— на современных ОС он доступен в штатных репозиториях. После установки пакета запускаем команду:
google-authenticator
И утвердительно отвечаем на вопрос:
Do you want authentication tokens to be time-based (y/n) y
После чего появится окно с QR-кодом, кодом верификации и резервные пароли:
Сохраняем код себе, добавляем ключ в приложение.
Далее последует вопрос, сохранить ли конфигурацию в файле .google_authenticator
домашней директории. Отвечаем утвердительно на этот и все последующие вопросы.
После чего в конфиге /etc/pam.d/sshd
добавляем строку:
auth required pam_google_authenticator.so
Меняем в /etc/ssh/sshd_config
параметр ChallengeResponseAuthentication
на yes
:
ChallengeResponseAuthentication yes
Перезапускаем SSH:
sudo service sshd restart
Теперь при подключении к серверу после ввода пароля будет запрашиваться код подтверждения.
Комментарии (0)
Пока еще не было комментариев ✍️