Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Кратко о задаче
SSH-протокол применяется для удалённого подключения. Так, любые облачные серверы, которые вы заказываете, могут быть доступны на расстоянии, несмотря на то, что устройства находятся в дата-центрах поставщика услуг.
Помимо администрирования удалённых серверов у вас есть возможность передавать данные между удалёнными устройствами благодаря специальным утилитам, работающим на основе протокола SSH, пример такой программы — SCP.
SSH-тоннелирование — ещё один пример применения протокола SSH. Оно используется для обеспечения защищённого соединения с сервером и создания зашифрованного канала или приватной сети.
SSH интегрирован в протокол SFTP, который обладает тем же набором функций, что и FTP, с той разницей, что вся информация на этом уровне шифруется.
Как было указано выше, все данные, которые передаются по протоколу, шифруются. В зависимости от того, как взаимодействуют между собой устройства, выделяют два подхода к шифрованию — асимметричное и симметричное.
В общих чертах процедура симметричного шифрования происходит следующим образом. Стороны обмениваются ключами, которые будут использоваться при шифровании.
Приватный ключ это не то же самое, что ключ авторизации. Его отличие в том, что он защищает ещё и непосредственно ввод и передачу логина и пароля пользователя.
В зависимости от настроек применяются различные методы шифрования: Blowfish, AES и другие. В результате используется первый в списке в файле конфигурации клиента, который поддерживается сервером.
В этом виде шифрования задействованы два ключа — приватный (private) и публичный (public).
Приватный ключ ни в коем случае не должен быть скомпрометирован, поскольку именно он предназначен для расшифровки информации. Публичный ключ, как следует из названия, можно раскрывать и передавать третьим лицам — получить из него приватный ключ никак не получится. Иными словами, механизм ассиметричного шифрования следующий: информация шифруются публичным ключом, а дешифруется приватным.
Пример такого шифрования — аутентификация на базе ключей. Сначала клиент создаёт пару ключей, после этого публичный ключ копируется в каталог ~/.ssh на сервере. После установки соединения сервер отправляет проверочное сообщение, которое шифрует публичным ключом. Если клиент может его дешифровать, значит он — обладатель приватного ключа и имеет право на авторизацию. Поэтому крайне важно надёжно хранить приватный ключ.
Каждый набор данных после шифрования публичным ключом подписывается специальным хэшем. Хэширование — необратимая криптографическая обработка информации, в результате неё появляется уникальный набор символов. Поскольку алгоритм обработки не зависит от данных, при хэшировании одного набора данных получается одинаковый результат.
Это свойство механизма хэширования — основная причина его использования для верификации подлинности сообщений. В протоколе SSH верификация позволяет проверить, что данные не были перехвачены или подменены во время передачи.
Для генерации подписи используется хэш, основанный на порядковом номере пакета, его содержимом и приватном ключе.
Коротко о принципе работы SSH
Рассмотрим, как работает подключение через SSH в Linux**** и других ОС.
Сервер ожидает подключений на порту, который используется демоном sshd (чаще всего — 22). Клиент, в свою очередь, создаёт подключение и определяет метод шифрования.
Когда между устанавливается TCP-соединение, стороны обмениваются различной вспомогательной информацией — поддерживаемыми методами шифрования, ключом public host и проч.
Далее ключ генерируется по алгориутму Диффи-Хеллмана, путём объединения ключей. Механизм работы алгоритма:
- Стороны генерируют одинаковое число и выбирают стандарт шифрования.
- Далее обе стороны выбирают новое число и не сообщают друг другу о нём.
- Сгенерированное на шаге 2 число используется в качестве приватного ключа, а число из пункта 1 — публичного.
- Стороны передают публичные ключи друг другу.
- Вычисляя общий секрет, каждая сторона использует свой приватный ключ и чужой публичный. Его используют для симметричного шифрования.
Основное преимущество этого процесса — ни клиент, ни сервер не контролируют генерацию ключа, хотя участвуют в процессе оба.
Настройка SSH на стороне сервера
Чтобы без проблем подключаться к удалённому устройству по SSH, нужно, чтобы и клиент, и сервер были корректно сконфигурированы. Рассмотрим, как обеспечить на сервере Linux доступ по SSH.
1. В первую очередь нужно обновить репозиторий с помощью apt:
2. Далее устанавливаем набор программ OpenSSH:
sudo apt install openssh-server ssh3. Запускаем sshd и добавляем в автозагрузку с помощью systemd:
sudo systemctl enable sshd4. Проверям. Для этого, во-первых, смотрим статус работы sshd:
sudo systemctl sshd status5. Во-вторых, пробуем подключиться к самому серверу:
Если вы видите предложение добавить отпечаток и диалоговое окно с вопросом, продолжать ли соединение, то всё настроено корректно. Далее разберёмся, что это значит.
Стандартная настройка на этом завершена. Однако рекомендуется выполнить ещё несколько простых шагов для повышения безопасности.
Настройка SSH задаётся в файле****/etc/ssh/sshd_config.
Замена стандартного порта
Порт SSH по умолчанию — 22. Многие специалисты рекомендуют менять это значение на любое другое (можно выбрать любой порт от 50000 до 65000). Причина в том, что, если устройство находится в общей сети и доступен из интернета, он неизбежно будет подвергаться атакам и автоматическим попыткам взлома. Даже если механизм авторизации надёжен, сервер всё равно выполняет немало работы: журналирование попыток входа, установление соединения, генерация ключа и так далее.
Если заменить порт или закрыть его с помощью таблиц маршрутизации iptables, нагрузка существенно снизится — соединения с 25 портом будут отсекаться ещё на этапе установки соединения.
sudo nano /etc/ssh/sshd_configНаходим переменную Port 22 и заменяем 22 на, например, 55222. Если настройки SSH стандартные, не забудьте раскоментировать строку.
Смена стандартного порта повышает безопасность, но не гарантирует то, что злоумышленники не узнают, какое значение вы указали в файле конфигурации, — существует программное обеспечение, которое сканирует порты сервера.
В качестве ещё одной меры безопасности закроем удалённый доступ учётной записи root, так как иначе злоумышленники при попадании в систему получат неограниченные полномочия.
Ограничим доступ, установив флаг переменной PermitRootLogin на no.
Ограничение авторизации по паролю
Следующий шаг — запрет входа по паролю. Вместо этого включим принудительное использование ключей, присвоив переменной PasswordAuthentication флаг no.
Затем перезапустите демон sshd:
sudo systemctl restart sshdОграничение доступа по IP
Вы также имеете возможность ограничить SSH-соединение Linux-сервера, дав доступ ограниченному диапазону IP-адресов. Чтобы это сделать, откройте файл****/etc/hosts.deny:
sudo nano /etc/hosts.deny… и добавьте строку sshd: ALL.
В конфиге /etc/hosts.allow укажите разрешённые IP-адреса:
sudo nano /etc/hosts.allow
sshd: 182.10.0.1 182.10.0.10Если вы подключаетесь с Windows-устройств, можете использовать специальные приложения. Например, PuTTY, WinSCP или Termius. Если работаете в unix-системах, вам доступно**** подключение по SSH из консоли Linux или terminal напрямую.
В качестве альтернативы рекомендуется использовать вход по ключам.
Чтобы подключиться к серверу, воспользуйтесь командой:
_ssh username@host_ , где username — имя пользователя, а host — сервер.Выше — подключение с настройками по умолчанию, т. е. к 22 порту. В примере ниже мы изменили это значение на то, которое указали в конфигурации:
ssh -p 55222 username@hostЕсли не указывать учётную запись и написать просто __ssh host, попытка соединения будет устанавливаться с использованием имени текущего пользователя.
Ключ должен быть сгенерирован на стороне клиента. Для этого воспользуйтесь утилитой ssh-keygen:
В папке ~/.ssh будет сгенерировано два файла:
id_rsa— приватный ключ, на это намекают права: только владелец файла может читать и редактировать.id_rsa.pub— публичный ключ, об этом говорит и расширение, и права: доступен для чтения всем.
Далее нужно передать id_rsa.pub на сервер. Для этих целей воспользуйтесь утилитой ssh-copy-id:, указав имя сервера вместо host:
Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.