Использование проверки подлинности с ключом SSH

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018-TFS 2015

Подключение в репозиториев Git через SSH в macOS, Linux или Windows для безопасного подключения с использованием проверки подлинности HTTPS. на Windows рекомендуется использовать основные или персональные маркеры доступа диспетчера учетных данных Git .

Важно!

URL-адреса SSH изменились, но старые URL-адреса SSH продолжат работать. Если вы уже настроили SSH, необходимо обновить удаленные URL-адреса в новом формате:

  • Проверьте, какие удаленные службы используют SSH, выполнив git remote -v в клиенте Git.
  • Откройте репозиторий в Интернете и нажмите кнопку клонировать в правом верхнем углу.
  • Выберите SSH и скопируйте новый URL-адрес SSH.
  • В клиенте Git выполните: git remote set-url <remote name, e.g. origin> <new SSH URL> . кроме того, в Visual Studio перейдите в репозиторий Параметрыи измените удаленные.

Примечание

начиная с Visual Studio 2017 можно использовать SSH для подключения к Azure DevOps репозиториев Git.

Как работает проверка подлинности SSH-ключа

Проверка подлинности с помощью открытого ключа SSH работает с асимметричной парой созданных ключей шифрования. открытый ключ предоставляется Azure DevOps и используется для проверки первоначального ssh-подключения. Закрытый ключ обеспечивает безопасность и безопасность в системе.

Настройка проверки подлинности ключей SSH

Следующие шаги охватывают настройку проверки подлинности ключей SSH на следующих платформах:


  • Linux
  • macOS, работающий по меньшей мере Leopard (10,5)
  • Windows системы с Git для Windows

Настройте SSH с помощью командной строки. bashявляется общей оболочкой в Linux и macOS, а git для Windows установки добавляет ярлык для git Bash в меню. Другие среды оболочки будут работать, но не будут рассмотрены в этой статье.

Шаг 1. Создание ключей SSH

Примечание

Если вы уже создали ключи SSH в системе, пропустите этот шаг и перейдите к разделу Настройка ключей SSH.

Команды здесь позволяют создавать новые ключи SSH по умолчанию, перезаписывая существующие ключи по умолчанию. Прежде чем продолжить, проверьте ~/.ssh папку (например,/Хоме/Жамал/.СШ или к:\усерс\жамал \ . SSH) и найдите следующие файлы:

  • id_rsa
  • id_rsa. pub

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

Создайте ключи SSH с помощью ssh-keygen команды из bash командной строки. Эта команда создаст 3072-разрядный ключ RSA для использования с SSH. Вы можете предоставить парольную фразу для закрытого ключа при появлении запроса о том — , что парольная фраза обеспечивает другой уровень безопасности для закрытого ключа. Если вы выдаете парольную фразу, обязательно Настройте агент SSH для кэширования парольной фразы, чтобы не вводить его каждый раз при подключении.

$ ssh-keygen -C "jamal@fabrikam.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/jamal/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/jamal/.ssh/id_rsa.
Your public key has been saved in /c/Users/jamal/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:******************************************* jamal@fabrikam.com
The key's randomart image is:
+---[RSA 3072]----+
|+.   +yX*o .     |
|... ..E+*=o      |
|  ..o.=E=.o      |
|   . * =.o .     |
|    . S o o..    |
|       + .oo     |
|        S+.  .   |
|        ..+.+    |
|          o*..   |
+----[SHA256]-----+

Эта команда создает два ключа, необходимых для проверки подлинности SSH: ваш закрытый ключ ( id_rsa ) и открытый ключ ( id_rsa. pub ). Важно никогда не предоставлять общий доступ к содержимому закрытого ключа. Если закрытый ключ скомпрометирован, злоумышленники могут использовать его, чтобы заставить серверы подумать о том, что подключение поступает от вас.

шаг 2. добавление открытого ключа в Azure DevOps Services/тфс

Свяжите открытый ключ, созданный на предыдущем шаге, с ИДЕНТИФИКАТОРом пользователя.

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

    Снимок экрана, показывающий пункт меню открытых ключей SSH и аватар пользователя, выбранный в Azure DevOps Services.

  2. Выберите + новый ключ.

    Доступ к конфигурации безопасности в Azure DevOps Services

  3. Скопируйте содержимое открытого ключа (например, id_rsa. pub), созданного в поле данных открытого ключа .

    Важно!

    старайтесь не добавлять пробелы или новые строки в поле данных ключа , так как это может привести к тому, что Azure DevOps Services использовать недопустимый открытый ключ. При вставлении в ключ новая строка часто добавляется в конец. Не забудьте удалить эту новую строку, если она возникает.

    Настройка открытого ключа в Azure DevOps Services

  4. Присвойте ключу полезное описание (это описание будет отображаться на странице открытых ключей SSH для вашего профиля), чтобы вы могли запомнить его позже. Нажмите кнопку сохранить , чтобы сохранить открытый ключ. После сохранения ключ изменить нельзя. Вы можете удалить ключ или создать новую запись для другого ключа. Ограничений на количество ключей, которые можно добавить в профиль пользователя, не существует. также обратите внимание, что ключи SSH, хранящиеся в Azure DevOps, истекает через пять лет. если срок действия ключа истек, вы можете отправить новый раздел или один и тот же ключ, чтобы продолжить доступ к Azure DevOps через SSH.

  5. Проверьте подключение, выполнив следующую команду: ssh -T git@ssh.dev.azure.com . Если все работает правильно, вы получите ответ, который говорит: remote: Shell access is not supported. Если нет, см. раздел с вопросами и устранением неполадок.

