Код
#статьи

SSH: что это и как им пользоваться — гайд для новичков

Теоретические основы с иллюстрациями и практика на GitHub.

Иллюстрация: Катя Павловская для Skillbox Media

После регистрации на GitHub вы получаете профиль с настроенным HTTPS-соединением. Это протокол для безопасной загрузки и скачивания данных из удалённого репозитория. Однако не все компании предпочитают HTTPS и по разным причинам просят своих разработчиков выбирать альтернативу — протокол SSH.

В статье мы познакомимся с SSH-соединением и научимся перенастраивать под него профиль на GitHub. Перед практикой будет теоретический блок, объясняющий принципы работы технологии. Вы узнаете, как данные переходят с устройств на удалённые серверы и почему это безопасно.

Если вы только начинаете использовать GIt, рекомендуем перед настройкой SSH-соединения почитать про GitHub.

Из статьи вы узнаете:

Что такое SSH и зачем он создан

До внедрения SSH для удалённого подключения был популярен протокол Telnet, известный как Teletype Network. ​​Он позволял запускать терминальные команды, передавать файлы, обновлять данные — то есть решал множество задач системного администрирования. Однако Telnet был уязвим к атакам, поскольку открыто передавал данные и не защищал трафик от перехвата. Причина: протокол появился в 1969 году, когда инженеры разворачивали интернет. Тогда масштабирование было приоритетнее безопасности.

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

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

Схема открытой передачи данных по протоколу Telnet
Иллюстрация: Оля Ежак для Skillbox Media

На смену Telnet пришёл SSH. SSH (Secure Shell — защищённая оболочка) — это протокол прикладного уровня для удалённого обмена данными между устройствами. Он основан на взаимодействии приватного и публичного ключей, которые защищают трафик алгоритмом асимметричного шифрования.

Представьте, что первому пользователю нужно получить файл от второго пользователя. Он берёт ключ и открытый замок, а затем действует так: ключ оставляет себе, а открытый замок передаёт по сети. Замок доходит до адресата и достаётся злоумышленнику. Файл с данными пока не передан.

Схема защищённой передачи данных по протоколу SSH. Часть 1
Иллюстрация: Оля Ежак для Skillbox Media

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

Схема защищённой передачи данных по протоколу SSH. Часть 2
Иллюстрация: Оля Ежак для Skillbox Media

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

Реализация SSH-протокола в контексте клиент-серверного взаимодействия
Иллюстрация: Оля Ежак для Skillbox Media

Как работает алгоритм шифрования SSH

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

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

Схема комплементарного подбора цветов на круге Иттена
Иллюстрация: Skillbox Media

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

Схема работы алгоритма шифрования SSH на примере цвета и обратного цвета. Часть 1
Иллюстрация: Оля Ежак для Skillbox Media

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

Схема работы алгоритма шифрования SSH на примере цвета и обратного цвета. Часть 2
Иллюстрация: Оля Ежак для Skillbox Media

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

Схема работы алгоритма шифрования SSH на примере цвета и обратного цвета: часть 3
Иллюстрация: Оля Ежак для Skillbox Media

В алгоритмах шифрования происходят похожие процессы, но вместо цветов используются данные. Приватный ключ не хранится на сервере, а публичный ключ можно пересылать по сети. Если злоумышленник перехватит публичный ключ, то не сможет им воспользоваться. Остаётся как-то случайно подобрать приватный SSH-ключ. Однако это маловероятно, поскольку речь о длинной цепочке произвольно сгенерированных цифр и букв. Примеры будут далее.

Как создать ключи шифрования

Если у вас операционная система 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 — смотрим на содержимое приватного ключа.

⚠️ Внимание: ниже на скриншоте приватный ключ показан для примера. Он нигде не используется и уже удалён. Никому не показывайте этот ключ — от него зависит безопасность вашей информации.

Фрагмент приватного SSH-ключа: набор не связанных друг с другом символов, которые сложно подобрать
Скриншот: iTerm2 / Skillbox Media

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

Пример публичного SSH-ключа
Скриншот: iTerm2 / Skillbox Media

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

После флажка -t мы пишем нужную технологию, а после -b — новый размер ключа. Дальше действуем по базовому сценарию: выбираем директорию для сохранения ключей и добавляем парольную фразу, если она вам необходима.

Пример конкретизированного SSH-ключа: меняем технологию шифрования rsa на ed25519 и увеличиваем размер ключа с 3072 до 4096 бит
Скриншот: iTerm2 / Skillbox Media

В папке .ssh можно хранить разные SSH-ключи.

Пример SSH-ключей, сгенерированных по конкретизированному запросу
Скриншот: iTerm2 / Skillbox Media

Как настроить SSH на GitHub

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

Добавляем github.com в список доверенных хостов и убеждаемся в отсутствии публичных ключей
Скриншот: iTerm2 / Skillbox Media

Переходим на github.com и выполняем следующие шаги:

  • создаём учётную запись, если её нет;
  • в настройках профиля выбираем подраздел «SSH and GPG keys»;
  • кликаем на кнопку «New SSH key» и вставляем в поле публичный ключ;
  • добавляем к публичному ключу краткое произвольное описание;
  • кликаем на «Add SSH key» и вводим пароль от учётной записи, если нужно.

Публичные ключи можно не описывать. Это удобно, если у вас несколько ключей для разных проектов. По описанию проще находить нужный ключ.

Добавляем публичный SSH-ключ и называем его myKey
Скриншот: GitHub / Skillbox Media

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

Аутентификация пройдена, GitHub видит наш профиль
Скриншот: iTerm2 / Skillbox Media

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

Аутентификация пройдена, GitHub видит наш профиль
Скриншот: GitHub / Skillbox Media

Если в процессе настройки у вас возникнут вопросы, сложности или вам просто захочется больше узнать о SSH больше — посмотрите документацию на GitHub.

Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!

Проверьте свой английский. Бесплатно ➞
Нескучные задания: small talk, поиск выдуманных слов — и не только. Подробный фидбэк от преподавателя + персональный план по повышению уровня.
Пройти тест
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована