По умолчанию служба работает на 22 порту и подвержена множеству опасностей: брутфорс паролей ботнетом, целенаправленному подбору хакерами и даже DDoS. А утечка паролей и потеря доступа к серверу может привести к катастрофическим последствиям для бизнеса и психики.

В этой статье рассмотрим, как сделать доступ по SSH максимально закрытым и избавить себя от всевозможных рисков на примере Debian/Ubuntu.

Используйте только те опции (настройки), которые необходимы конкретно вам в данное время.
Важный момент! Следует делать всё аккуратно и иметь в соседней вкладке терминала рабочую сессию, чтобы в случае возникновения проблем не выстрелить себе в колено была возможность откатить изменения.

Первым делом правим в конфиге демона 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] указываем желаемые параметры:

  • ignoreip — список адресов, которые не будут блокироваться при истечении неудачных попыток авторизации. Сюда следует добавить IP-адреса, к которым будете подключаться к серверу.
  • findtime — интервал времени, в течение которого считаются попытки подключения. Стандартное значение — 10 минут, рекомендуем ставить значение меньше, например, 5 минут.
  • maxretry — собственно, количество неудачных попыток авторизации перед тем, как адрес будет заблокирован. Ставим 5.
  • bantime — время, на которое будет блокироваться подозрительный адрес.

Пример настроек секции:

[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

Сохраняем код себе, добавляем ключ в приложение.

Далее последует вопрос, сохранить ли конфигурацию в файле .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

Теперь при подключении к серверу после ввода пароля будет запрашиваться код подтверждения.