Шаг 2. Добавление открытого ключа в Azure DevOps

Свяжите открытый ключ, созданный на предыдущем шаге, с ИДЕНТИФИКАТОРом пользователя.

  1. Откройте параметры безопасности, перейдя на веб-портал и выбрав аватар в правом верхнем углу интерфейса пользователя. В появившемся меню выберите Безопасность .

    Доступ к профилю пользователя в Azure DevOps Services

  2. Выберите + новый ключ.

    Доступ к конфигурации безопасности в Azure DevOps Services

  3. Скопируйте содержимое открытого ключа (например, id_rsa. pub), созданного в поле данных открытого ключа .

    Важно!

    старайтесь не добавлять пробелы или новые строки в поле данных ключа , так как это может привести к тому, что Azure DevOps Services использовать недопустимый открытый ключ. При вставлении в ключ новая строка часто добавляется в конец. Не забудьте удалить эту новую строку, если она возникает.

    Настройка открытого ключа в Azure DevOps Services

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

  5. Проверьте подключение, выполнив следующую команду: ssh -T git@ssh.dev.azure.com . Если все работает правильно, вы получите ответ, который говорит: remote: Shell access is not supported. Если нет, см. раздел с вопросами и устранением неполадок.

Шаг 3. Клонирование репозитория Git с помощью SSH

Примечание

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

  1. Скопируйте URL-адрес клонирования SSH с веб-портала. В этом примере URL-адрес клона SSL предназначен для репозитория в Организации с именем Fabrikam-Fiber, как указано первой частью URL-адреса после dev.azure.com .

    Azure Repos URL-адрес клона SSH

    Примечание

    Project url-адреса были изменены в выпуске Azure DevOps Services и теперь имеют формат dev.azure.com/{your organization}/{your project} , но можно использовать существующий visualstudio.com формат. дополнительные сведения см. в разделе Visual Studio Team Services теперь Azure DevOps Services.

  2. Выполните git clone в командной строке.

    git clone git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber
    

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

SSH отображает этот отпечаток при подключении к неизвестному узлу и защищает вас от атак типа "злоумышленник в середине". Приняв отпечаток узла, SSH не выводит запрос повторно, пока отпечаток не изменится.

$ git clone git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber
Cloning into 'FabrikamFiber'...
The authenticity of host 'ssh.dev.azure.com (65.52.8.37)' can't be established.
RSA key fingerprint is SHA256:********************************************
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ssh.dev.azure.com,65.52.8.37' (RSA) to the list of known hosts.
Enter passphrase for key '/c/Users/jamal/.ssh/id_rsa':
remote: Azure Repos
remote: Found 127 objects to send. (50 ms)
Receiving objects: 100% (127/127), 56.67 KiB | 2.58 MiB/s, done.
Resolving deltas: 100% (15/15), done.

Когда появится запрос на продолжение подключения, введите yes. Git будет клонировать репозиторий и настроить удаленный доступ origin для подключения по протоколу SSH для будущих команд git.

Совет

чтобы избежать проблем, Windows пользователи должны выполнить команду , чтобы Git повторно использовал парольную фразу SSH.

Вопросы и устранение неполадок

Вопрос. После выполнения git clone я получаю следующую ошибку.   Что следует делать?

Host key verification failed. 
fatal: Could not read from remote repository.

Ответ . Вручную запишите ключ SSH, выполнив команду:ssh-keyscan -t rsa domain.com >> ~/.ssh/known_hosts

Вопрос. как с помощью Git запоминать парольную фразу для моего ключа на Windows?

Ответ . выполните следующую команду, входящую в Git, чтобы Windows запустить ssh-agent процесс в PowerShell или в Windows командной строке. ssh-agent кэширует вашу парольную фразу, чтобы не указывать ее при каждом подключении к репозиторию.

start-ssh-agent.cmd

Если вы используете оболочку Bash (включая Git bash), запустите ssh-agent с:

eval `ssh-agent`

