Безопасное и удобное использование SSH

На сегодняшний день, системные инженеры, программисты имеют возможность безопасно управлять сервером на Linux удаленно с помощью консоли. Для Windows существуют специальные утилиты для подключения к Linux-серверам по SSH, такие как Putty, для пользователей MacOS и Linux можно использовать встроенный в операционную систему пакет ssh-client. Помимо SSH существуют и другие технологии удаленного доступа к физическим и виртуальным серверам: IPMI, VNC, RDP и прочие.

Изначально вместо SSH использовался протокол telnet, который в отличие от SSH не шифрует трафик от клиента к серверу, поэтому telnet сейчас считается устаревшим и используется в основном в интранете для управления маршрутизаторами и коммутаторами. Также утилита telnet позволяет быстро узнать работает тот или иной сервис на порту, например:

Положительный ответ утилиты telnet свидетельствует о том, что по данному адресу работает сервис, который слушает порт 53.

Вернемся к SSH.
С помощью таких утилит как scp, rsync, sftp мы можем не только управлять сервером, но и обмениваться с ним файлами по шифрованному соединению, вот как можно быстро отправить файл на сервер с помощью scp:

Правильная настройка сервера SSH позволит обезопаситься от взлома сервера, существует несколько правил, которые стоит учитывать при настройке SSH-сервера:

  • доступ на сервер должен быть только у тех, кому это действительно нужно
  • пароли подобрать гораздо легче чем ключи, поэтому желательно отказаться от паролей в пользу последних

Представим что Вы только что приобрели виртуальный сервер и получили доступы к нему от провайдера. Давайте попробуем подключиться к серверу:

В данном случае адрес сервера 10.0.0.9, пароль пользователя root: reoMeiMeiPh3eeF и мы подключаемся к серверу впервые, поэтому SSH задает вопрос, стоит ли добавлять этот сервер в список доверенных.
Список доверенных хостов находится в файле ~/.ssh/known_hosts
Мы успешно подключились к серверу.

На новом сервере в первую очередь необходимо сменить пароль пользователя root:

Создадим локального пользователя с именем tom и установим для него безопасный пароль:

Теперь вернемся к нашей рабочей машине и скопируем публичный ключ на сервер

Теперь мы можем подключаться к серверу без ввода пароля, с помощью ключа:

Сменим пользователя на root и сгенерируем ключи на сервере:

Настроим безопасный SSH-сервер:

# Отключает логин для root, разрешаем вход по ключу

# Доступ к графической оболочке нам не нужен

# Разрешаем вход только пользователю tom и группе family

# Разрешаем вход пользователю root с некоторых адресов

Для применения изменений перезагрузим сервис:

В данной конфигурации мы позволяем работать серверу ssh на стандартном порту 22 и только по протоколу версии 2 (протокол версии 1 считается устаревшим). Также мы запретили вход на сервер для root, вход по паролям, отключили отображение баннера и проброс X11, при этом разрешаем вход на сервер для пользователя tom и группы family.

Стоит заметить то, что боты периодически пытаются подобрать пароль к серверу, смена порта для SSH позволяет запутать большинство ботов, однако некоторые из них могут определять, на каком порту работает SSH-сервер. Для блокировки таких ботов можно использовать fail2ban, это позволит снизить трафик на сервер и избавиться от большого количества логов.

Пример установки fail2ban на CentOS 7.
Установим репозиторий epel и пакет fail2ban:

Создадим конфигурационный файл:

# Блокируем с помощью iptables

# Настройки почты для уведомлений

# Максимальное число попыток логина, после которого последует бан

# Время бана в секундах (24ч)

Запустим сервис и проверим, что создалась цепочка f2b-SSH в iptables:

Fail2ban отслеживает подключение к серверу SSH и в случае неправильного ввода пароля или неверного файла ключа 5 раз, блокирует адрес на 24 часа. С помощью fail2banможно блокировать адреса вручную или убирать из из блока:

Пример:

Помните как мы подключались к серверу изначально? Нам приходилось каждый раз вводить пароль при логине, затем мы пробросили свой публичный ключ на сервер и логиниться на сервер стало проще. Но можно сделать еще проще.
Например того чтобы каждый раз не писать:

мы можем логиниться на сервер с помощью команды:

Сделать это очень просто, создадим на рабочей машине конфиг для ssh:

И попробуем подключиться к нашему серверу:

Не требуется ни ввод пароля, ни помнить адрес пользователя и сервера.

Конечно, существуют и другие виды управления сервером, например VNC. VNC может быть удобен, если на сервере установлена графическая оболочка, однако такое случается редко, да и управлять сервером можно с помощью X11 и SSHD. Панели управления сервером, как правило ограничены в функциональности, а доступ к серверу напрямую через SSH дает полный контроль к серверу.