当我第一次学习如何创buildSSH密钥时,我所读的教程都指出应该select一个好的密码。 但是最近在设置一个需要ssh到另一台机器的守护进程的时候,我发现在每次启动的时候,有一个我不需要auth的密钥的唯一方法就是创build一个空的密钥密码。 所以我的问题是,使用没有密码的密钥有什么问题?
没有密码的密钥依赖于没有其他人能够获得该密钥(谁也无法获得它提供的资源)。 所以,如果密钥授予访问旁边的一台机器,并且两台机器具有相同的电子和物理安全级别,那么这不是什么大不了的事情。
另一方面,如果您的密钥位于安全性较差的机器上(可能有许多不受信任的用户,很容易访问,或者不能及时更新其修补机制)我想保留那里没有密码的密钥。
最终,这要归功于你的设置的信心,并权衡这样做的风险/成本 – 如果你能够相当确信攻击者获得密钥的权限并不比攻击者能够访问的资源要容易得多,那么你很好。 如果你没有这个信心,你可能应该修改原因:)
另一种解决scheme,在提高安全性的同时使您更轻松,因此您不必始终input密码:
如果要encryption私钥,则可以在工作站上使用ssh-agent
来“caching”未encryption的密钥。 当你想存储你的解密密钥时,你运行ssh-add ~/.ssh/id_rsa
或者你的私钥被命名。 系统会提示您input密码,解密后的密钥将可用于您的ssh连接,直到您注销为止,终止ssh-agent
或closures。
你可以使用ssh-agent -k
存储的密钥,并且你可以使用ssh-agent -t [seconds]
来为该密钥分配一个生命周期,例如: 如果你不想永久解密你的密钥,但是你想在你的主机上做很多事情,你可以把超时设置为5-10分钟。 所以你不必一直input你的密码。
再次,这一切都与你对自己/工作站/安全性的自信程度有关,如果你是唯一有权访问它的人,而且你有一个非常安全的本地密码,而你不邀请自己的漏洞和rootkits,你的密码短私钥是相当安全的。
如果你像我一样,你把私钥保存在一个拇指驱动器上,你一定要encryption,尽pipe它只是一个私钥(我在工作站上使用的私钥),所以如果我失去了我的密钥,我可以很容易地从我的服务器的~/.ssh/authorized_keys
列表中删除拇指驱动器的~/.ssh/authorized_keys
,这也提出了一个/优秀/理由添加USEFUL评论给你的公钥)
在回答以前的答案时,你说只有你信任的人可以用钥匙访问机器。 我只是想澄清一下,你的私钥不需要在你连接的服务器上,以防你正在做什么。 只有你的公钥需要在服务器上,这是一个非问题,这就是为什么它是一个“公共”的关键。
哦,我忘了提及; 当我启动X时启动ssh-agent
,否则我用ssh-add
存储的解密密钥不会通过不同的xterm
会话保留,每次closuresxterm
时我都要重新input密码。我启动了ssh-add
在我的~/.xinitrc
文件中添加,我有:
if [ -x /usr/bin/ssh-agent ]; then eval $(/usr/bin/ssh-agent) fi
我打电话给ssh-agent
包装在eval
因为ssh-agent返回一些运行时需要设置的环境variables,并且从~/.xinitrc
运行,环境variables在整个X会话中都是不变的。
你可以看看我问到的有关Web服务器SSL私钥的类似问题 。 基本上有三种select:
他们每个人都是有缺陷的,所以这一切都取决于你最害怕什么。
对于自动访问,如您所说,需要密码短语的密钥,我总是使用authorized_keys(请参阅sshd(8))的额外选项来限制可以运行的命令。
通常我会在远端提供一个精心编写的脚本,这个脚本完全是我想要允许的工作(或工作 – 它可以查看参数)。
然后,我也将其locking到可以用该密钥连接的IP地址(不是百分之百安全的,但也可以使用命令限制)。
只要没有其他人可以访问密钥,就不需要密码。 实际上,您不能在自动化软件使用的密钥上使用密码。
如果你想使用ssh来做任何types的自动化过程 – 我正在考虑Nagios检查,那么你可能不想使用密码。
在这种情况下,你可能不会在局域网之外使用这个密钥,并且你可以将密钥安全地存储在服务器上。
讨论SSH的大多数教程都会预测一个人从外部networkinglogin,可能来自不安全的计算机,在这种情况下,build议是正确的。
基本上,除非你知道有一个不好的理由,否则创build一个密码。 每次都懒得input密码对你来说可能是一个足够的理由:-)