SSH: что это и как им пользоваться — гайд для новичков
Теоретические основы с иллюстрациями и практика на GitHub.


Иллюстрация: Катя Павловская для Skillbox Media
После регистрации на GitHub вы получаете профиль с настроенным HTTPS-соединением. Это протокол для безопасной загрузки и скачивания данных из удалённого репозитория. Однако не все компании предпочитают HTTPS и по разным причинам просят своих разработчиков выбирать альтернативу — протокол SSH.
В статье мы познакомимся с SSH-соединением и научимся перенастраивать под него профиль на GitHub. Перед практикой будет теоретический блок, объясняющий принципы работы технологии. Вы узнаете, как данные переходят с устройств на удалённые серверы и почему это безопасно.
Если вы только начинаете использовать GIt, рекомендуем перед настройкой SSH-соединения почитать про GitHub.
Из статьи вы узнаете:
- что такое протокол SSH;
- как он работает;
- как создать приватный и публичные ключи для SSH-шифрования;
- как настроить SSH-соединение на GitHub.

Дмитрий Зайцев
Эксперт
CTO Flocktory, программный директор профессии «DevOps-инженер» в Skillbox, директор программного комитета DevOpsConf.
Что такое SSH и зачем он создан
До внедрения SSH для удалённого подключения был популярен протокол Telnet, известный как Teletype Network. Он позволял запускать терминальные команды, передавать файлы, обновлять данные — то есть решал множество задач системного администрирования. Однако Telnet был уязвим к атакам, поскольку открыто передавал данные и не защищал трафик от перехвата. Причина: протокол появился в 1969 году, когда инженеры разворачивали интернет. Тогда масштабирование было приоритетнее безопасности.

Покажем уязвимость открытой передачи данных на примерах. Пользователь отправляет незашифрованный файл через Telnet. Если злоумышленник отслеживает сетевые узлы, то сможет получить доступ к содержимому файла.
Пользователь может зашифровать файл перед отправкой через Telnet. Однако если отправитель и получатель не встретятся лично, то дешифровочный ключ придётся высылать по сети. Так злоумышленник получит файл и ключ к нему.

Иллюстрация: Оля Ежак для Skillbox Media
На смену Telnet пришёл SSH. SSH (Secure Shell — защищённая оболочка) — это протокол прикладного уровня для удалённого обмена данными между устройствами. Он основан на взаимодействии приватного и публичного ключей, которые защищают трафик алгоритмом асимметричного шифрования.
Представьте, что первому пользователю нужно получить файл от второго пользователя. Он берёт ключ и открытый замок, а затем действует так: ключ оставляет себе, а открытый замок передаёт по сети. Замок доходит до адресата и достаётся злоумышленнику. Файл с данными пока не передан.

Иллюстрация: Оля Ежак для Skillbox Media
Второй пользователь закрывает файл на замок и высылает его обратно. Закрытый замок попадает к первому пользователю и к злоумышленнику. Первый пользователь открывает замок своим ключом и достаёт файл. У злоумышленника есть открытый и закрытый замок, но без ключа он не сможет извлечь файл. Так стороны могут безопасно обмениваться данными.

Иллюстрация: Оля Ежак для Skillbox Media
В концепции SSH открытый замок представляет публичный ключ, или public key. Ключ от замка — приватный ключ, или private key. С помощью публичного ключа мы шифруем данные, а с помощью приватного — расшифровываем. Без приватного ключа даже владелец данных не получит к ним доступа. Приватный ключ важно беречь.

Иллюстрация: Оля Ежак для Skillbox Media
Если не упрощать объяснение, то реализация SSH-протокола происходит в несколько этапов. Это механизм, включающий в себя установку защищённого соединения, аутентификацию и обмен данными между клиентом и сервером.
- Клиент отправляет серверу ID своего публичного ключа. Таким образом он заявляет, что обладает соответствующим приватным ключом.
- Сервер шифрует публичным ключом случайное сообщение и отправляет клиенту. Клиент должен это сообщение расшифровать и отправить в ответ.
- Для проверки аутентификации клиент должен расшифровать сообщение и передать его в зашифрованном виде обратно на сервер. Так он докажет, что действительно обладает приватным ключом. Иначе запрос будет отклонён.
- Клиент и сервер договариваются об общем секретном ключе. Безопасное согласование такого ключа обеспечивает криптопротокол Диффи — Хеллмана.
- Стороны выбирают метод шифрования трафика. Сейчас часто используют AES-256, AES-192 и AES-128 — выбор зависит от согласия сторон и настроек безопасности сервера. Однако алгоритмы безопасности периодически обновляются, поэтому важно ориентироваться на современный стандарт.
После успешного прохождения аутентификации клиент и сервер могут безопасно обмениваться данными по зашифрованному каналу.

