Попытка реализовать двойную аутентификацию в SFTP

#perl #sftp #file-transfer #net-sftp

#perl #sftp #передача файлов #net-sftp

Вопрос:

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

Я пытался добиться этого двумя способами :

1) Использование NET ::SFTP::Foreign, но этот модуль имеет предпочтительную аутентификацию по умолчанию в виде открытого ключа, пароля и не позволяет мне переопределять то же самое с помощью пароля, открытого ключа, даже если я явно указываю в команде.

 $sftp=Net::SFTP::Foreign->new("xyz.com",
                              user=> pqr,                            
                              password=>1234,
                              port=>2222,                                 
                              key_path=>/home/ddd/.ssh/id_rsa,
                              more=>[-vo=>'StrictHostKeyChecking=no',
                                     -o=>"ProxyCommand=/usr/bin/ssh " .
                                         "-o UserKnownHostsFile=/dev/null ".
                                         "-o StrictHostKeyChecking=no ".
                                         "-oPreferredAuthentications=password,publickey,keyboard-interactive " .
                                         "-oNumberOfPasswordPrompts=1 " .
                                         "-i /home/nnn/.ssh/flsftp " .
                                         "-l flsftp proxyserver.com " .
                                         "nc xyz.com 2222"]);
  

2) Использование команды SFTP
Я могу установить соединение вручную, используя команду SFTP, и ввести пароль при появлении запроса, но для автоматизации его с помощью Perl я не могу найти способ передать пароль в командной строке. Я узнал некоторые способы, такие как sshpass или expect, но по соображениям безопасности я не могу использовать ни то, ни другое.

 sftp -o UserKnownHostsFile=/dev/null 
     -o StrictHostKeyChecking=no 
     -i /home/ddd/.ssh/id_rsa 
     -o PreferredAuthentications=password,publickey,keyboard-interactive 
     -o NumberOfPasswordPrompts=1 
     -o 'ProxyCommand=/usr/bin/ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /home/nnn/.ssh/flsftp -l flsftp proxyserver.com nc xyz.com 2222' 
     pqr@xyz.com
  

Комментарии:

1. 1) Командные строки небезопасны. Другие пользователи на компьютере могут видеть ваши команды, включая аргументы. Таким образом, инструменты не принимают (не должны) пароли в качестве аргументов, по крайней мере, напрямую.

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

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

Ответ №1:

Net::SFTP::Foreign пытается обнаружить случай, когда вы устанавливаете PreferredAuthentications себя, чтобы позволить ему пройти без изменений. Просто код обнаружения не очень сложный, и иногда он терпит неудачу. Попробуйте сделать это следующим образом:

 $sftp=Net::SFTP::Foreign->new("xyz.com",
                              user => "pqr",                            
                              password => "1234",
                              port => 2222,                                 
                              key_path => "/home/ddd/.ssh/id_rsa",
                              more => ['-v',
                                       -o => 'StrictHostKeyChecking=no',
                                       -o => 'UserKnownHostsFile=/dev/null',
                                       -o => 'PreferredAuthentications=password,publickey,keyboard-interactive']);
  

Комментарии:

1. Это именно то, что я искал. У меня была ситуация, когда требовался обмен паролем и ключом. Мне нужно было только добавить параметры ‘PreferredAuthentications’, чтобы заставить его работать. После завершения это сработало отлично.