Как получить ключ узла ssh для новой виртуальной машины Azure Linux, созданной с помощью PowerShell?

Если я создам виртуальную машину Azure Linux с помощью PowerShell, как мне получить ее новый ключ узла ssh, чтобы установить ее в моем локальном ssh/putty? Предпочтительно, чтобы решение также представляло собой код PowerShell.


person Oliver Bock    schedule 31.08.2015    source источник
comment
Вы должны загрузить свой SSH-ключ при создании новой виртуальной машины.   -  person opHASnoNAME    schedule 31.08.2015
comment
Дело не в том, что я хочу использовать открытые ключи для входа в систему; Я с удовольствием использую пароль. Мне нужен ключ host, чтобы putty/plink не запрашивал мои сценарии о принятии нового ключа хоста, и я бы предпочел не перенаправлять «echo y» в plink, чтобы заставить его принять любой ключ он находит. Или я путаюсь? Это одно и то же, и я должен назначить ключ хоста? Я отмечаю, что пользователь агента Linux Руководство говорит, что сообщает платформе отпечаток ключа хоста SSH. Я просто хочу добраться до этого!   -  person Oliver Bock    schedule 31.08.2015
comment
см. этот ответ: serverfault.com/questions/585294/ или это: jeff.wilcox.name/2013/06/secure-linux-vms-with-ssh-certificates   -  person Ereli    schedule 09.09.2015
comment
Вы говорите о подписи хозяина? Отпечаток пальца, который он генерирует и представляет на клиентской машине?   -  person ZaxLofful    schedule 09.09.2015
comment
@Loffful: да, подпись ключа хоста.   -  person Oliver Bock    schedule 10.09.2015
comment
@Ereli: я считаю, что ключ/пара, которую вы можете указать при создании виртуальной машины, предназначена для созданной учетной записи пользователя (для входа в .ssh/authorized_keys). То есть он позволяет вам войти в эту учетную запись без использования пароля. Обратите внимание, что на скриншоте во второй статье видно, что пользователю по-прежнему необходимо вручную принять ключ хоста.   -  person Oliver Bock    schedule 10.09.2015
comment
@OliverBock Вы пытаетесь избежать необходимости принимать подпись при первом подключении к новой виртуальной машине?   -  person Ereli    schedule 10.09.2015
comment
Тогда, насколько я понимаю, нет способа найти открытый ключ, который был сгенерирован, и загрузить его, чтобы SSH принимал его каждый раз. Вам просто нужно принять это в первый раз. Я посмотрел, и нет никакого способа сделать то, что вы хотите, с помощью powershell.   -  person ZaxLofful    schedule 10.09.2015
comment
В идеале процесс создания виртуальной машины должен возвращать отпечаток хоста вместе с IP-адресом и другими важными данными.   -  person Jonah Braun    schedule 03.11.2017


Ответы (6)


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

az vm run-command invoke --name <your-vm-name> --command-id RunShellScript --scripts "cat /etc/ssh/ssh_host_ecdsa_key.pub"

выведет документ json, из которого вы можете извлечь открытый ключ. Имейте в виду, что этот процесс невероятно медленный (~ 30 секунд на хост), но вам нужно запустить его только один раз. См. эту суть в качестве примера того, как обновить файл known_hosts с помощью Ansible.

person mwik    schedule 19.02.2018
comment
В настоящее время вам также нужно добавить -g (или --resource-group), кроме этого, да, это сработает, большое спасибо! - person wvxvw; 16.10.2018
comment
Команду также можно выполнить на портале Azure, см. мой ответ. +1 - person Martin Prikryl; 25.04.2019

Вы можете использовать новую < em>функция «Выполнить команду» портала Azure.

  • На странице виртуальной машины перейдите к "Выполнить команду" в разделе "Операции" меню виртуальной машины.
  • Выберите команду "RunShellScript".
  • Вставьте следующую команду:

    for f in /etc/ssh/ssh_host_*_key; do ssh-keygen -l -f "$f"; done
    
  • Вы получите вывод, например:

    Enable succeeded: 
    [stdout]
    256 SHA256:bKKCom8yh5gOuBNWaHHJ3rrnRXmCOAyPN/WximYEPAU /etc/ssh/ssh_host_ecdsa_key.pub (ECDSA)
    256 SHA256:IYeDl+gseYk46Acg4g2mcXGvCr7Z8FqOd+pCJz/KLHg /etc/ssh/ssh_host_ed25519_key.pub (ED25519)
    2048 SHA256:rA0lIXvHqFq7VHKQCqHwjsj28kw+tO0g/X4KnPpEjMk root@myazurevm (RSA)
    
    [stderr] 
    

    (набор типов ключей зависит от вашего образа ВМ)


Эту функцию также можно использовать через Azure CLI, что показано в ссылке выше, а также в ответе @mwik.


Ознакомьтесь также с моим полным руководством по безопасному подключению к службе Microsoft Azure с помощью SFTP.

person Martin Prikryl    schedule 25.04.2019

Ключи RSA, DSA, ECDSA и ED25519 генерируются при первой загрузке и доступны в журнале диагностики загрузки.

Генерация ключа Список ключей

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

  1. Создайте новую виртуальную машину.

  2. Прикрепите виртуальный жесткий диск виртуальной машины, для которой вам нужен отпечаток пальца.

  3. Проверьте подключение к новой виртуальной машине с помощью отпечатка пальца в диагностике загрузки.

  4. Проверьте отпечаток сгенерированного файла /etc/ssh/ssh_host_rsa_key.pub на другом диске.

    ssh-keygen -lf /{path}/ssh_host_rsa_key.pub

Вам может понадобиться добавить переключатель -E md5, если вам нужен хэш MD5 в шестнадцатеричном кодировании.

PowerShell

Чтобы получить данные диагностики загрузки через PowerShell:

Get-AzureRmVMBootDiagnosticsData -ResourceGroupName ExampleGroup -Name TestLab -Linux

Соединение с Putty

Azure вычисляет отпечатки ключей хоста в виде строки в кодировке Base64 хэша SHA-256 открытый ключ. При попытке подключения с помощью Putty отпечаток представляется в виде шестнадцатеричного числа. закодированная строка хэша MD5 открытого ключа.

К счастью, Azure также перечисляет полный открытый ключ в журнале диагностики загрузки, где во втором заголовке BEGIN SSH HOST KEY KEYS. ="Список ключей">изображение. При этом мы можем вручную вычислить отпечаток, представленный Putty.

С#

static string ComputeMD5FingerprintFromBase64(string encoded)
{
  // Convert Base64 string to byte array.
  byte[] pub = Convert.FromBase64String(encoded);

  // Compute MD5 hash.
  HashAlgorithm md5 = MD5.Create();
  byte[] hash = md5.ComputeHash(pub);

  return BitConverter.ToString(hash).Replace('-', ':');
}

Окна

Инструкции по безопасному подключению к виртуальной машине Windows с помощью RDP см. в моем ответе на этот вопрос StackOverflow.

person lordcheeto    schedule 13.09.2016
comment
Это отличный ответ. Я не принял его, потому что Get-AzureRmVMBootDiagnosticsData не может найти мои виртуальные машины, вероятно, потому, что они являются классическими виртуальными машинами. Когда-нибудь я поставлю их под диспетчер ресурсов и попробую. А пока, пожалуйста, оставьте комментарий, если это сработало для вас. - person Oliver Bock; 11.10.2016
comment
Чтобы вычислить отпечаток пальца PuTTY/WinSCP MD5 из ключа в кодировке Base64, просто используйте эту однострочную команду в консоли PowerShell: Write-Host ([BitConverter]::ToString([Security.Cryptography.MD5]::Create().ComputeHash([Convert]::FromBase64String("<base-64-encoded-key-here>"))) -replace "-", ":").ToLower(). Источник: winscp.net/eng/docs/guide_microsoft_azure#linux - person Martin Prikryl; 21.12.2016
comment
Этот ответ, к сожалению, больше не помогает. Журнал диагностики загрузки больше не содержит ключей хоста — тестировался с образами по умолчанию Debian 9 Stretch и Red Hat Enterprise Linux 7.6. - person Martin Prikryl; 25.04.2019

Возможно, это ты ищешь. Я попробую это с вами на моем аккаунте прямо сейчас.

В основном похоже, что вам нужно прикрепить .pem при создании. введите здесь описание изображения

Это должно дать отпечаток вашего сертификата.
введите здесь описание изображения

