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


46

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

现在; 我无法改变主意(我尝试过)。

有没有一种方法可以至少临时存储SSH密码,GIT可以将密码存储在缓存中一定的时间?


55
the computing center explicitly forbids SSH-keys because they are "insecure"-我对此事有何看法?查找新的服务器主机,因为您的主机显然是无效的。
马特·克拉克

18
@Matt:“计算中心”听起来更像是一个学术网格系统,我猜没有那么多的竞争
grawity

27
他们错了。他们可能忘记了在帐户过期时禁用ssh密钥,因此他们认为ssh密钥是问题所在。
约书亚

10
没事是对的。这是一台国家超级计算机,所以我坚持使用它。对于它的价值,这台机器很棒。约书亚(Joshua)也可能是对的,但是,那是对任何事情都没有好处的权利
user2667180

7
@TheHansinator如果安装了键盘记录器,则您已经受到损害,无论您是否保护ssh连接,都不再重要。但是publickey身份验证还有其他优点。如果password在服务器上禁用身份验证,则可以防止所有攻击者尝试猜测密码。而且,如果攻击者尝试对以前未存储服务器公钥的客户端进行mitm攻击,则与publickey使用password身份验证相比,可以更好地保护您。
卡巴斯德(Kasperd)'18

Answers:


63

连接重用

SSHv2允许同一经过身份验证的连接建立多个“通道” –交互式外壳程序,批处理命令,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:
    

    您回到了本地shell。

  2. 通过主服务器启动新连接:

    $ ssh foo@bar.example.com -S ~/.ssh/bar.socket
    

    你在。

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

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
    

您可以自动执行此操作–最新的OpenSSH版本也具有ControlPersist该功能,如果还没有,则会在后台自动建立一个主连接。这使您可以跳过第1步,而只需像往常一样使用ssh

  1. 配置~/.ssh/config

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

    $ ssh foo@bar.example.com
    foo@bar.example.com's password:
    [foo@bar:~]$ exit
    
  3. 第二个没有:

    $ ssh foo@bar.example.com
    [foo@bar:~]$ yay
    

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

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


1
非常感谢您提供的好答案。谷歌没有在这个问题上有用,因为它总是转向ssh-keys,我不知道正确的关键字。帮助了我很多!
user2667180 '18 -10-1

1
它应该不用说,但是如果您使用此配置,则必须确保您的帐户是安全的,并且您的.ssh文件夹已正确锁定,因为任何有权访问该计算机上的通道文件的人都可以背负您的连接,然后以您的身份访问服务器。
shellster

3
@shellster:您的意思是“任何具有相同UID的人”,就像ssh-agent一样。即使您故意打开套接字文件的权限(默认情况下为0600),其他用户也只会从中获得“ Multiple uid Dismatch”。
grawity '18 -10-1

3
@shellster具有root权限的人可以安装键盘记录程序,并无论如何将您的密码窃取到远程系统,或者执行许多恶意的操作。如果我们担心本地根,那么这与保存SSH私钥一样安全。
合金

1
我不认为本地根源构成威胁,因为如果它成为威胁,那么无论如何您都敬酒。(与政府级间谍一样。)坦率地说,本地根目录可以用您想要的任何东西替换您的ssh客户端 ssh-agent。将所有密码和私钥存储在/root/.secret吗?当然。
grawity '18 -10-3

19

采用 sshpass

sshpass(github手册页)是一个自动将密码输入ssh的工具。使用它的安全方法是:

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

% sshpass -f ~/.ssh/compute_password ssh foo@host

这将从中读取密码~/.ssh/compute_password,就像没有密码短语的私钥文件一样。您可以将sshpass命令放在一个小的Shell脚本或Shell别名中,以避免键入该完整命令。遗憾的是,我还没有找到一种方法来执行此操作~/.ssh/config

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

与其他方法的比较

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

它也没有@grawity关于连接重用的答案的安全性,但是它的优点是根本不需要交互输入密码。

您可以考虑@grawity的答案,它是使用密码短语和私钥缓存(即ssh-agent)的pubkey auth的替代方法。然后,我的答案将是在没有私钥文件密码的情况下替代pubkey auth的方法。


3
如果计算中心的策略是基于“但是密钥对存储在磁盘上的,那么有人可以窃取它们!”,那么看起来该策略将会适得其反。
grawity '18 -10-2

6
@grawity好,坏政策导致更糟糕的变通¯\ _(ツ)_ /¯
marcelm

1
如果您将密码生成为足够长的随机字符流(例如head -c 16 /dev/urandom | base64128位),并且不在其他系统上使用它,则在安全性方面类似于密钥。就像蛮力一样,如果不加密的话,也可以从文件简单使用。如果坏人也得到了文件,这也适用于坏人。唯一的区别是密码是按原样发送到服务器的,而密钥具有更好的数学算法,可以证明您拥有正确的私钥而不泄露它,并且在可用性方面,加密包含密码的文件更加困难(没有标准工具)。
ilkkachu

1

使用密码管理器。

某些密码管理器(例如KeePassXC)具有“自动键入”功能。您将密码存储在密码管理器上,在运行管理器时解锁数据库,每次ssh提示您输入密码时,您按下一个组合键,密码管理器便将您的长密码写入控制台。

无需复制,记住任何内容(用于解锁数据库的密码除外),并且您可以拥有一个强大的密码,而无需在每次尝试登录时都将这30个字符混在一起。

您可以从以下列表中选择自己喜欢的:https : //en.wikipedia.org/wiki/List_of_password_managers


3
我不确定自动键入功能是否适用于基于终端的程序。检测将在寻找特定的窗口标题,而自动键入本身最好不具有KeePass2具有的花式“防键盘记录”功能...
grawity

1
@grawity gnome-terminal将其标题更改为ssh somehostssh询问我密码时的标题,因此您可以毫无问题地将标题窗口与此匹配。我对“防键盘记录”功能一无所知-我每天在终端上使用KeePassXC,最糟糕的是从列表中选择合适的帐户。
发泡胶飞

2
@grawity无论如何,都需要在每个条目的基础上启用防键盘记录功能(正是由于许多程序不支持粘贴的原因)。
鲍勃

0

另一种选择是使用GUI ssh客户端。在Windows上,显而易见的选择是PuTTY。还有一个Linux版本的PuTTY,特别是大多数基于Debian的发行版,例如Ubuntu,通常在其仓库中都包含PuTTY。

另一个非常好的客户是Termius。它不仅支持Windows和Linux,还支持OSX,iOS和Android。尽管它最初是为手机设计的,但桌面版本实际上是相当不错的。

如果我没有记错的话,Windows上古老的超级终端也已经内置了ssh客户端,但是我已经很长时间没有使用Windows了,所以我不确定。

所有GUI客户端均具有保存连接设置(包括您的用户名和密码)的功能。


2
“基于GUI”不会自动暗示允许您存储密码,而PuTTY明确拒绝这样做。与Windows捆绑在一起的超级终端版本仅支持Telnet,更多地侧重于串行链接。也许您正在考虑的Windows CKermit确实具有SSH支持,但是它的密码支持已过时,无法轻易连接到许多当前服务器。
grawity '18 -10-3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.