Поделиться через


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

Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019

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

Внимание

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

Актуальные URL-адреса SSH начинаются с ssh.dev.azure.com. Предыдущие URL-адреса используются vs-ssh.visualstudio.com.

  • Проверьте, какие удаленные серверы используют SSH. Запустите git remote -v в оболочке или используйте вместо этого клиент GUI.
  • Посетите репозиторий в Интернете и выберите "Клонировать".
  • Выберите SSH и скопируйте новый URL-адрес SSH .
  • В оболочке выполняется git remote set-url <remote name> <new SSH URL> для каждого удаленного репозитория, который требуется обновить. Кроме того, используйте клиент графического интерфейса для обновления удаленный URL-адрес.

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

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

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

Ниже описана настройка проверки подлинности ключа SSH на следующих платформах с помощью командной строки (также называемой shell):

Примечание.

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

Совет

В Windows мы рекомендуем использовать диспетчер учетных данных Git или личные маркеры доступа.

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

Примечание.

Если вы уже создали ключи RSA SSH в системе, пропустите этот шаг и настройте ключи SSH. Чтобы проверить это, перейдите в домашний каталог и просмотрите папку .ssh (%UserProfile%\.ssh\ в Windows или ~/.ssh/ linux, macOS и Windows с помощью Git Bash). Если вы видите два файла с именем id_rsa и id_rsa.pub соответственно продолжите настройку ключей SSH.

Чтобы использовать аутентификацию на основе ключей, необходимо заранее создать для клиента одну или несколько пар открытого и закрытого ключей. ssh-keygen.exe используется для создания файлов ключей и можно указать алгоритмы DSA, RSA, ECDSA или Ed25519. Если алгоритм не указан, используется Ed25519.

Примечание.

Единственным типом ключа SSH, поддерживаемым Azure DevOps, является RSA.

Чтобы создать файлы ключей с помощью алгоритма RSA, поддерживаемого Azure DevOps (RSA-SHA2-256 или RSA-SHA2-512), выполните одну из следующих команд из PowerShell или другой оболочки, например bash на клиенте:

ssh-keygen -t rsa-sha2-256

or

ssh-keygen -t rsa-sha2-512

Выходные данные команды должны отображать следующие выходные данные (где username заменяется вашим именем пользователя):

Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_rsa):

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

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_rsa.
Your public key has been saved in C:\Users\username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:FHK6WjcUkcfQjdorarzlak1Ob/x7AmqQmmx5ryYYV+8 username@LOCAL-HOSTNAME
The key's randomart image is:
+---[RSA 3072]----+
|      . ** o     |
|       +.o= .    |
|      . o+       |
|      .+. .      |
|     .ooS  .     |
|  . .oo.=.o      |
|   =.= O.= .     |
|  . B BoE + . .  |
|   . *+*o. .o+   |
+----[SHA256]-----+

Теперь у вас есть пара ключей общедоступного и закрытого RSA в указанном расположении. Файлы PUB являются открытыми ключами, а файлы без расширения — закрытыми.

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        10/11/2022   6:29 PM           2610 id_rsa
-a----        10/11/2022   6:29 PM            578 id_rsa.pub

Внимание

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

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

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

