SSH: что это и как им пользоваться — гайд для новичков
Теоретические основы с иллюстрациями и практика на GitHub.
![](https://248006.selcdn.ru/main/iblock/0c8/0c87fe191a9f9b348ecc4a20f323161d/82058e55e3c745b45bb5fe8423220218.png)
![](https://248006.selcdn.ru/main/iblock/0c8/0c87fe191a9f9b348ecc4a20f323161d/82058e55e3c745b45bb5fe8423220218.png)
Иллюстрация: Катя Павловская для Skillbox Media
После регистрации на GitHub вы получаете профиль с настроенным HTTPS-соединением. Это протокол для безопасной загрузки и скачивания данных из удалённого репозитория. Однако не все компании предпочитают HTTPS и по разным причинам просят своих разработчиков выбирать альтернативу — протокол SSH.
В статье мы познакомимся с SSH-соединением и научимся перенастраивать под него профиль на GitHub. Перед практикой будет теоретический блок, объясняющий принципы работы технологии. Вы узнаете, как данные переходят с устройств на удалённые серверы и почему это безопасно.
Если вы только начинаете использовать GIt, рекомендуем перед настройкой SSH-соединения почитать про GitHub.
Из статьи вы узнаете:
- что такое протокол SSH;
- как он работает;
- как создать приватный и публичные ключи для SSH-шифрования;
- как настроить SSH-соединение на GitHub.
![](/upload/setka_images/09420914052024_11c535a81148df46fd31a221d83fcc32d657cdb5.jpg)
Дмитрий Зайцев
Эксперт
CTO Flocktory, программный директор профессии «DevOps-инженер» в Skillbox, директор программного комитета DevOpsConf.
Что такое SSH и зачем он создан
До внедрения SSH для удалённого подключения был популярен протокол Telnet, известный как Teletype Network. Он позволял запускать терминальные команды, передавать файлы, обновлять данные — то есть решал множество задач системного администрирования. Однако Telnet был уязвим к атакам, поскольку открыто передавал данные и не защищал трафик от перехвата. Причина: протокол появился в 1969 году, когда инженеры разворачивали интернет. Тогда масштабирование было приоритетнее безопасности.
![](/upload/setka_images/15045708042024_8bf086f873b95ce52c3bfd70ab21a972659fd71b.png)
Покажем уязвимость открытой передачи данных на примерах. Пользователь отправляет незашифрованный файл через Telnet. Если злоумышленник отслеживает сетевые узлы, то сможет получить доступ к содержимому файла.
Пользователь может зашифровать файл перед отправкой через Telnet. Однако если отправитель и получатель не встретятся лично, то дешифровочный ключ придётся высылать по сети. Так злоумышленник получит файл и ключ к нему.
![](/upload/setka_images/14471808042024_123bfe04a8eb2074d5f56c8fe369a3f0a8c221ba.png)
Иллюстрация: Оля Ежак для Skillbox Media
На смену Telnet пришёл SSH. SSH (Secure Shell — защищённая оболочка) — это протокол прикладного уровня для удалённого обмена данными между устройствами. Он основан на взаимодействии приватного и публичного ключей, которые защищают трафик алгоритмом асимметричного шифрования.
Представьте, что первому пользователю нужно получить файл от второго пользователя. Он берёт ключ и открытый замок, а затем действует так: ключ оставляет себе, а открытый замок передаёт по сети. Замок доходит до адресата и достаётся злоумышленнику. Файл с данными пока не передан.
![](/upload/setka_images/14471808042024_5b676a68dcc740c58263f25d66dc8408ef4efd4d.png)
Иллюстрация: Оля Ежак для Skillbox Media
Второй пользователь закрывает файл на замок и высылает его обратно. Закрытый замок попадает к первому пользователю и к злоумышленнику. Первый пользователь открывает замок своим ключом и достаёт файл. У злоумышленника есть открытый и закрытый замок, но без ключа он не сможет извлечь файл. Так стороны могут безопасно обмениваться данными.
![](/upload/setka_images/14471808042024_d04e70aeac467ab2b71ad1298d41c2aad9af5941.png)
Иллюстрация: Оля Ежак для Skillbox Media
В концепции SSH открытый замок представляет публичный ключ, или public key. Ключ от замка — приватный ключ, или private key. С помощью публичного ключа мы шифруем данные, а с помощью приватного — расшифровываем. Без приватного ключа даже владелец данных не получит к ним доступа. Приватный ключ важно беречь.
![](/upload/setka_images/14472008042024_0ca706dc16c5e811591cb9f120581abe382da877.png)
Иллюстрация: Оля Ежак для Skillbox Media
Если не упрощать объяснение, то реализация SSH-протокола происходит в несколько этапов. Это механизм, включающий в себя установку защищённого соединения, аутентификацию и обмен данными между клиентом и сервером.
- Клиент отправляет серверу ID своего публичного ключа. Таким образом он заявляет, что обладает соответствующим приватным ключом.
- Сервер шифрует публичным ключом случайное сообщение и отправляет клиенту. Клиент должен это сообщение расшифровать и отправить в ответ.
- Для проверки аутентификации клиент должен расшифровать сообщение и передать его в зашифрованном виде обратно на сервер. Так он докажет, что действительно обладает приватным ключом. Иначе запрос будет отклонён.
- Клиент и сервер договариваются об общем секретном ключе. Безопасное согласование такого ключа обеспечивает криптопротокол Диффи — Хеллмана.
- Стороны выбирают метод шифрования трафика. Сейчас часто используют AES-256, AES-192 и AES-128 — выбор зависит от согласия сторон и настроек безопасности сервера. Однако алгоритмы безопасности периодически обновляются, поэтому важно ориентироваться на современный стандарт.
После успешного прохождения аутентификации клиент и сервер могут безопасно обмениваться данными по зашифрованному каналу.
![](/upload/setka_images/09450114052024_6a4e9b3ae3023faad72ace61e6264ce47ed78056.png)
Изображение: Майя Мальгина для Skillbox Media
Как работает алгоритм шифрования SSH
По умолчанию SSH использует алгоритм RSA. Это математическая модель для реализации шифрования данных с помощью одного ключа и их расшифровки с помощью другого. Преобразование строится по принципу работы обратной функции: функция зашифровывает данные, а обратная функция их расшифровывает.
Для лучшего понимания работы обратной функции рассмотрим пример с комплементарным подбором цветов на круге Иттена. В цветовом круге у каждого цвета есть дополнительный цвет. Дополнительный цвет находится на противоположной стороне круга и отделён от основного цвета белой зоной. Примеры: красный и зелёный, жёлтый и фиолетовый, оранжевый и голубой.
![](/upload/setka_images/14471908042024_b7e05076193dfabc2e3b63b5563229fbf1d5effd.gif)
Иллюстрация: Skillbox Media
Пользователи решили обменяться цветами. Первый участник выбирает цвет и определяет его дополнительный цвет. Дополнительный цвет попадает к адресату и злоумышленнику. Об основном цвете злоумышленник не знает.
![](/upload/setka_images/14471908042024_e494774ba587ebabe6c93f44bfdd8e9174397b77.png)
Иллюстрация: Оля Ежак для Skillbox Media
Второй пользователь смешивает дополнительный цвет со своим — тем, что он хотел выслать в ответ. Получается новый цвет — результирующий. Результирующий цвет доходит до адресата и достаётся злоумышленнику.
![](/upload/setka_images/14471808042024_46a642a84a0b027035e602c637fa9bc8e88d4cb6.png)
Иллюстрация: Оля Ежак для Skillbox Media
Первый пользователь смешивает результирующий цвет со своим исходным. Получается цвет, который передал второй пользователь. У злоумышленника есть дополнительный цвет от первого пользователя и результирующий от второго. Если он смешает свои цвета, то не узнает загаданный цвет.
![](/upload/setka_images/14472208042024_1f7303d0508d8db8cc63431574866d38e2ecb338.png)
Иллюстрация: Оля Ежак для 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. Всё: ключи готовы, в терминале должна появиться графика с названием технологии шифрования.
![](/upload/setka_images/14471908042024_c0c954a3a268bfc515e88839a41a25de5bd1b194.jpg)
Скриншот: iTerm2 / Skillbox Media
Посмотрим содержимое папки .ssh. Для этого выполним несколько команд:
- cd .ssh — переходим в папки .ssh;
- ls -a — выводим список содержимого, включая скрытые файлы;
- cat id_rsa — смотрим на содержимое приватного ключа.
⚠️ Внимание: ниже на скриншоте приватный ключ показан для примера. Он нигде не используется и уже удалён. Никому не показывайте этот ключ — от него зависит безопасность вашей информации.
![](/upload/setka_images/14471908042024_cece785eb92cd643f5e788e5f37e3d933a76f56c.jpg)
Скриншот: iTerm2 / Skillbox Media
С помощью команды cat id_rsa.pub можно посмотреть публичный ключ — такой же набор не связанных символов, только меньше. Этот ключ можно передавать.
![](/upload/setka_images/14471908042024_2229e417950c39bd1ac90259b6c781a232a40430.jpg)
Скриншот: iTerm2 / Skillbox Media
Мы рассмотрели базовый сценарий создания SSH-ключей. Однако иногда нужно конкретизировать технологию шифрования и изменить размер ключа. Вот команда: ssh-keygen -t {технология шифрования} -b {размер ключа в битах}.
После флажка -t мы пишем нужную технологию, а после -b — новый размер ключа. Дальше действуем по базовому сценарию: выбираем директорию для сохранения ключей и добавляем парольную фразу, если она вам необходима.
![](/upload/setka_images/14471908042024_71b97f3681cfd481f98f8279e17d064ae63ea66a.jpg)
Скриншот: iTerm2 / Skillbox Media
В папке .ssh можно хранить разные SSH-ключи.
![](/upload/setka_images/14472108042024_b96f49b701f581862428f9c58e1a46c731d0aa89.jpg)
Скриншот: iTerm2 / Skillbox Media
Как настроить SSH на GitHub
Вводим в терминал команду ssh git@github.com. Если это ваше первое подключение к GitHub, то терминал предложит добавить сайт в список доверительных хостов. После вы увидите сообщение о наличии или отсутствии доступных SSH-ключей. Пока публичные ключи нам недоступны.
![](/upload/setka_images/14471908042024_d75dd4921f9f5ca9dc828e1efafbd5a21dfa9c5d.jpg)
Скриншот: iTerm2 / Skillbox Media
Переходим на github.com и выполняем следующие шаги:
- создаём учётную запись, если её нет;
- в настройках профиля выбираем подраздел «SSH and GPG keys»;
- кликаем на кнопку «New SSH key» и вставляем в поле публичный ключ;
- добавляем к публичному ключу краткое произвольное описание;
- кликаем на «Add SSH key» и вводим пароль от учётной записи, если нужно.
Публичные ключи можно не описывать. Это удобно, если у вас несколько ключей для разных проектов. По описанию проще находить нужный ключ.
![](/upload/setka_images/14472008042024_b76bc71fa80c20942ed01e19c21ead7b69ad6b89.jpg)
Скриншот: GitHub / Skillbox Media
Снова введём в терминале команду ssh git@github.com. Если публичный ключ добавлен, то GitHub распознает и поприветствует нас по имени в профиле.
![](/upload/setka_images/14471908042024_1c076733da30d01108464d85a8ffad1517acec59.jpg)
Скриншот: iTerm2 / Skillbox Media
После добавления публичного ключа вы можете связываться с удалёнными репозиториями по протоколу SSH вместо HTTPS. Больше не нужно постоянно вводить логин и пароль, что упрощает и ускоряет работу с GitHub.
![](/upload/setka_images/14471908042024_1cc7c7aaff1472b38801633d33e2f9e6221a290f.jpg)
Скриншот: GitHub / Skillbox Media
Если в процессе настройки у вас возникнут вопросы, сложности или вам просто захочется больше узнать о SSH больше — посмотрите документацию на GitHub.
GitHub и некоторые другие сервисы не работают по паролю. Однако для удалённого подключения к серверу пароль нужен, но его можно заменить SSH.
Для настройки SSH-соединения выполните первое подключение к серверу — введите логин и пароль. Введите команду ssh-copy-id user@host и повторите пароль:
- ssh — запрос на установку защищённого соединения;
- user — вводим выданный логин;
- host — адрес удалённого сервера. Здесь может быть как IP-адрес, так и хост с определённым доменным именем.
SSH-соединение установлено, и можно входить на указанный сервер без пароля.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!