Изображение: Майя Мальгина для Skillbox Media
Как работает алгоритм шифрования SSH
По умолчанию SSH использует алгоритм RSA. Это математическая модель для реализации шифрования данных с помощью одного ключа и их расшифровки с помощью другого. Преобразование строится по принципу работы обратной функции: функция зашифровывает данные, а обратная функция их расшифровывает.
Для лучшего понимания работы обратной функции рассмотрим пример с комплементарным подбором цветов на круге Иттена. В цветовом круге у каждого цвета есть дополнительный цвет. Дополнительный цвет находится на противоположной стороне круга и отделён от основного цвета белой зоной. Примеры: красный и зелёный, жёлтый и фиолетовый, оранжевый и голубой.

Иллюстрация: Skillbox Media
Пользователи решили обменяться цветами. Первый участник выбирает цвет и определяет его дополнительный цвет. Дополнительный цвет попадает к адресату и злоумышленнику. Об основном цвете злоумышленник не знает.

Иллюстрация: Оля Ежак для Skillbox Media
Второй пользователь смешивает дополнительный цвет со своим — тем, что он хотел выслать в ответ. Получается новый цвет — результирующий. Результирующий цвет доходит до адресата и достаётся злоумышленнику.

Иллюстрация: Оля Ежак для Skillbox Media
Первый пользователь смешивает результирующий цвет со своим исходным. Получается цвет, который передал второй пользователь. У злоумышленника есть дополнительный цвет от первого пользователя и результирующий от второго. Если он смешает свои цвета, то не узнает загаданный цвет.

Иллюстрация: Оля Ежак для Skillbox Media
В алгоритмах шифрования происходят похожие процессы, но вместо цветов используются данные. Приватный ключ не хранится на сервере, а публичный ключ можно пересылать по сети. Если злоумышленник перехватит публичный ключ, то не сможет им воспользоваться. Остаётся как-то случайно подобрать приватный SSH-ключ. Однако это маловероятно, поскольку речь о длинной цепочке произвольно сгенерированных цифр и букв. Примеры будут далее.
Помимо RSA, встречаются и другие алгоритмы для создания цифровых ключей:
Ed25519, DSA, EdDSA и другие. В 2024 году чаще всего используют RSA и Ed25519.
Поговорим об их разнице. RSA работает на любой системе, но расходует больше памяти и процессорного времени на создание и верификацию ключей. Ed25519 более эффективный и менее ресурсоёмкий, однако работает не на всех системах.
Большинство пользователей не заметят разницы между алгоритмами RSA и Ed25519. Поэтому рекомендую использовать RSA на 3072 или 4096 бит.
Как создать ключи шифрования
Если у вас операционная система Linux или macOS, перейдите в терминал. Если у вас Windows 10 и более новая версия — настройте программу OpenSSH. Для старых версий Windows попробуйте PuTTY Generator или похожие утилиты.
В выбранной программе введите команду ssh-keygen. Система создаст пару ключей и уточнит место для их сохранения — по умолчанию будет предложена домашняя директория. Ключи добавятся в папку .ssh и получат имя id_rsa.
Вы можете изменить имя ключа и место его сохранения. Для этого необходимо перезаписать путь, который предлагает система. Было: /Users/macbook/.ssh/id_rsa. Меняем имя ключа: /Users/macbook/.ssh/myKey. После перезаписи существующий приватный ключ будет удалён и заменён на ключ с новым именем. Вместе с ним вы потеряете доступ к серверам, на которых он был задействован. Поэтому такую перезапись уместно делать только тогда, когда вы удаляете неиспользуемый ключ.
Для защиты существующего ключа от перезаписи можно использовать флаг -f при вызове команды ssh-keygen. Выглядеть это будет так: ssh-keygen -f $HOME/.ssh/skillbox_private. В этом случае система запросит пароль для защиты приватного ключа и сохранит его в зашифрованном виде. В папке .ssh появятся ключи skillbox_private и skillbox_private.pub, а система сообщит о завершении операции.После вы сможете использовать новые ключи для доступа к серверам.
Следующий шаг — парольная фраза, дополнительная мера безопасности. Её создавать не обязательно — для пропуска нажмите Еnter. Всё: ключи готовы, в терминале должна появиться графика с названием технологии шифрования.

