Протокол SSH
3
6153
25 мая 2020 22:07
25/05/2020
Visitors have accessed this post 6153 times.
Протокол SSH (Secure SHell) — один из основных и очень важных инструментов работы с Linux (тут надо отметить, что он может использоваться и для других платформ — OpenBSD, Windows, macOS). SSH применяется для зашифрованного соединения сервера и клиента путем создания защищенного соединения на удаленном компьютере. Используется прежде всего для управления удаленным сервером или компьютером.
Прародителями современного варианта SSH стали протоколы удаленного доступа Telnet и RSH. И хотя их задача была также в удаленной передаче информации, у них был ряд недостатков Так, RSH передавал информацию в незашифрованном виде, а значит, ее легко можно было перехватить.
Появление SSH позволило решить эти проблемы. Первоначально протокол разрабатывался как закрытый коммерческие проект, но позже стал развиваться в рамках OpenBSD, благодаря чему и приобрел свое полное название — OpenSSH. Сейчас широко используется вторая версия, первая значительно уступает ей в плане безопасности и возможностей.
Конфигурационные файлы
В OpenSSH входит две компоненты — ssh, собственно, клиентская часть, и sshd (серверная).
Серверный файл конфигурации можно найти в директории /etc/ssh, где sshd_config — это основной файл демона sshd. В нем можно задавать параметры для работы в системе — например, для аутентификаций, какие ключи используются и т.д.
Со стороны клиента файлы конфигурации лежат в ~/.ssh/ssh_config. Давайте разберемся, для чего нам нужно это знать. Если вы регулярно подключаетесь к разным системам, вам приходится хранить в памяти большое количество информации — их IP-адреса, названия портов, имена пользователей. В конфигурационном файле вы как раз можете прописать параметры для подключения, а еще изменить имена на более простые и удобные. Или же просто хранить там все данные, необходимые для подключения.
Вот так выглядят данные в конфигурационном файле клиента:
Host dev
HostName dev.valera.ru
User valera
Port 4422
Если вы запустите клиент ssh командой ssh dev, она возьмет из файла данные для соединения для хоста dev. Для нашего примера:
ssh -p 4422 valera@dev.valera.ru
Аутентификация при помощи ключа
В SSH для безопасности используется принцип асимметричного шифрования. При нем для обработки данных, которые мы передаем, используются 2 типа криптографических ключей — публичный или открытый и приватный или закрытый. Приватный ключ доступен только 1 человеку (устройству), а публичный ключ используется для передачи на удаленные сервера, к которым мы хотим получить доступ.
Каким образом в SSH работает подтверждение личности пользователя? На сервер отправляется публичный ключ клиента и при помощи него шифруется случайная строка. Затем сервер запрашивает у аутентифицируемого клиента расшифровку. а сделать ее возможно только с использованием приватного ключа. После этого разрешается доступ на сервер.
При применении ключей пароль для входа на сервер не нужен.
Открытый ключ можно найти в домашней директории пользователя ~/.ssh/authorized_keys. Чтобы сгенерировать ключи, используется команда:
ssh-keygen -t rsa -b 4096 -C "your_email@domain.com"
ssh-keygen — это утилита для генерации ключей.
Помимо собственно генерации ключей она может использоваться для получения публичного ключа из приватного. Для этого используется запрос:
ssh-keygen -y -f $PATH_TO_PRIVATE_KEY;
Полученный публичный ключ нужно скопировать на сервер при помощи команды:
ssh-copy-id username@hostname
После ввода пароля ключ появится в конфигурационном файле.
Чтобы перейти к удаленному серверу без пароля, достаточно загрузить ключ. Это существенно упрощает вход и при этом повышает уровень безопасности.
Если в файле конфигурации несколько закрытых ключей, то они будут проверяться сервером по очереди, пока не будет найден разрешенный.
Раз мы заговорили о безопасности, стоит сказать еще пару моментов, которые повышают безопасность протокола SSH. Для проверки сервера как устройства, к которому раньше уже производилось подключение, также используется ключ. В момент первого подключения у клиента сохраняется ключ сервера, он и нужен для подтверждения. Перечень всех хостов, к которым производилось подключение, можно найти в ~/.ssh/known_hosts.
Кроме того, весь трафик между хостами дополнительно шифруется синхронным алгоритмом шифрования.
Как установить клиентский OpenSSH
OpenSSH для клиента вызывается из терминала командой ssh. Клиентский пакет OpenSSH также предоставляет другие утилиты SSH, такие как scp и sftp, которые устанавливаются вместе с командой ssh.
Для Linux
Большинство дистрибутивов уже включают SSH, так как SSH команды Linux администраторы используют достаточно широко. Если же его по каким-то причинам нет, используйте менеджер пакетов дистрибутива для установки.
Для Windows
В последних версия Windows 10 (не ниже версии 1809) уже есть клиент-серверная часть OpenSSH, для их установки используется графический интерфейс или PowerShell.
Чтобы установить OpenSSH, вам нужно выполнить следующие действия.
1. Найти имя пакета
Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
2. В ответ вам вернется имя.
Name : OpenSSH.Client~~~~0.0.2.0
State : NotPresent
Name : OpenSSH.Server~~~~0.0.2.0
State : NotPresent
3. Выполните установку.
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.2.0
Пример вывода при успешной установке:
Path :
Online : True
RestartNeeded : False
Для Debian и Ubuntu
Для установки используйте команду:
sudo apt update
sudo apt install openssh-client
Примечание. В ОС MacOS клиент OpenSSH предустановлен по умолчанию.
Основные ssh команды
Для работы с SSH должно быть выполнено несколько условий.
- SSH запущен на удаленном компьютере, и в его файрволе открыт порт SSH.
- У учетной записи настроена возможность удаленного входа, у вас есть данные по имени пользователя и паролю.
Основная команда ssh — ssh [OPTIONS] [USER@]:HOST
Для запуска в терминале нужно ввести команду и имя хоста, к которому подключаетесь:
ssh ssh.valera.ru
Если вы подключаетесь к хосту впервые, программа попросит подтвердить, что данное имя хоста нужно сохранить в ~/.ssh/known_hosts, и ввести пароль.
После ввода пароля вы сможете войти на удаленную машину.
Если вы не указываете имя пользователя, то будет использовано текущее имя. Для того чтобы войти под другим пользователем, вам нужно использовать следующую команду ssh username@hostname или определить имя пользователя аргументом -l:
ssh -l username hostname
Если вы не укажете порт, то по умолчанию для подключения будет использоваться 22 порт.
Чтобы изменить порт, используется опция -p:
ssh -p 7722 username@hostname
Переадресация SSH-портов
Переадресация используется для того, чтобы создать шифрованное соединение, например, для передачи данных, не поддерживающих протоколы шифрования или для обходов межсетевого экрана.
Типы переадресации SSH-портов:
- Переадресация локальных портов
- Переадресация удаленных портов
- Динамическая переадресация
В первом случае соединение от хоста клиента переадресуется сперва на сервер SSH и только затем на хост назначения.
Для локальной переадресации портов используется аргумент -L:
ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION_HOST:DESTINATION_PORT username@hostname
В случае переадресации удаленных портов соединение от сервера переадресуется на хост клиента и затем уже на хост назначения.
Для нее также используется -L, но указывается удаленный порт:
ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT -N -f username@hostname
При динамической переадресации создается прокси-сервер SOCKS, через него осуществляется соединение нескольких портов.
Для его создания используется опция -D:
ssh -R [LOCAL_IP:]LOCAL_PORT -N -f username@hostname
Утилита SSH — одна из самых важных в ОС Linux. Мы рассмотрели основные моменты, но, конечно, всегда можно «копать глубже». Если самостоятельное изучение Linux кажется вам слишком сложным и вы не знаете, с чего начать, рекомендуем посмотреть программу нашего практикума Linux by Rebrain.
Каждую неделю мы в live режиме решаем кейсы на наших открытых онлайн-практикумах, присоединяйтесь к нашему каналу в Телеграм, вся информация там.