person gh0st    schedule 09.09.2015
comment
Упс, похоже, @Ereli наткнулся на ту же статью, что и я. - person gh0st; 10.09.2015
comment
Интересно увидеть здесь поле SSH CERTIFICATE THUMBPRINT. Он не отображается для виртуальной машины на новом портале portal.azure.com, но я вижу его на старом manage.windowsazure.com. Однако он не соответствует отпечатку пальца, который я вижу, когда впервые подключаюсь к хосту через ssh, поэтому я думаю, что это пара ключей для создаваемой учетной записи пользователя, а не ключ хоста. - person Oliver Bock; 10.09.2015
comment
он ищет ключ хоста, а не ключ авторизации пользователя - person joseph; 21.11.2016

Пример виртуальной машины Windows

Select-AzureSubscription mysub $service = 'yourservicename1' $location = 'West US' New-AzureService -ServiceName $service -Location $location Add-AzureCertificate -CertToDeploy 'D:User-DatadevelopmentAzure Samplesmlwdevcert.cer' -ServiceName $service $cert1 = New-AzureCertificateSetting -Thumbprint D7BECD4D63EBAF86023BB4F1A5FBF5C2C924902A -StoreName 'My' New-AzureVMConfig -ImageName 'MSFT__Windows-Server-2012-Datacenter-201208.01-en.us-30GB.vhd' -InstanceSize 'Small' -Name 'win2012cert' | Add-AzureProvisioningConfig -Windows -Password 'somepass@1' -Certificates $cert1 | New-AzureVM -ServiceName $service

Пример виртуальной машины Linux

Select-AzureSubscription mysub $service = 'yourservicename1' $location = 'West US' New-AzureService -ServiceName $service -Location $location Add-AzureCertificate -CertToDeploy 'D:User-DatadevelopmentAzure Samplesmlwdevcert.cer' -ServiceName $service $sshkey = New-AzureSSHKey -PublicKey -Fingerprint D7BECD4D63EBAF86023BB4F1A5FBF5C2C924902A -Path '/home/admin/.ssh/authorized_keys' New-AzureVMConfig -ImageName 'CANONICAL__Canonical-Ubuntu-12-04-amd64-server-20120528.1.3-en-us-30GB.vhd' -InstanceSize 'Small' -Name 'linuxwithcert' | Add-AzureProvisioningConfig -Linux -LinuxUser 'mwasham' -Password 'somepass@1' -SSHPublicKeys $sshKey | New-AzureVM -ServiceName $service

Примечание. Параметры -Certificates и -SSHPublicKeys представляют собой массивы, поэтому они могут принимать несколько сертификатов. -SSHPublicKeys$sshKey1,$sshKey2

Для Linux также есть параметр -SSHKeyPairs для передачи пары ключей вместо открытого ключа. -Сертификаты могут обрабатывать оба типа в Windows.

person Nullpointer    schedule 07.10.2015
comment
С параметром -SSHPublicKeys он задокументирован как Указывает список открытых ключей SSH, уже развернутых в подписке для развертывания на виртуальной машине, что не указывает, является ли это ключом узла или ключами для новой учетной записи пользователя. документация REST также неясна, но дает /home/ user/.ssh/authorized_keys в качестве примера расположения ключей, предполагая, что это пользовательские ключи. Когда вы запускаете это и ssh к виртуальной машине в первый раз, является ли отпечаток пальца, о котором вас спрашивает ssh, тем же, что вы загрузили? - person Oliver Bock; 07.10.2015
comment
Оливер ищет ключ хоста, а не ключ аутентификации пользователя - person joseph; 21.11.2016

В их справочном документе есть страница, рассказывающая о том, как сбросить пароль или ключ ssh:

https://docs.microsoft.com/en-us/azure/virtual-machines/linux/troubleshoot-ssh-connection

person spearous    schedule 11.06.2017
comment
Хотя эта ссылка может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему она решает проблему, улучшит долгосрочную ценность ответа. Пожалуйста, прочтите это как ответить, чтобы получить качественный ответ. - person thewaywewere; 11.06.2017
comment
Вопрос о ключе хоста, а не о пароле или ключе учетной записи. - person Martin Prikryl; 11.06.2017
comment
Ну, в мануале по азуру по ссылке, которую я там давал, это вполне понятно, надо только прочитать. - person spearous; 14.06.2017
comment
Ну не знаю как фотку выложить, но по той ссылке мне понятно что сказали. Это ключ хоста к конкретной виртуальной машине. он находится в разделе «Использование портала Azure» в разделе «Доступные методы устранения неполадок с подключением SSH». - person spearous; 14.06.2017