我使用SSH密钥,没有密码与私人/公共密钥。
我读了O'reilly的SSH书,你可以在没有密码的情况下encryptionSSH密钥
我不完全确定这些是什么意思。
你将如何有一个encryption的SSH的积极使用?
运行一个SSH代理(一个持有你的密钥的进程,暂时解锁):
eval $(ssh-agent)
然后将密码保护密钥添加到代理(所以它可以在提示时显示密钥):
ssh-add ~/.ssh/my_protected_key
(提示时input您的密码短语)
然后,当您尝试login到想要使用密码保护密钥的系统时,代理会将其发出,而不需要手动input密码。
完成后,您可以再次停止代理:
ssh-agent -k
这将防止有人访问您的帐户(和正在运行的代理)并使用密钥。
掘金关于公钥authentication的一般论文
我为什么要使用公钥authentication?
密码不是世界上最安全的东西。 即使用户select一个比他们的狗的名字更强的“安全”密码,密码仍然容易受到暴力攻击。 通过SSH对用户密码的蛮力攻击在互联网上是相当常见的,一些stream行的蠕虫和僵尸会不断地对任何连接到互联网的主机执行自动攻击。 即使是一个安全的密码面临这些攻击的风险,手动或蠕虫。 允许用户访问多个用户的系统是一个安全漏洞的邀请。
此外,如果您在大量主机上拥有帐户,则很有可能在多台主机上重复使用相同的密码,以减less手指必须记住的密码数量。 远程系统上的每个共享密码都会使您对该主机的密码文件造成更大的威胁,并且意味着如果一台主机受到威胁,那么共享相同密码的所有其他主机的安全性明显降低。 哎呀,你可能会错误地把你的密码错误地误入IRC频道,然后在下午的剩余时间内find你重新使用这个密码的所有系统,这样你就可以在任何人发现它之前改变它。 这不好玩(或者我听说过!)
谢天谢地,有一个解决scheme! OpenSSH拥有一个健壮的,经过良好testing的公钥validation系统。正确设置后,它不仅比使用密码更安全,而且使用起来也更容易。 这种情况多久发生一次?
公钥是什么意思呢?
公钥authentication(或PKI – 公钥基础结构)是一种依赖于生成的公钥/私钥对的authentication方法。 使用PKI,会生成一个特殊的“密钥”,它具有非常有用的属性:任何能够读取公钥的密钥都可以对数据进行encryption,然后只能被访问私钥的人读取。 通过这种方式,通过访问公众一半的密钥,您就可以将秘密信息发送给任何一个拥有私人信息的人,同时也可以validation一个人确实可以访问私人信箱。 很容易看到如何使用这种技术进行身份validation。
作为用户,您可以生成一个密钥对,然后将公钥的一半放在远程系统上。 那么这个远程系统就可以validation你的身份,或者certificate你确实是你,并允许你login,只要你certificate你有权访问私钥的一半。 这在SSH内部的协议级别完成,并自动发生。
但是,这意味着您需要保护私钥的隐私。 在没有root权限的共享系统上,可以通过使用密码encryption私钥来完成,密码的function类似于密码。 在SSH可以读取您的私钥以执行公钥authentication之前,您将被要求提供密码,以便私钥可以被解密。 在更加安全的系统上(比如你是唯一的用户的机器,或者你的家里没有陌生人可以物理访问的机器),你可以通过创build一个未encryption的公钥(没有密码)或者通过input密码一次,然后在计算机上将密钥caching到内存中。 OpenSSH包含一个名为ssh-agent的工具,它简化了这个过程。
我该如何设置?
你需要做的第一件事就是使用OpenSSH中的ssh-keygen工具生成一个密钥对。 使用PuTTY的Windows用户可以以相同的方式使用相关的putty-keygen.exe程序。 SecureCRT还内置了一个密钥对生成器。 以下是创build密钥对的日志:
luser@localhost:~$ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/luser/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/luser/.ssh/id_dsa. Your public key has been saved in /home/luser/.ssh/id_dsa.pub. The key fingerprint is: f3:77:56:58:a8:bb:08:59:67:15:2c:0e:1d:d0:40:a3 [email protected] luser@localhost:~$
现在你有两个组成一个密钥对。 文件id_dsa是私人的一半,文件id_dsa.pub是公共的一半。 你会想确保只有你可以读取私人文件。 这是至关重要的,因为OpenSSH将拒绝使用世界或组可读的密钥文件。 如此validation:
luser@localhost:~$ chmod 700 $HOME/.ssh luser@localhost:~$ chmod 600 $HOME/.ssh/id_dsa* luser@localhost:~$ ls -la .ssh total 10 drwx------ 2 luser luser 512 Nov 15 16:12 . drwx-----x 12 luser luser 1024 Jun 24 2004 .. -rw------- 1 luser luser 1264 Nov 15 16:12 id_dsa -rw------- 1 luser luser 1123 Nov 15 16:12 id_dsa.pub luser@localhost:~$
所以现在我们在那里。 你有你的密钥对,但我们需要把公钥的一半放在远程机器上。 如果你看看你最喜欢的编辑器中的id_dsa.pub文件,你会发现它只是一大堆数字和字母。 这意味着剪切和粘贴是很容易的,比使用sftp或scp等文件传输协议将其发送到远程机器更简单。 通常打开另一个terminal窗口并粘贴到另一个主机是最简单的。 无论哪种情况,您都需要将id_dsa.pub的内容填入远程主机上名为$ HOME / .ssh / authorized_keys的文件中。 和以前一样,确保.ssh目录只能被你读取(chmod 700),而authorized_keys文件也是(chmod 600)。 你应该得到这样的结果:
luser@remotehost:~$ls -la .ssh total 16 drwx------ 2 luser luser 512 Jul 11 19:01 . drwx--x--x 7 luser luser 1024 Nov 14 18:01 .. -rw------- 1 luser luser 1123 Nov 15 16:21 authorized_keys
所以现在你们都设置了使用公钥authenticationlogin。 而不是被要求在远程主机上input密码,而是用来encryption本地私钥的密码。 试一试:
luser@localhost:~$ssh remotehost.example.com Enter passphrase for key '/home/luser/.ssh/id_dsa': Last login: Tue Nov 15 16:20:50 2005 from localhost.example.com
luser @ remotehost:〜$这就是它的全部! 实际上,远程主机端的用户帐户甚至不需要密码。 没有密码(与空密码不一样),甚至无法在没有私钥的情况下login远程系统。 这使帐户完全免于暴力密码攻击。 但是,还有其他的好处。 实际上,您可以将多个公钥放置在远程主机上的authorized_keys文件中。 这意味着如果您经常从多个位置ssh,您可以生成多个私钥。 例如,您可以为家中的计算机和办公室的计算机创build单独的密钥对。 远程主机可能在authorized_keys文件中只有一个或两个这些密钥。 您可以为您的工作笔记本电脑创build第三个密钥对。
你为什么要多个键? 想象一下,如果你的笔记本电脑丢失或被盗。 您可以简单地login到远程主机,并从authorized_keys文件中删除特定公钥,即使有人设法破解或猜测保护私钥的密码,笔记本电脑也将无法login到远程主机。 这样,“撤销”一个密钥对就很简单了。
您还会发现,您不再试图与多个远程主机共享一个密码,这会大大提高您的整体安全性,因为如果某个帐户在一台远程主机上受到威胁,则无法链接到其他任何其他主机其他主机上的帐户。
高级用法:ssh代理
实际上,您可以进一步采用公钥身份validation,并通过本地caching您的私钥使您的生活更加轻松。 OpenSSH包含一个叫做“ssh-agent”的工具,可以用来完成这个工作。 这提供了一个易于使用无密码私钥和安全性的妥协方法,即在有人未授权访问实际文件的情况下对私钥进行encryption。 你在你所在的本地机器上运行ssh-agent,并用它来caching重复使用的私钥。
使用ssh-agent的关键是把它作为你的用户会话本身的父进程启动。 许多Unix已经为你做了这个,如果你检查你的进程列表,你可能会发现ssh-agent已经在运行提供这个function。 使用PuTTY的Windows用户可以使用PuTTY的“pagaent.exe”工具,Mac OS X用户可以像下载SSHKeyChain一样下载第三方工具,或者像使用其他Unix一样使用命令行ssh-agent。 [编辑:OS X 10.5“Leopard”内置了ssh代理支持。如果您正在运行Leopard,则不需要安装任何其他软件]如果您的操作系统没有为您运行ssh-agent,想要将其作为login过程的一部分进行调用。 例如,您可以更改您的gdm或xdmlogin名来调用“ssh-agent gnome-session”而不是“gnome-session”,以便ssh-agent可以坐在会话的顶部。 关键是确保SSH_AUTH_SOCK和SSH_AGENT_PID环境variables对于主机上的会话是全局的。 使用ssh-agent驻留程序,您可以手动运行它,并使用ssh-add存储您的私钥:
luser@localhost:~$ ssh-add ~/.ssh/id_dsa Need passphrase for /home/luser/.ssh/id_dsa ([email protected]). Enter passphrase: luser@localhost:~$
完成之后,您现在应该能够ssh到任何远程主机而不被您的密码挑战。 OpenSSH将与本地的ssh-agent守护进程进行通信,并自动从中检索私钥。 这个身份validation甚至可以(可选地)传输到远程主机,这意味着如果你从远程主机跳到第三个主机,身份validation可以传回到你的本地ssh-agent,并且不需要input密码或密码。
请注意,使用ssh-agent会将您的私钥置于ssh-agent所在机器上具有root权限的任何人身上。 在没有或不信任pipe理员的机器上使用ssh-agent并不明智。 允许OpenSSH将身份validation转发到您不是或不信任pipe理员的计算机上也是不明智的。 您可以通过使用-A或-a开关的命令行或通过在$ HOME / .ssh / config文件中设置选项来控制代理转发是否发生:
# # .ssh/config file for luser@localhost # # Forward X11 and Auth to slacker.com hosts, they can be trusted Host *.slacker.com ForwardAgent yes ForwardX11 yes # Forward X11 and Auth to my trusted example.com hosts Host *.example.com ForwardAgent yes ForwardX11 yes # All hosts which haven't been matched above, paranoid settings Host * ForwardAgent no ForwardX11 no Compression yes KeepAlive yes
而已!
一旦你习惯于使用公钥authentication,你会想知道你是如何在没有它的情况下生活的。 真是太了不起了 它不仅更安全,而且使得使用SSH更简单,更强大。 请享用!
本文是我的个人网站上的文档转发,但我无法链接到它,因为我是一个新的用户在这里serverfault。
使用ssh-agent,你可以input你的密码,让你的私钥解锁,这样你就可以远程连接到任意多台不同的远程机器,而不需要一遍又一遍的问你的密码。
在Mac OS X系统中,ssh-agent绑定到Keychain中,只需inputlogin密钥链密码,ssh-agent就可以自动使用密钥链中的密码。
为了您的交互式使用,不要使用没有密码的密钥。 使用ssh-agent / ssh-add代替,因为这将允许您在会话开始时只input一次密码。 这非常方便,而且比不使用密码更安全得多。
唯一可以考虑使用密钥而不使用密码的方法是专门的服务器 – 服务器通信,例如备份服务器与备份客户端通信(反之亦然)。 对于这些情况下,不使用密码,但使用一个单独的用户名,并限制它可以做什么用ssh的ForceCommand等