如果 SSH 密钥被禁止,则缓存密码

use*_*180 48 ssh git

我有一台必须通过 ssh 频繁访问的服务器,因为我在它上面进行计算。现在,计算中心明确禁止SSH 密钥,因为它们“不安全”。他们认为每次在键盘上输入我的密码,可能在其他人面前,是一种更安全的登录方式。

现在; 我无法改变他们的想法(我试过了)。

有没有办法至少临时存储 SSH 密码,就像 GIT 可以在某个定义的时间内将密码存储在缓存中的方式?

use*_*686 65

连接重用

SSHv2 允许同一个经过身份验证的连接建立多个“通道”——交互式 shell、批处理命令、SFTP,以及次要的连接,例如代理转发或 TCP 转发。您的服务器可能默认支持连接多路复用。(如果您的管理员抱怨,它不会在任何地方缓存您的密码 - 它会缓存整个连接。)

在OpenSSH你有ControlMasterControlPath选项(-M和-S)来利用这一点:

  1. 使用 启动“主”SSH 连接-M。(因为你没有在你的配置一了ControlPath的是,你需要使用命令行来指定它-S它需要长住,所以我加入。-fN选项降至背景;他们是技术上可选其他方式)

    $ ssh foo@bar.example.com -fNMS ~/.ssh/bar.socket
    foo@bar.example.com's password:
    
    Run Code Online (Sandbox Code Playgroud)

    你回到了本地 shell。

  2. 通过 master 开始一个新的连接:

    $ ssh foo@bar.example.com -S ~/.ssh/bar.socket
    
    Run Code Online (Sandbox Code Playgroud)

    你在。

  3. 为了使这对 Git/rsync/SFTP 有用,您需要ControlPath在配置中进行设置,因为您无法始终指定-S

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
    
    Run Code Online (Sandbox Code Playgroud)

您可以自动执行此操作——最近的 OpenSSH 版本也可以ControlPersist自动在后台建立主连接(如果还没有的话)。这使您可以跳过第 1 步并像往常一样使用ssh

  1. 配置~/.ssh/config

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
        ControlMaster auto
        ControlPersist 15m
    
    Run Code Online (Sandbox Code Playgroud)
  2. 第一次连接要求输入密码:

    $ ssh foo@bar.example.com
    foo@bar.example.com's password:
    [foo@bar:~]$ exit
    
    Run Code Online (Sandbox Code Playgroud)
  3. 第二个没有:

    $ ssh foo@bar.example.com
    [foo@bar:~]$ yay
    
    Run Code Online (Sandbox Code Playgroud)

要控制 Multiplex 主机(停止它或配置 TCP 转发),请使用该-O选项。

最近的 PuTTY 版本支持类似的方法。

  • @shellster 拥有 root 权限的人可以安装键盘记录器并将您的密码窃取到远程系统,或者做任何邪恶的事情。如果我们担心本地 root,这并不比保存 SSH 私钥安全。 (4认同)
  • @shellster:您的意思是“具有相同 UID 的任何人”,就像 ssh-agent 的情况一样。即使您故意打开套接字文件的权限(默认为 0600),其他用户也只会从中获得“多路复用 uid 不匹配”。 (3认同)
  • 非常感谢你这么好的回答。google 在这个问题上没有用,因为它总是转向 ssh-keys 而我不知道正确的关键字。帮了我很多! (2认同)
  • 我不认为本地 root 是一种威胁,因为如果它成为一种威胁,无论如何你都会干杯。(与政府级间谍一样。)坦率地说,本地 root 可以用他们想要的任何东西替换您的 ssh 客户端 _and_ ssh-agent。将所有密码和私钥存储在 /root/.secret 中?当然。 (2认同)

mar*_*elm 19

sshpass

sshpass ( github , man page ) 是一种自动将密码提供给 ssh 的工具。使用它的安全方法是这样的:

% echo 'correct horse battery staple' > ~/.ssh/compute_password
% chmod go-rw ~/.ssh/compute_password

% sshpass -f ~/.ssh/compute_password ssh foo@host
Run Code Online (Sandbox Code Playgroud)

这将从 中读取密码~/.ssh/compute_password,就像没有密码短语的私钥文件一样。您可以将sshpass命令放在一个小的 shell 脚本或 shell 别名中,以避免键入完整的命令。可悲的是,我还没有找到从~/.ssh/config.

(也可以直接在命令行上将密码指定为sshpass,但应避免这样做,因为它会将密码泄露给任何可以这样做的人ps

与其他方法的比较

这种方法当然不如正确设置公钥身份验证安全,但您可能已经知道了。

它也比@grawity 关于连接重用的答案更不安全,但它的优点是根本不必以交互方式输入密码。

您可以将@grawity 的答案视为具有密码短语和私钥缓存(即ssh-agent)的公钥身份验证的替代方法。那么我的答案将是公钥身份验证的替代方法,而私钥文件上没有密码。

  • @grawity 好吧,糟糕的政策会导致更糟糕的变通方法¯\\_(ツ)_/¯ (6认同)
  • 如果计算中心的策略是基于“但密钥对存储在磁盘上,有人可以窃取它们!”的基础上编写的,那么该策略似乎会适得其反。 (3认同)