Вопрос. я использую в качестве моего клиента SSH ввод и создал ключи с помощью PuTTYgen. Можно ли использовать эти ключи с Azure DevOps Services?

Ответ. Да. Загрузите закрытый ключ с помощью PuTTYgen, перейдите в меню преобразования и выберите Экспорт ключа OpenSSH. Сохраните файл закрытого ключа и выполните действия по настройке ключей, не относящихся к по умолчанию. Скопируйте открытый ключ непосредственно из окна PuTTYgen и вставьте в поле Data ( Ключевые данные ) в параметры безопасности.

Вопрос. Как убедиться, что открытый ключ, который я отправил, имеет тот же ключ, что и локальный?

Ответ . Отпечаток открытого ключа, который отображается в профиле, можно проверить с помощью следующей ssh-keygen команды, выполняемой для открытого ключа в bash командной строке. Если значения по умолчанию не используются, необходимо будет изменить путь и имя файла открытого ключа.

ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub

Затем можно сравнить сигнатуру MD5 с той, которая есть в вашем профиле. Эта проверка полезна при возникновении проблем с подключением или при неправильном вводе открытого ключа в поле данных ключа при добавлении ключа в Azure DevOps Services.

Вопрос. как начать использовать SSH в репозитории, где сейчас используется протокол HTTPS?

Ответ . Вам потребуется обновить origin Удаленный в Git, чтобы изменить URL-адрес HTTPS на SSH. Получив URL-адрес клона SSH, выполните следующую команду:

git remote set-url origin git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber

Теперь можно выполнить любую команду git, которая подключается к origin .

вопрос. я использую Git LFS с Azure DevOps Services и получаю сообщения об ошибках при получении файлов, отслеживаниющих с помощью Git LFS.

ответ . Azure DevOps Services сейчас не поддерживает LFS через SSH. Используйте HTTPS для подключения к репозиториев с отслеживанием файлов LFS Git.

Вопрос. как использовать расположение ключа не по умолчанию, т. е. not/.СШ/id_rsa и ~/.СШ/id_rsa. pub?

Ответ . Чтобы использовать ключи, созданные ssh-keygen в, в другом месте, отличном от используемого по умолчанию, выполните следующие две задачи:

  1. Ключи должны находиться в папке, которую можно читать или изменять. Если у папки есть более широкие разрешения, SSH не будет использовать эти ключи.
  2. Необходимо предоставить SSH сведения о расположении ключей. Вы делает SSH-доступ к ключам с помощью ssh-add команды, предоставляя полный путь к закрытому ключу.
ssh-add /home/jamal/.ssh/id_jamal.rsa

в Windows перед запуском необходимо ssh-add выполнить следующую команду из команды, включенной в Git, для Windows:

start-ssh-agent.cmd

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

eval `ssh-agent`

его можно найти ssh-add как часть Git для Windowsного распространения, а также запускать в любой среде оболочки на Windows.

В macOS и Linux также необходимо ssh-agent запустить перед запуском ssh-add , но среда команд на этих платформах обычно начинает с самого начала ssh-agent .

Вопрос. у меня несколько ключей SSH. Разделы справки использовать разные ключи SSH для разных серверов SSH или репозиториев?

Ответ . Как правило, если вы настроили несколько ключей для клиента SSH и подключились к серверу SSH, клиент может попытаться использовать ключи по одному, пока сервер не примет его.

однако это не работает с Azure DevOps по техническим причинам, связанным с протоколом ssh, и о том, как структурированы url-адреса SSH Git. Azure DevOps будет отменять первый ключ, предоставляемый клиентом во время проверки подлинности. Если этот ключ недопустим для запрошенного репозитория, запрос завершится со следующей ошибкой:

remote: Public key authentication failed.
fatal: Could not read from remote repository.

для Azure DevOps необходимо настроить SSH для явного использования определенного файла ключа. Один из способов сделать это для изменения ~/.ssh/config файла (например, /home/jamal/.ssh или C:\Users\jamal\.ssh ) следующим образом:

# The settings in each Host section are applied to any Git SSH remote URL with a
# matching hostname.
# Generally:
# * SSH uses the first matching line for each parameter name, e.g. if there's
#   multiple values for a parameter across multiple matching Host sections
# * "IdentitiesOnly yes" prevents keys cached in ssh-agent from being tried before
#   the IdentityFile values we explicitly set.
# * On Windows, ~/.ssh/your_private_key maps to %USERPROFILE%\.ssh\your_private_key,
#   e.g. C:\Users\<username>\.ssh\your_private_key.

# Most common scenario: to use the same key across all hosted Azure DevOps
# organizations, add a Host entry like this:
Host ssh.dev.azure.com
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes

# This model will also work if you still use the older SSH URLs with a
# hostname of vs-ssh.visualstudio.com:
Host vs-ssh.visualstudio.com
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes

# Less common scenario: if you need different keys for different organizations,
# you'll need to use host aliases to create separate Host sections.
# This is because all hosted Azure DevOps URLs have the same hostname
# (ssh.dev.azure.com), so SSH has no way to distinguish them by default.
#
# Imagine that we have the following two SSH URLs:
# * git@ssh.dev.azure.com:v3/Fabrikam/Project1/fab_repo
#   * For this, we want to use `fabrikamkey`, so we'll create `devops_fabrikam` as
#     a Host alias and tell SSH to use `fabrikamkey`.
# * git@ssh.dev.azure.com:v3/Contoso/Project2/con_repo
#   * For this, we want to use `contosokey`, so we'll create `devops_contoso` as
#     a Host alias and tell SSH to use `contosokey`.
#
# To set explicit keys for the two host aliases and to tell SSH to use the correct
# actual hostname, add the next two Host sections:
Host devops_fabrikam
  HostName ssh.dev.azure.com
  IdentityFile ~/.ssh/private_key_for_fabrikam
  IdentitiesOnly yes
Host devops_contoso
  HostName ssh.dev.azure.com
  IdentityFile ~/.ssh/private_key_for_contoso
  IdentitiesOnly yes
#
# Then, instead of using the real URLs, tell Git you want to use these URLs:
# * git@devops_fabrikam:v3/Fabrikam/Project1/fab_repo
# * git@devops_contoso:v3/Contoso/Project2/con_repo
#

# At the end of the file, you can put global defaults for other SSH hosts you
# may connect to.  Note that "*" also matches any hosts that match the sections
# above, and remember that SSH uses the first matching line for each parameter name.
Host *
# The settings in each Host section are applied to any Git SSH remote URL with a
# matching hostname.
# Generally:
# * SSH uses the first matching line for each parameter name, e.g. if there's
#   multiple values for a parameter across multiple matching Host sections
# * "IdentitiesOnly yes" prevents keys cached in ssh-agent from being tried before
#   the IdentityFile values we explicitly set.
# * On Windows, ~/.ssh/your_private_key maps to %USERPROFILE%\.ssh\your_private_key,
#   e.g. C:\Users\<username>\.ssh\your_private_key.

# Say your on-premises Azure DevOps Server instance has SSH URLs like this:
#   ssh://someHost:22/someCollection/some_project/_git/some_repo
# Add the following Host section:
Host someHost
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes

# At the end of the file, you can put global defaults for other SSH hosts you
# may connect to.  Note that "*" also matches any hosts that match the sections
# above, and remember that SSH uses the first matching line for each parameter name.
Host *

Вопрос. Разделы справки исправить ошибки с упоминанием "не найден соответствующий метод обмена ключами"?

Ответ . Git для Windows 2.25.1 поставляется с новой версией OpenSSH, которая по умолчанию удалила некоторые протоколы обмена ключами. в частности, определено diffie-hellman-group14-sha1 как проблематичное для некоторых Azure DevOps Server и клиентов TFS. Эту проблему можно обойти, добавив следующую команду в конфигурацию SSH ( ~/.ssh/config ):

Host <your-azure-devops-host>
    KexAlgorithms +diffie-hellman-group14-sha1

замените <your-azure-devops-host> именем узла Azure DevOps или сервера TFS, например tfs.mycompany.com .

Вопрос. какие уведомления могут получать сведения о ключах SSH?

Ответ . при регистрации нового ключа ssh с Azure DevOps Services вы получите уведомление по электронной почте о том, что в учетную запись добавлен новый ключ ssh.

Пример уведомления SSH

Вопрос. что делать, если я полагаю, что кто-то, помимо меня, добавляет ключи SSH в мою учетную запись?

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

Следующий шаг — выяснить, не был ли ваш пароль скомпрометирован. Изменение пароля всегда является хорошим первым шагом для защиты от этого вектора атак. если вы являетесь Azure Active Directory пользователем, обратитесь к администратору, чтобы проверить, использовалась ли ваша учетная запись из неизвестного источника или расположения.

Вопрос. что делать, если у меня по-прежнему запрашиваются пароль и GIT_SSH_COMMAND="ssh -v" git fetch отображается no mutual signature algorithm ?

Ответ . некоторые дистрибутивы linux, например Fedora Linux, имеют политики шифрования, требующие более строгих алгоритмов подписи SSH, чем поддерживает Azure DevOps (по состоянию на январь 2021). Есть запрос на открытие функции для добавления этой поддержки.

Можно обойти эту ошибку, добавив следующий код в конфигурацию SSH ( ~/.ssh/config ):

Host ssh.dev.azure.com
  PubkeyAcceptedKeyTypes=ssh-rsa

Замените на ssh.dev.azure.com правильное имя узла при использовании Azure DevOps Server.