Capistrano не может развернуться на новом сервере Ubuntu, потому что SSHKit/Net::SSH не может пройти аутентификацию

Я пытаюсь настроить промежуточный/тестовый сервер для новой версии приложения, над которым я работаю. Поэтому я настроил его так, чтобы моя локальная учетная запись могла пройти аутентификацию на сервере развертывания без необходимости вводить пароль:

$ ssh [email protected]
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-28-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 packages can be updated.
0 updates are security updates.

Last login: Thu Jul  7 15:53:38 2016 from 10.10.12.50
tester@app-staging:~$ logout

Теперь я пытаюсь связаться с Capistrano, но он меня сразу отвергает:

$ cap staging deploy:check

$ cap staging deploy:check
(Backtrace restricted to imported tasks)
cap aborted!
Net::SSH::AuthenticationFailed: Authentication failed for user [email protected]

Tasks: TOP => rbenv:validate
(See full trace by running task with --trace)

На данный момент расследование:

  • Первоначально я делал это со всеми хаками, которые требовались при последнем развертывании приложения, поэтому, чтобы исключить многие вещи из уравнения, я переместил все свои файлы в сторону и заставил Capistrano сгенерировать новые конфигурации развертывания. Так что все это работает с минимальной конфигурацией прямо сейчас, и все еще не может аутентифицироваться.
  • Первоначально я предполагал, что аутентификация с открытым ключом будет использоваться по умолчанию, потому что в документах Capistrano говорится, что будет использоваться файл конфигурации SSH пользователя. Теперь я знаю, что это не так, и что вы должны явно указать 'publickey' в качестве метода. Так что до этого он просил пароль. Я надеялся, что заставить его не запрашивать пароль будет самым сложным, что мне нужно было выяснить, но, видимо, нет.
  • Я не совсем уверен, необходима ли настройка «ключи», потому что, опять же, если Capistrano не использует настройки из моей конфигурации, он также может не подбирать файлы ключей. Поэтому я попытался указать путь к файлу вручную, но это все равно ничего не меняет.
  • Раньше у меня было .pub в конце имени файла ключа, пока я не понял, что ему, вероятно, нужен закрытый ключ. Но после его удаления я получаю точно такой же результат.
  • Благодаря предложению в комментариях я удалил пароль из объявления сервера, так как я думаю, что заставить sudo работать без пароля в любом случае является более чистым решением. Однако тот же результат.

Теперь у меня нет идей, как это диагностировать.

Я не могу сказать, есть ли какой-либо Capistrano, эквивалентный ssh -v, чтобы получить больше информации о том, что он пытается сделать.

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

Capfile:

require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano/nginx'

Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }

config/deploy.rb:

lock '3.5.0'

set :application, 'app'

set :scm, :svn
set :repo_url, 'https://svn.acme.com/app/trunk'

set :ssh_options, {
  auth_methods: ['publickey'],
  keys: ['~/.ssh/id_ed25519'],
}

config/deploy/staging.rb:

set :rails_env, 'staging'

server 'all-staging.acme.com', user: 'tester', port: 22,
       roles: %w{web app db}

set :deploy_to, '/var/www/app/staging'

Отслеживание проблемы в sshkit:

Я заметил, что capistrano использует sshkit для реальной работы с SSH, поэтому я написал для этого тестовую программу.

#!/usr/bin/env ruby

require 'sshkit'
require 'sshkit/dsl'

include SSHKit::DSL

SSHKit.config.output_verbosity = Logger::DEBUG

on '[email protected]' do
  puts capture(:ls, '-l')
end

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

Исследование проблемы в Net::SSH:

При установке gems для sshkit я заметил, что он использует еще одну SSH-библиотеку, net-ssh, для фактической работы SSH, поэтому я попытался создать новую тестовую программу, которая просто использовала ее.

$ cat test 
#!/usr/bin/env ruby

require 'net/ssh'

Net::SSH.start('portal-staging.syd.nuix.com', 'tester', verbose: :debug) do |ssh|
  output = ssh.exec!("ls -l")
  puts output
end

На этот раз вывод отладки полезен:

$ ./test 
D, [2016-07-08T10:52:56.725877 #56100] DEBUG -- net.ssh.transport.session[3fe8c6916074]: establishing connection to app-staging.acme.com:22
D, [2016-07-08T10:52:56.727988 #56100] DEBUG -- net.ssh.transport.session[3fe8c6916074]: connection established
I, [2016-07-08T10:52:56.728056 #56100]  INFO -- net.ssh.transport.server_version[3fe8c6913414]: negotiating protocol version
D, [2016-07-08T10:52:56.728080 #56100] DEBUG -- net.ssh.transport.server_version[3fe8c6913414]: local is `SSH-2.0-Ruby/Net::SSH_3.1.1 x86_64-darwin13.0'
D, [2016-07-08T10:52:56.749127 #56100] DEBUG -- net.ssh.transport.server_version[3fe8c6913414]: remote is `SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu1'
D, [2016-07-08T10:52:56.750086 #56100] DEBUG -- socket[3fe8c6913ae0]: read 976 bytes
D, [2016-07-08T10:52:56.750166 #56100] DEBUG -- socket[3fe8c6913ae0]: received packet nr 0 type 20 len 972
I, [2016-07-08T10:52:56.750219 #56100]  INFO -- net.ssh.transport.algorithms[3fe8c690fddc]: got KEXINIT from server
I, [2016-07-08T10:52:56.750326 #56100]  INFO -- net.ssh.transport.algorithms[3fe8c690fddc]: sending KEXINIT
D, [2016-07-08T10:52:56.750437 #56100] DEBUG -- socket[3fe8c6913ae0]: queueing packet nr 0 type 20 len 1684
D, [2016-07-08T10:52:56.750504 #56100] DEBUG -- socket[3fe8c6913ae0]: sent 1688 bytes
I, [2016-07-08T10:52:56.750531 #56100]  INFO -- net.ssh.transport.algorithms[3fe8c690fddc]: negotiating algorithms
D, [2016-07-08T10:52:56.750628 #56100] DEBUG -- net.ssh.transport.algorithms[3fe8c690fddc]: negotiated:
* kex: diffie-hellman-group14-sha1
* host_key: ecdsa-sha2-nistp256
* encryption_server: aes128-ctr
* encryption_client: aes128-ctr
* hmac_client: hmac-sha1
* hmac_server: hmac-sha1
* compression_client: none
* compression_server: none
* language_client: 
* language_server: 
D, [2016-07-08T10:52:56.750654 #56100] DEBUG -- net.ssh.transport.algorithms[3fe8c690fddc]: exchanging keys
D, [2016-07-08T10:52:56.752145 #56100] DEBUG -- socket[3fe8c6913ae0]: queueing packet nr 1 type 30 len 268
D, [2016-07-08T10:52:56.752209 #56100] DEBUG -- socket[3fe8c6913ae0]: sent 272 bytes
D, [2016-07-08T10:52:56.753413 #56100] DEBUG -- socket[3fe8c6913ae0]: read 504 bytes
D, [2016-07-08T10:52:56.753475 #56100] DEBUG -- socket[3fe8c6913ae0]: received packet nr 1 type 31 len 484
D, [2016-07-08T10:52:56.754718 #56100] DEBUG -- socket[3fe8c6913ae0]: queueing packet nr 2 type 21 len 20
D, [2016-07-08T10:52:56.754785 #56100] DEBUG -- socket[3fe8c6913ae0]: sent 24 bytes
D, [2016-07-08T10:52:56.754829 #56100] DEBUG -- socket[3fe8c6913ae0]: received packet nr 2 type 21 len 12
D, [2016-07-08T10:52:56.755084 #56100] DEBUG -- net.ssh.authentication.session[3fe8c68d21bc]: beginning authentication of `tester'
D, [2016-07-08T10:52:56.755183 #56100] DEBUG -- socket[3fe8c6913ae0]: queueing packet nr 3 type 5 len 28
D, [2016-07-08T10:52:56.755222 #56100] DEBUG -- socket[3fe8c6913ae0]: sent 52 bytes
D, [2016-07-08T10:52:56.793167 #56100] DEBUG -- socket[3fe8c6913ae0]: read 52 bytes
D, [2016-07-08T10:52:56.793356 #56100] DEBUG -- socket[3fe8c6913ae0]: received packet nr 3 type 6 len 28
D, [2016-07-08T10:52:56.793467 #56100] DEBUG -- net.ssh.authentication.session[3fe8c68d21bc]: trying none
D, [2016-07-08T10:52:56.793589 #56100] DEBUG -- socket[3fe8c6913ae0]: queueing packet nr 4 type 50 len 44
D, [2016-07-08T10:52:56.793640 #56100] DEBUG -- socket[3fe8c6913ae0]: sent 68 bytes
D, [2016-07-08T10:52:56.795136 #56100] DEBUG -- socket[3fe8c6913ae0]: read 68 bytes
D, [2016-07-08T10:52:56.795258 #56100] DEBUG -- socket[3fe8c6913ae0]: received packet nr 4 type 51 len 44
D, [2016-07-08T10:52:56.795319 #56100] DEBUG -- net.ssh.authentication.session[3fe8c68d21bc]: allowed methods: publickey,password
D, [2016-07-08T10:52:56.795361 #56100] DEBUG -- net.ssh.authentication.methods.none[3fe8c68cb18c]: none failed
D, [2016-07-08T10:52:56.795404 #56100] DEBUG -- net.ssh.authentication.session[3fe8c68d21bc]: trying publickey
E, [2016-07-08T10:52:56.795652 #56100] ERROR -- net.ssh.authentication.key_manager[3fe8c68cbad8]: could not load public key file `/Users/tester/.ssh/id_ed25519.pub': Net::SSH::Exception (public key at /Users/tester/.ssh/id_ed25519.pub is not valid)
D, [2016-07-08T10:52:56.795787 #56100] DEBUG -- net.ssh.authentication.agent[3fe8c68c2dfc]: connecting to ssh-agent
D, [2016-07-08T10:52:56.795868 #56100] DEBUG -- net.ssh.authentication.agent[3fe8c68c2dfc]: sending agent request 1 len 49
D, [2016-07-08T10:52:56.795972 #56100] DEBUG -- net.ssh.authentication.agent[3fe8c68c2dfc]: received agent packet 2 len 5
D, [2016-07-08T10:52:56.796016 #56100] DEBUG -- net.ssh.authentication.agent[3fe8c68c2dfc]: sending agent request 11 len 0
D, [2016-07-08T10:52:56.796136 #56100] DEBUG -- net.ssh.authentication.agent[3fe8c68c2dfc]: received agent packet 12 len 550
E, [2016-07-08T10:52:56.796241 #56100] ERROR -- net.ssh.authentication.agent[3fe8c68c2dfc]: ignoring unimplemented key:unsupported key type `ssh-ed25519' [email protected]
D, [2016-07-08T10:52:56.796414 #56100] DEBUG -- net.ssh.authentication.methods.publickey[3fe8c68c3e64]: trying publickey (4b:98:3b:de:13:27:69:2e:75:84:58:0b:4b:43:70:2f)
D, [2016-07-08T10:52:56.796677 #56100] DEBUG -- socket[3fe8c6913ae0]: queueing packet nr 5 type 50 len 508
D, [2016-07-08T10:52:56.796729 #56100] DEBUG -- socket[3fe8c6913ae0]: sent 532 bytes
D, [2016-07-08T10:52:56.797367 #56100] DEBUG -- socket[3fe8c6913ae0]: read 68 bytes
D, [2016-07-08T10:52:56.797440 #56100] DEBUG -- socket[3fe8c6913ae0]: received packet nr 5 type 51 len 44
D, [2016-07-08T10:52:56.797513 #56100] DEBUG -- net.ssh.authentication.session[3fe8c68d21bc]: allowed methods: publickey,password
D, [2016-07-08T10:52:56.797546 #56100] DEBUG -- net.ssh.authentication.session[3fe8c68d21bc]: trying password
[at this point I interrupt the process]

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


person Trejkaz    schedule 07.07.2016    source источник
comment
Почему ваше объявление server включает параметр password? Казалось бы, это противоречит вашему намерению пройти аутентификацию с помощью открытого ключа.   -  person Matt Brictson    schedule 07.07.2016
comment
Это для sudo, хотя я думаю, что на этот раз я планирую убрать необходимость в пароле sudo, поэтому я удалил его. К сожалению, он все еще не может войти в систему.   -  person Trejkaz    schedule 08.07.2016


Ответы (2)


Похоже, ключи ed25519 поддерживаются Net SSH 4.0.0alpha1-4.

https://github.com/net-ssh/net-ssh/issues/214

Вероятно, вы можете использовать ключи RSA, обновиться до net-ssh 4.0.0alpha4 или, возможно, использовать агент SSH, чтобы обойти это.

person will_in_wi    schedule 09.07.2016
comment
Оказывается, вторая запись о пропуске недопустимого ключа исходит из кода агента, так что я предполагаю, что у меня был запущен агент, но библиотеке это все равно не понравилось. Думаю попробовать принудительно обновить. Либо так, либо просто переключитесь обратно на RSA... это то, что мы все использовали до того, как люди начали рекомендовать вместо него DSA. :/ - person Trejkaz; 10.07.2016

Не в этом ли проблема?

E, [2016-07-08T10:52:56.795652 #56100] ERROR -- net.ssh.authentication.key_manager[3fe8c68cbad8]: could not load public key file `/Users/tester/.ssh/id_ed25519.pub': Net::SSH::Exception (public key at /Users/tester/.ssh/id_ed25519.pub is not valid)

Похоже, что net-ssh не нравится формат вашего открытого ключа id_ed25519.pub.

person Matt Brictson    schedule 08.07.2016
comment
Извините, не обращайте внимания на мой ответ. Вижу, ты это уже обнаружил. Я не знаю, почему net-ssh не может разобрать ваш ключ; Я никогда не сталкивался с такой ошибкой. Я рекомендую открыть вопрос здесь, и, надеюсь, сопровождающий сможет дать больше информации: github.com/net-ssh /net-ssh - person Matt Brictson; 08.07.2016
comment
Мой ключ был действителен, но Ed25519, который, как говорится в другом ответе, был только что добавлен в net-ssh. Моим старым ключом был DSA, который Ubuntu перестал поддерживать. Когда это произошло, я рассмотрел альтернативы и выбрал наиболее безопасный вариант. Мне не повезло, что это также была совершенно новая опция, которую некоторые клиенты (включая net-ssh) не поддерживали. - person Trejkaz; 10.07.2016