Защита SSH — противодействие брутфорсу
После того как я приобрел свой виртуальный сервер стали напрашиваться незваные гости, стало происходить много попыток перебрать пароли для доступа по SSH, в логах /var/log/secure было множество записей о подключениях, поэтому я решил прибегнуть к защите SSH от взлома в целом.
1 2 3 4 5 | Apr 20 21:29:01 mail sshd[31941]: reprocess config line 54: Deprecated option RSAAuthentication Apr 20 21:29:01 mail sshd[31941]: reprocess config line 67: Deprecated option RhostsRSAAuthentication Apr 20 21:29:01 mail sshd[31941]: Invalid user er from 129.71.186.71 port 58054 Apr 20 21:29:01 mail sshd[31941]: input_userauth_request: invalid user er [preauth] Apr 20 21:29:01 mail sshd[31941]: Connection closed by 129.71.186.71 port 58054 [preauth] |
Необходимо как-то установить защиту SSH от взлома, для этого было принято несколько мер чтобы обезопасить сервер.
Первой мерой к противодействию было отключение авторизации по паролю, оставлен только вход по ключам, это напрочь убрало возможность брутфорса, только естественно добавляет неудобство везде носить собой закрытый ключ SSH.
Защита SSH — Генерируем ключи
Для работы по ключам необходимо их создать, это делается с помощью команды ssh-keygen, она предложит выбрать размещение и имя ключа, в большинстве случаев оставим это по умолчанию, генерируем их на своем ПК, а затем передадим публичный ключ на севрер:
1 2 3 | ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): |
Для передачи на сервер буду использовать:
1 | ssh-copy-id -i ~/.ssh/id_rsa.pub youruser@remote.server.host |
Если пути использовали по умолчанию, то при подключении ssh сам их подхватит.
Также можно создать файл с настройками для подключений, для удобства входа, в каталоге ~/.ssh/ создаем файл config с таким содержимым:
1 2 3 4 5 6 | ### Hosting host hosting hostname krasnodar-it-service.ru port 22 user root IdentityFile ~/.ssh/id_rsa |
Теперь для подключения достаточно ввести:
1 | ssh hosting |
Защита SSH — Запрещаем вход по паролям
Запрешение входа по паролю
Для более полной защиты от брутфорса я вообще отключил вход по паролям, настраивается это в /etc/ssh/sshd_config, добавил опцию
1 | PasswordAuthentication no |
Теперь при подключении без ключа, сразу выдается сообщение о запрете входа, без запроса пароля:
1 | rooer@krasnodar-it-service.ru: Permission denied (publickey). |
И в логах соответствующая запись:
1 | Apr 21 11:42:37 mail sshd[1807]: Invalid user rooer from 129.71.186.71 port 55578 |
Защита SSH — Разрешить вход по паролю из локальной сети
Для выборочного входа по паролю можно указать список сетей из которых будет возможен такая авторизация, добавляем в конец конфигурационного файла /etc/ssh/sshd_config:
1 2 | Match address <em>192.168.1.0</em>/24 PasswordAuthentication yes |
Хочу особо отметить почему необходимо размещать в конце файла: блок Match завершается либо когда достигает конец файла, либо когда встречается следующий блок.
Также есть и другие варианты ограничений и исключений
Настраиваем fail2ban
Вероятность взлома сервера уменьшилась, для еще большей безопасности был настроен fail2ban, у него из коробки уже идут настройки для защиты ssh соединений,
из соображений безопасности увеличил время нахождения в бане и увеличил время ожидания, файл /etc/fail2ban/jail.conf
1 2 3 4 5 6 | # "bantime" is the number of seconds that a host is banned. bantime = 240h # A host is banned if it has generated "maxretry" during the last "findtime" # seconds. findtime = 60m |
Установка нестандартного порта
И завершающим шагом была смена порта:
1 | Port 2222 |
В логах пропали записи о неудачных подключениях.