SSH — Secure Shell — протокол прикладного уровня, разработанный для обеспечения подключения к удалённому устройству и туннелирования TCP-соединений. Все данные, передающиеся по этому протоколу, шифруются — при этом допустимо выбирать различные алгоритмы — поэтому пользователь может безопасно вводить конфиденциальные данные и пароли.
cloud
SSH-протокол применяется для удалённого подключения. Так, любые облачные серверы, которые вы заказываете, могут быть доступны на расстоянии, несмотря на то, что устройства находятся в дата-центрах поставщика услуг.
Помимо администрирования удалённых серверов у вас есть возможность передавать данные между удалёнными устройствами благодаря специальным утилитам, работающим на основе протокола SSH, пример такой программы — SCP.
SSH-тоннелирование — ещё один пример применения протокола SSH. Оно используется для обеспечения защищённого соединения с сервером и создания зашифрованного канала или приватной сети.
SSH интегрирован в протокол SFTP, который обладает тем же набором функций, что и FTP, с той разницей, что вся информация на этом уровне шифруется.
Как было указано выше, все данные, которые передаются по протоколу, шифруются. В зависимости от того, как взаимодействуют между собой устройства, выделяют два подхода к шифрованию — асимметричное и симметричное.
В общих чертах процедура симметричного шифрования происходит следующим образом. Стороны обмениваются ключами, которые будут использоваться при шифровании.
Приватный ключ это не то же самое, что ключ авторизации. Его отличие в том, что он защищает ещё и непосредственно ввод и передачу логина и пароля пользователя.
В зависимости от настроек применяются различные методы шифрования: Blowfish, AES и другие. В результате используется первый в списке в файле конфигурации клиента, который поддерживается сервером.
В этом виде шифрования задействованы два ключа — приватный (private) и публичный (public).
Приватный ключ ни в коем случае не должен быть скомпрометирован, поскольку именно он предназначен для расшифровки информации. Публичный ключ, как следует из названия, можно раскрывать и передавать третьим лицам — получить из него приватный ключ никак не получится. Иными словами, механизм ассиметричного шифрования следующий: информация шифруются публичным ключом, а дешифруется приватным.
Пример такого шифрования — аутентификация на базе ключей. Сначала клиент создаёт пару ключей, после этого публичный ключ копируется в каталог ~/.ssh
на сервере. После установки соединения сервер отправляет проверочное сообщение, которое шифрует публичным ключом. Если клиент может его дешифровать, значит он — обладатель приватного ключа и имеет право на авторизацию. Поэтому крайне важно надёжно хранить приватный ключ.
Каждый набор данных после шифрования публичным ключом подписывается специальным хэшем. Хэширование — необратимая криптографическая обработка информации, в результате неё появляется уникальный набор символов. Поскольку алгоритм обработки не зависит от данных, при хэшировании одного набора данных получается одинаковый результат.
Это свойство механизма хэширования — основная причина его использования для верификации подлинности сообщений. В протоколе SSH верификация позволяет проверить, что данные не были перехвачены или подменены во время передачи.
Для генерации подписи используется хэш, основанный на порядковом номере пакета, его содержимом и приватном ключе.
Рассмотрим, как работает подключение через SSH в Linux и других ОС.
Сервер ожидает подключений на порту, который используется демоном sshd
(чаще всего — 22). Клиент, в свою очередь, создаёт подключение и определяет метод шифрования.
Когда между устанавливается TCP-соединение, стороны обмениваются различной вспомогательной информацией — поддерживаемыми методами шифрования, ключом public host и проч.
Далее ключ генерируется по алгориутму Диффи-Хеллмана, путём объединения ключей. Механизм работы алгоритма:
Основное преимущество этого процесса — ни клиент, ни сервер не контролируют генерацию ключа, хотя участвуют в процессе оба.
Чтобы без проблем подключаться к удалённому устройству по SSH, нужно, чтобы и клиент, и сервер были корректно сконфигурированы. Рассмотрим, как обеспечить на сервере Linux доступ по SSH.
1. В первую очередь нужно обновить репозиторий с помощью apt
:
sudo apt update
2. Далее устанавливаем набор программ OpenSSH:
sudo apt install openssh-server ssh
3. Запускаем sshd
и добавляем в автозагрузку с помощью systemd
:
sudo systemctl enable sshd
4. Проверям. Для этого, во-первых, смотрим статус работы sshd
:
sudo systemctl sshd status
5. Во-вторых, пробуем подключиться к самому серверу:
ssh localhost
Если вы видите предложение добавить отпечаток и диалоговое окно с вопросом, продолжать ли соединение, то всё настроено корректно. Далее разберёмся, что это значит.
Стандартная настройка на этом завершена. Однако рекомендуется выполнить ещё несколько простых шагов для повышения безопасности.
Настройка 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
Вы также имеете возможность ограничить 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 в Linux. Самый простой способ авторизации на сервере — войти с помощью пароля, который передаётся по защищённому соединению. Однако, рекомендуется не использовать этот метод, поскольку пароль может быть скомпрометирован, утерян или подобран злоумышленником перебором (брутфорс-атака).
В качестве альтернативы рекомендуется использовать вход по ключам.
Чтобы подключиться к серверу, воспользуйтесь командой:
ssh username@host, где username — имя пользователя, а host — сервер.
Выше — подключение с настройками по умолчанию, т. е. к 22 порту. В примере ниже мы изменили это значение на то, которое указали в конфигурации:
ssh -p 55222 username@host
Если не указывать учётную запись и написать просто ssh host
, попытка соединения будет устанавливаться с использованием имени текущего пользователя.
Ключ должен быть сгенерирован на стороне клиента. Для этого воспользуйтесь утилитой ssh-keygen
:
ssh-keygen -t rsa
В папке ~/.ssh
будет сгенерировано два файла:
id_rsa
— приватный ключ, на это намекают права: только владелец файла может читать и редактировать.id_rsa.pub
— публичный ключ, об этом говорит и расширение, и права: доступен для чтения всем.Далее нужно передать id_rsa.pub
на сервер. Для этих целей воспользуйтесь утилитой ssh-copy-id
:, указав имя сервера вместо host
:
ssh-copy-id host
Подготовили для вас выгодные тарифы на облачные серверы
SSH — незаменимый протокол для специалистов, работающих с удалёнными устройствами. Он позволяет настраивать серверы, размещать и забирать файлы. И всё это по защищённому каналу.
Чтобы разобраться, как работает протокол, рассмотрели подключение по SSH Linux-устройств и с паролем, и с ключами доступа. В этих целях арендовали сервер с ОС Ubuntu на Timeweb Cloud, настроили на нём протокол и авторизовались на сервере с удалённого компьютера через командную строку.