Я пытаюсь настроить промежуточный/тестовый сервер для новой версии приложения, над которым я работаю. Поэтому я настроил его так, чтобы моя локальная учетная запись могла пройти аутентификацию на сервере развертывания без необходимости вводить пароль:
$ 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
есть еще один ключ, который, похоже, даже не пробовали.
server
включает параметрpassword
? Казалось бы, это противоречит вашему намерению пройти аутентификацию с помощью открытого ключа. - person Matt Brictson   schedule 07.07.2016