Скриншот: iTerm2 / Skillbox Media
Посмотрим содержимое папки .ssh. Для этого выполним несколько команд:
- cd .ssh — переходим в папки .ssh;
- ls -a — выводим список содержимого, включая скрытые файлы;
- cat id_rsa — смотрим на содержимое приватного ключа.
⚠️ Внимание: ниже на скриншоте приватный ключ показан для примера. Он нигде не используется и уже удалён. Никому не показывайте этот ключ — от него зависит безопасность вашей информации.

Скриншот: iTerm2 / Skillbox Media
С помощью команды cat id_rsa.pub можно посмотреть публичный ключ — такой же набор не связанных символов, только меньше. Этот ключ можно передавать.

Скриншот: iTerm2 / Skillbox Media
Мы рассмотрели базовый сценарий создания SSH-ключей. Однако иногда нужно конкретизировать технологию шифрования и изменить размер ключа. Вот команда: ssh-keygen -t {технология шифрования} -b {размер ключа в битах}.
После флажка -t мы пишем нужную технологию, а после -b — новый размер ключа. Дальше действуем по базовому сценарию: выбираем директорию для сохранения ключей и добавляем парольную фразу, если она вам необходима.

Скриншот: iTerm2 / Skillbox Media
В папке .ssh можно хранить разные SSH-ключи.

Скриншот: iTerm2 / Skillbox Media
Как настроить SSH на GitHub
Вводим в терминал команду ssh git@github.com. Если это ваше первое подключение к GitHub, то терминал предложит добавить сайт в список доверительных хостов. После вы увидите сообщение о наличии или отсутствии доступных SSH-ключей. Пока публичные ключи нам недоступны.

Скриншот: iTerm2 / Skillbox Media
Переходим на github.com и выполняем следующие шаги:
- создаём учётную запись, если её нет;
- в настройках профиля выбираем подраздел «SSH and GPG keys»;
- кликаем на кнопку «New SSH key» и вставляем в поле публичный ключ;
- добавляем к публичному ключу краткое произвольное описание;
- кликаем на «Add SSH key» и вводим пароль от учётной записи, если нужно.
Публичные ключи можно не описывать. Это удобно, если у вас несколько ключей для разных проектов. По описанию проще находить нужный ключ.

Скриншот: GitHub / Skillbox Media
Снова введём в терминале команду ssh git@github.com. Если публичный ключ добавлен, то GitHub распознает и поприветствует нас по имени в профиле.

Скриншот: iTerm2 / Skillbox Media
После добавления публичного ключа вы можете связываться с удалёнными репозиториями по протоколу SSH вместо HTTPS. Больше не нужно постоянно вводить логин и пароль, что упрощает и ускоряет работу с GitHub.

Скриншот: GitHub / Skillbox Media
Если в процессе настройки у вас возникнут вопросы, сложности или вам просто захочется больше узнать о SSH больше — посмотрите документацию на GitHub.
GitHub и некоторые другие сервисы не работают по паролю. Однако для удалённого подключения к серверу пароль нужен, но его можно заменить SSH.
Для настройки SSH-соединения выполните первое подключение к серверу — введите логин и пароль. Введите команду ssh-copy-id user@host и повторите пароль:
- ssh — запрос на установку защищённого соединения;
- user — вводим выданный логин;
- host — адрес удалённого сервера. Здесь может быть как IP-адрес, так и хост с определённым доменным именем.
SSH-соединение установлено, и можно входить на указанный сервер без пароля.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!