Примечание.

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

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

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

  2. Щелкните + Создать ключ.

    Снимок экрана: доступ к конфигурации безопасности в Azure DevOps.

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

    Внимание

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

    Снимок экрана: настройка открытого ключа в Azure DevOps.

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

  5. На странице обзора открытых ключей SSH отображаются отпечатки пальцев сервера. Запишите отпечаток SHA256, используемый при первом подключении к Azure DevOps через SSH.

    Снимок экрана: доступ к конфигурации безопасности в Azure DevOps Services.

  6. Проверьте подключение, выполнив следующую команду:

    ssh -T git@ssh.dev.azure.com
    

    Если вы подключаетесь в первый раз, вы получите следующие выходные данные:

    The authenticity of host 'ssh.dev.azure.com (<IP>)' can't be established.
    RSA key fingerprint is SHA256:ohD8VZEXGWo6Ez8GSEJQ9WpafgLFsOfLOtGGQCQo6Og.
    This key is not known by any other names
    Are you sure you want to continue connecting (yes/no/[fingerprint])?
    

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

  7. Введите yes , чтобы продолжить. Если все настроено правильно, выходные данные должны выглядеть следующим образом:

    
    If everything is configured correctly the output should look like this:
    
    ```Output
     Warning: Permanently added 'ssh.dev.azure.com' (RSA) to the list of known hosts.
     remote: Shell access is not supported.
     shell request failed on channel 0
    

    Если нет, см. раздел "Вопросы и устранение неполадок".

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

Примечание.

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

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

    Снимок экрана: клонированные URL-адреса SSH в Azure Repos

    Примечание.

    При использовании Azure DevOps Services формат URL-адреса проекта — dev.azure.com/{your organization}/{your project}это формат. Однако предыдущий формат, ссылающийся на visualstudio.com формат, по-прежнему поддерживается. Дополнительные сведения см. в статье "Знакомство с Azure DevOps" для переключения существующих организаций на использование нового URL-адреса доменного имени.

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

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

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

    Cloning into 'FabrikamFiber'...
    Enter passphrase for key '/c/Users/username/.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.
    

    Если вместо этого вам будет предложено проверить отпечатки пальцев, прочитайте шаг 2. Добавьте открытый ключ в Azure DevOps еще раз. Для других проблем ознакомьтесь с разделом " Вопросы и устранение неполадок".

Совет

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

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

Ответ. Могут появиться два разных предупреждения:

ssh-rsa is about to be deprecated and your request has been throttled. Please use rsa-sha2-256 or rsa-sha2-512 instead. Your session will continue automatically. For more details see https://devblogs.microsoft.com/devops/ssh-rsa-deprecation.

Or

You’re using ssh-rsa that is about to be deprecated and your request has been blocked intentionally. Any SSH session using ssh-rsa is subject to brown out (failure during random time periods). Please use rsa-sha2-256 or rsa-sha2-512 instead. For more details see https://devblogs.microsoft.com/devops/ssh-rsa-deprecation.

Если вы изменили конфигурацию SSH для понижения параметров безопасности для Azure DevOps, добавив в ~/.ssh/config файл (%UserProfile%\.ssh\config в Windows):

Host ssh.dev.azure.com vs-ssh.visualstudio.com
  HostkeyAlgorithms +ssh-rsa

Удалите эти строки и убедитесь rsa-sha2-256 , что они rsa-sha2-512 разрешены.

Дополнительные сведения см. в этой записи блога.

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

Ответ. Существует несколько различных проблем, с которыми вы можете столкнуться:

  • Использование неподдерживаемых ssh-rsa

    You’re using ssh-rsa that is unsupported. Please use rsa-sha2-256 or rsa-sha2-512 instead. For more details see https://devblogs.microsoft.com/devops/ssh-rsa-deprecation.
    

    Если вы изменили конфигурацию SSH для понижения параметров безопасности для Azure DevOps, добавив в ~/.ssh/config файл (%UserProfile%\.ssh\config в Windows):

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       HostkeyAlgorithms +ssh-rsa
    

    Удалите эти строки и убедитесь rsa-sha2-256 , что они rsa-sha2-512 разрешены.

    Дополнительные сведения см. в этой записи блога.

  • Ключ узла не совпадает

    Эта проблема не должна происходить в Службе Azure DevOps или более поздних версиях Azure DevOps Server, как упоминалось в записи блога.

    Unable to negotiate with <IP> port 22: no matching host key type found. Their offer: ssh-rsa
    

    Измените конфигурацию SSH, чтобы изменить параметры безопасности для Azure DevOps, добавив в ~/.ssh/config файл (%UserProfile%\.ssh\config в Windows):

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       HostkeyAlgorithms +ssh-rsa
    

    Внимание

    OpenSSH не рекомендует алгоритм подписи открытого ключа в версии 8.2 и отключен по умолчанию в версии 8.8.ssh-rsa

  • Не соответствует MAC

    Unable to negotiate with <IP> port 22: no matching MAC found. Their offer: hmac-sha2-256,hmac-sha2-512
    

    Измените конфигурацию SSH, чтобы изменить параметры безопасности для Azure DevOps, добавив в ~/.ssh/config файл (%UserProfile%\.ssh\config в Windows):

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       MACs +hmac-sha2-512,+hmac-sha2-256
    
  • Метод обмена ключами не соответствует

    Unable to negotiate with <IP> 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256
    

    Измените конфигурацию SSH, чтобы изменить параметры безопасности для Azure DevOps, добавив в ~/.ssh/config файл (%UserProfile%\.ssh\config в Windows):

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       KexAlgorithms +diffie-hellman-group-exchange-sha256,+diffie-hellman-group14-sha1,+diffie-hellman-group1-sha1
    

    Внимание

    Алгоритм diffie-hellman-group1-sha1 обмена ключами по умолчанию отключен в версии 6.9 OpenSSH и diffie-hellman-group14-sha1 версии 8.2.

Совет

Для локально размещенных экземпляров Azure DevOps Server и TFS вместо строки ssh.dev.azure.com vs-ssh.visualstudio.comиспользуйте соответствующее имя Host узла.

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

Ответ. Вы можете использовать агент SSH. Linux, macOS и Windows (начиная с Windows 10 (сборка 1809) или с помощью Git для Windows с Git Bash) все вставляются с агентом SSH. Агент SSH можно использовать для кэширования ключей SSH для повторного использования. Ознакомьтесь с руководством поставщика SSH, чтобы узнать, как его использовать.

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

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

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

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

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

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

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

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

git remote set-url origin <SSH URL to your repository>

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

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

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

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

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

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

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

    Host ssh.dev.azure.com
      IdentityFile ~/.ssh/id_rsa_azure
      IdentitiesOnly yes
    

Этот IdentitiesOnly yes параметр гарантирует, что SSH не использует другое доступное удостоверение для проверки подлинности. Этот параметр важен, если доступно несколько удостоверений.

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

Ответ. Как правило, при настройке нескольких ключей для клиента 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 использовать правильный ключ SSH для узла Azure DevOps.

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

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

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

Эта ошибка связана с тем, что все URL-адреса Azure DevOps используют одно и то же имя узла (ssh.dev.azure.com), что делает невозможным для SSH различать их по умолчанию. Однако вы можете изменить конфигурацию SSH, чтобы различать разные организации, предоставляя отдельные ключи для каждого. Используйте псевдонимы узлов для создания отдельных Host разделов в файле конфигурации 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.

# 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

После этого вместо использования реальных URL-адресов сообщите Git, что вы хотите использовать эти URL-адреса для каждого репозитория в качестве удаленного, заменив имя узла в существующих удаленных удаленных адресах devops_fabrikam и devops_contoso соответственно. Например, для git@ssh.dev.azure.com:v3/Fabrikam/Project1/fab_repo это git@devops_fabrikam:v3/Fabrikam/Project1/fab_repo.

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

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

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

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

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

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

Вопрос. Что делать, если мне по-прежнему предлагается пароль и GIT_SSH_COMMAND="ssh -v" git fetch отображается no mutual signature algorithm или corresponding algo not in PubkeyAcceptedAlgorithms?

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

Чтобы обойти проблему, добавьте следующий код в конфигурацию SSH (~/.ssh/config):

Host ssh.dev.azure.com vs-ssh.visualstudio.com
  PubkeyAcceptedKeyTypes +ssh-rsa

Совет

Для локально размещенных экземпляров Azure DevOps Server и TFS вместо строки ssh.dev.azure.com vs-ssh.visualstudio.comиспользуйте соответствующее имя Host узла.