【问题标题】:Trying to implement Dual Authentication in SFTP尝试在 SFTP 中实现双重身份验证
【发布时间】:2023-04-02 07:43:01
【问题描述】:

根据我客户的要求,我正在尝试在 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) 命令行不安全。机器上的其他用户可以看到您的命令,包括参数。因此,工具不(不应该)接受密码作为参数,至少不直接接受。
  • 2) 以非交互方式提供密码是没有意义的。它实际上会成为备用但较弱的密钥,这意味着您现在有两个密钥需要保护。
  • 确实,我没有看到我们通过密钥进行身份验证时使用密码身份验证。我仍然可以通过 Net::SFTP 确认客户端的要求,但它只接受公钥、密码首选身份验证,但客户端希望先使用密码进行身份验证,然后再使用密钥进行身份验证。因此寻找一些解决方法来实现相同的。

标签: perl sftp file-transfer net-sftp


【解决方案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']);

【讨论】:

  • 这正是我想要的。我遇到了需要密码和密钥交换的情况。我只需要添加“PreferredAuthentications”选项即可使其工作。完成后,效果很好。
猜你喜欢
  • 2019-06-25
  • 2018-01-17
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多