Раздел помощи SpaceWeb

SSH и удалённые git-репозитории

02 окт, 2024

В этом руководстве мы рассмотрим основные шаги по настройке SSH для работы с удаленными GIT-репозиториями. 

Что такое SSH 

SSH (Secure Shell) – это сетевой протокол, который используется для безопасного удаленного доступа к серверам и устройствам. В отличие от незащищённых протоколов (например, Telnet или FTP), SSH обеспечивает шифрование передаваемых данных, что позволяет защитить их от перехвата злоумышленниками. Протокол SSH используется для: 

  • выполнения команд на удаленных устройствах, 
  • управления серверами, 
  • передачи файлов,
  • настройки сетевых подключений.

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

SSH – это стандарт де-факто для систем на основе Linux и Unix, но он может использоваться и в Windows-среде с помощью специальных программ. Один из самых популярных вариантов для этой задачи – PuTTY.

Настройка SSH для доступа к удалённым GIT-репозиториям

Раньше для доступа к репозиториям через HTTPS из терминала можно было использовать пароли. Теперь при работе с командами вроде git clone, git fetch, git pull, и git push нужно использовать персональные токены доступа вместо стандартных паролей. Так можно повысить безопасность пользователей и защитить их данные от угроз, которые связаны с утечкой или взломом паролей.

Однако работа с HTTPS, даже с токенами, часто оказывается менее удобной по сравнению с SSH. Настройка доступа по SSH не только упрощает взаимодействие с удаленными репозиториями, но и позволяет избежать постоянного ввода токенов или паролей. Достаточно один раз настроить SSH-ключ, и дальнейшая работа станет автоматизированной и более безопасной. 

Теперь перейдём к конкретным шагам, которые нужно выполнить для настройки SSH-доступа к удалённым GIT-репозиториям:

  1. Получаем SSH-ключи

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

Проверьте и при необходимости установите права командой:

chmod 600 ~/.ssh/personal_key

Если у вас еще нет SSH-ключей, вам нужно их сгенерировать. Это можно сделать с помощью утилиты ssh-keygen. Выполните следующую команду в терминале:

ssh-keygen -t ed25519

Флаг -t указывает, какой алгоритм будет использоваться для создания ключей. Современные платформы, по типу GitHub, GitLab и Yandex, рекомендуют использовать алгоритм ed25519 благодаря его высокой безопасности и производительности.

Когда утилита предложит сохранить ключ, можно оставить название файла по умолчанию или указать своё. 

Далее вы можете установить пароль на ключ для дополнительной защиты. В таком случае, при каждом использовании SSH-ключа система будет запрашивать пароль. Однако, чтобы не вводить его каждый раз, можно настроить ssh-agent – менеджер для автоматической работы с ключами.

После завершения генерации, вы увидите «картинку» вашего ключа из ASCII-символов. Кроме того, в вашей директории ~/.ssh/ появятся два файла: приватный ключ id_ed25519 и публичный ключ id_ed25519.pub.

Для удобства работы вы можете переименовать эти файлы, например:

mv ~/.ssh/id_ed25519 ~/.ssh/personal_key
mv ~/.ssh/id_ed25519.pub ~/.ssh/personal_key.pub

Теперь ваши SSH-ключи готовы для использования, и вы можете перейти к их добавлению в соответствующую систему, будь то GitHub, GitLab или другая платформа.

  1. Настраиваем ssh config

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

Откройте или создайте файл ~/.ssh/config и добавьте в него следующие строки:

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/personal_key
    IdentitiesOnly yes

Где:

  • «Host github.com» – это имя сервера, с которым вы будете работать. Оно должно совпадать с URL сервиса, в нашем случае – GitHub. То же самое имя указывается в параметре HostName.
  • «User git» – имя пользователя, которое используется для подключения к серверу. Для GitHub это всегда пользователь git.
  • «IdentityFile ~/.ssh/personal_key» – путь к приватному ключу, который будет применяться для аутентификации. Замените его на путь к вашему ключу, если вы использовали другое имя.
  • «IdentitiesOnly yes» – этот параметр указывает SSH использовать только указанный ключ для аутентификации, что предотвращает ошибки при наличии множества ключей.

Эти настройки позволят вам автоматически использовать правильный ключ при подключении к GitHub.

Аналогичные конфигурации можно сделать для других сервисов, например, для GitLab. Добавьте в файл конфигурации новые секции, например:

Host gitlab.com
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/personal_key_gitlab
    IdentitiesOnly yes

Таким образом, SSH будет корректно работать с разными платформами, используя соответствующие ключи для каждого из них.

  1. Указываем публичный ключ на GitHub

Чтобы GitHub или другой сервис мог авторизовать ваше SSH-подключение, необходимо добавить ваш публичный SSH-ключ в настройки аккаунта. Это позволит сервису распознать вас как доверенного пользователя при работе с репозиториями. 

Важно! Вы можете указать несколько ключей, если используете разные устройства или профили.

На GitHub процедура выглядит следующим образом:

  1. Перейдите в Settings, а затем – SSH and GPG keys
  2. Нажмите New SSH key.
  3. В поле Key вставьте содержимое вашего публичного ключа, например, файла personal_key.pub (или id_ed25519.pub, если вы не переименовывали ключи).
  4. Щелкните Add SSH key.

На этом этапе ваш публичный ключ добавлен в GitHub. В других сервисах процедура будет аналогичной: найдите раздел для SSH-ключей и добавьте туда публичный ключ.

Когда вы впервые будете подключаться к GitHub по SSH, вам нужно будет добавить его в список доверенных хостов. Система выведет сообщение:

The authenticity of host 'github.com (140.82.121.4)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.

Ответьте yes, чтобы подтвердить добавление GitHub в список доверенных хостов. После этого вы сможете свободно использовать SSH для доступа к вашим репозиториям.

Важно помнить, что при использовании протокола SSH путь к удаленным репозиториям будет отличаться от HTTPS-версии. Чтобы клонировать репозиторий через SSH, на странице репозитория выберите вкладку SSH и скопируйте указанный путь. 

Далее используйте этот путь аналогично HTTPS в команде:

git clone git@github.com:username/repository.git

Теперь ваш доступ по SSH настроен, и вы можете спокойно работать с удаленными репозиториями.

Как сменить адрес удаленного репозитория

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

Для этого, находясь в локальном репозитории, выполните следующую команду:

git remote set-url origin git@serviceurl:username/reponame.git

Где:

  • «serviceurl» – это URL сервиса, на котором размещён ваш удалённый репозиторий. Например, это может быть github.com или gitlab.com.
  • «username» – ваш логин или имя пользователя на сервисе.
  • «reponame» – название вашего репозитория.

Она обновит адрес удаленного репозитория с HTTPS на SSH.

Чтобы убедиться, что изменения вступили в силу, выполните команду:

git remote -v

Если все настроено корректно, в выводе вы увидите строки с обновленными путями:

origin git@serviceurl:username/reponame.git (fetch)
origin git@serviceurl:username/reponame.git (push)

Готово! Вы успешно сменили адрес удаленного репозитория.