С чего начинается сервер?
Со входа по SSH
Secure shell — основной инструмент для управления сервером. То, с чего начинается работа системного администратора.
По умолчанию служба работает на 22 порту и подвержена множеству опасностей: брутфорс паролей ботнетом, целенаправленному подбору хакерами и даже DDoS. А утечка паролей и потеря доступа к серверу может привести к катастрофическим последствиям для бизнеса и психики.
В этой статье мы расскажем, как сделать доступ по SSH максимально закрытым и избавить себя от всевозможных рисков.
Важный момент: следует делать всё аккуратно и иметь в соседней вкладке терминала рабочую сессию, чтобы в случае возникновения проблем не выстрелить себе в колено была возможность откатить изменения.
Конфиг SSH
Первым делом правим в конфиге демона SSH:
/etc/ssh/sshd_config
И меняем дефолтные параметры:
Port 1480
Порт, на котором будет располагаться служба. Рекомендуется ставить значение выше 1024 — так как значения ниже зарезервированы определенными службами и чаще «пробиваются» сканерами портов. Максимальное возможное значение — 65535.
В этом случае при коннекте необходимо добавлять ключ -p
, пример ssh -p 4596 sanya@188.120.242.222
PubkeyAuthentication yes
Разрешаем аутентификацию по ключам SSH. Рекомендуется использовать алгоритм Ed25519
. В этом случае закрытый ключ хранится на вашем ПК, а открытый добавляется на сервер в файл .ssh/authorized_keys
в директории нужного юзера.
PermitEmptyPasswords no PasswordAuthentication no
Отключение авторизации по паролю — каким бы он не был надежным, всегда есть вероятность его подбора. Важно убедиться, что подключение по SSH-ключам работает, иначе подключиться к серверу без VNC или rescue вы не сможете.
ListenAddress 188.120.242.222
Если на сервере несколько IP-адресов, то этим параметром мы указываем, какой именно IP на сервере должна слушать служба.
LoginGraceTime 1m
По умолчанию при подключении по SSH у вас есть две минуты, чтобы ввести пароль. Если не успеете, то соединение будет прервано. Ставим минуту или даже тридцать секунд.
опционально:
PermitRootLogin no
Отключаем авторизацию суперпользователя root. Он имеет неограниченную власть над системой и именно к нему чаще всего пытаются подобрать пароль. Важно, чтобы в системе уже были созданы другие пользователи с sudo-правами, под которыми в дальнейшем будет осуществляться подключение по SSH.
AllowUsers Darya Tolik
Разрешаем доступ по SSH только определенным юзерам. Чтобы они имели возможность получить доступ к привилегиям суперпользователя, необходимо внести их в файл /etc/sudoers
или добавить юзера в группу sudo
. Например usermod -aG sudo Tolik
.
ClientAliveInterval 600
Задается время (в секундах) бездействия сессии, после чего она будет прервана. Важно не ставить низкие значения, иначе кроме неудобств при работе вам это ничего не принесёт.
ClientAliveCountMax 0
Количество проверок активности сессии, тесно связанный с предыдущим параметром. Если в течение заданного количества попыток (по умолчанию три) сервер не получит ответа, то соединение завершится. Так как мы выставили значение ClientAliveInterval равное десяти минутам, то этот параметр можно выключить, задав ноль.
После всех настроек перезапускаем SSH ( текущая сессия при этом не обрывается):
service sshd restart
На выходе мы получаем нестандартный порт, который слушает определенный диапазон IP-адресов и доступ возможен только по ключу SSH или сверхнадежному паролю и не юзеру root. Как его сгенерировать и где хранить, можно прочитать в другой нашей статье.
Фаервол
Помимо изменения настроек самой службы, следует также разрешить подключение только с определенных IP-адресов с помощью Iptables и блокировать слишком частые попытки авторизоваться с неправильным паролем используя Fail2ban.
Iptables
Утилита для управления брандмауэром netfiler. Установлена по умолчанию. Пример команды:
iptables -A INPUT -s 93.94.176.0/21 -p tcp --dport 22 -j ACCEPT
Которая разрешает подключение по 22 порту из указанной подсети — если вы меняли порт на предыдущем шаге, то следует заменить его и здесь.
Для остальных диапазонов IP подключение можно запретить правилом:
iptables -A INPUT -p tcp -m tcp --dport 22 -j DROP
Если вы ранее изменяли порт SSH, то соответственно необходимо поправить и правило.
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
Если в течение пяти минут будет три неудачных попыток авторизации, то адрес, попавший под санкции, будет заблокирован на два часа.
Список заблокированных адресов можно будет посмотреть командой:
root@api:~# 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
И перезапускаем SSH командой service sshd restart
Теперь при подключении к серверу после ввода пароля будет запрашиваться код подтверждения.
Панели управления
Помимо самого сервера нужно также позаботиться и о доступах в личный кабинет и панель управления сервером. Имея доступ к VNC или кнопкам управления, злоумышленник может, например, переустановить ОС на сервере и все данные будут утеряны. Или бесконечно прожимать кнопку перезагрузки, что тоже неприятно.
В панелях управления Billmanager/VMmanager/DCImanager/ispmanager вы можете также настроить двухфакторную аутентификацию через Google Autentificator.