你如何设置SSH来使用密钥而不是用户名/密码进行身份validation?

你如何设置SSH来validation用户使用密钥而不是用户名/密码?

对于每个用户:他们应该使用ssh-keygen -t rsa (在本地机器上)生成他们的密钥对( rsa可以被replace为dsa或者rsa1 ,尽pipe这些选项不被推荐)。 然后他们需要把他们的公钥( id_rsa.pub )的内容放到login到服务器的~/.ssh/authorized_keys

我实际上更喜欢ssh-copy-id ,默认情况下在* nix上find的脚本(可以很容易地放在Mac OS X上 ),自动为你做这个。 从手册页:

ssh-copy-id是一个使用sshlogin到远程计算机的脚本(大概使用login密码,所以应该启用密码authentication,除非你已经聪明地使用了多个身份)

它也改变了远程用户的家庭〜/ .ssh和〜/ .ssh / authorized_keys的权限以删除组的可写性(否则,如果远程sshd在其configuration中设置了StrictModes,将会阻止你login)。

如果给定了-i选项,则使用身份文件(默认为〜/ .ssh / identity.pub),而不pipe您的ssh-agent中是否有任何密钥。

嗯,不明白。 只需创build一个密钥,然后开始使用。 🙂 HOWTO除此之外,你可以禁止通过密码login。 在例如/ etc / ssh / sshd_config中:

 PasswordAuthentication no 

这是相当直接的做法 – 这里有一个简单的演练。

要点是:

  • 在你的机器上运行ssh-keygen 。 这将为您生成公钥和私钥。
  • 将公钥的内容(可能在~/.ssh/id_rsa.pub )复制并粘贴到远程机器上的~/.ssh/authorized_keys

重要的是要记住,这将使任何访问您的计算机上的私钥的人都能够访问远程机器,因此在生成密钥对时,您可以select在此input密码以获得额外的安全性。

总结别人的说法,设置SSH密钥非常简单,非常宝贵。

在您将要从中进行SSH连接的计算机上,需要生成密钥对:

 claudius:~$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/dinomite/.ssh/id_rsa): <ENTER> Enter passphrase (empty for no passphrase): <PASSPHRASE> Enter same passphrase again: <PASSPHRASE> Your identification has been saved in /home/dinomite/.ssh/id_rsa. Your public key has been saved in /home/dinomite/.ssh/id_rsa.pub. The key fingerprint is: a3:93:8c:27:15:67:fa:9f:5d:42:3a:bb:9d:db:93:db dinomite@claudius 

只要在提示时按回车键并在提示时input密码即可 – 理想情况下,这与当前主机上的常规login密码以及您将要SSH连接的密码不同。

接下来,您需要将刚刚生成的密钥复制到要SSH 连接的主机。 大多数Linux发行版都有一个工具ssh-copy-id来做到这一点:

 claudius:~$ ssh-copy-id caligula.dinomite.net Now try logging into the machine, with "ssh 'caligula.dinomite.net'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. 

如果您的发行版没有这个function,那么您应该将该密钥复制到目标主机,并将其添加到(可能存在的) .ssh/authorized_keys文件中:

 claudius:~$ scp .ssh/id_dsa.pub caligula.dinomite.net: id_dsa.pub 100% 1119 1.1KB/s 00:00 claudius:~$ ssh caligula.dinomite.net Last login: Sat May 9 10:32:30 2009 from claudius.csh.rit.edu Caligula:~$ cat id_dsa.pub >> .ssh/authorized_keys 

最后,要从SSH密钥中获得最大利益,您将需要运行SSH代理。 如果您使用桌面环境(Gnome,KDE等),那么只需注销并重新login即可为您启动SSH代理。 如果没有,你可以将下面的代码添加到你的shell的RC文件( .bashrc.profile等)中:

 SSHAGENT=/usr/bin/ssh-agent SSHAGENTARGS="-s" if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then eval `$SSHAGENT $SSHAGENTARGS` trap "kill $SSH_AGENT_PID" 0 fi 

这是一个清单。 如果一个人一个接一个地跟随,那么对于无密码login最常见的陷阱应该被覆盖。 这些观点中的大多数都在其他地方提到。 这是一个聚合。

每个计算机上必须有一个~/.ssh目录chmod 700 ,该目录下将发起或接收连接。

(私有)密钥必须在没有密码的情况下生成,或者代理可以被启动,其将持有密钥承载密钥的解密版本供客户端使用。 用ssh-agent $SHELL启动代理。 这是$SHELL部分,我花了一段时间才发现。 如果您想使用代理,请参阅手册页,因为有许多细节。

不要忘记,最近版本的sshd不支持弱(<2048位DSA)密钥。

必须在客户端计算机上完成以下操作才能发起连接。

  1. 您的私钥必须放在~/.ssh/id_rsa~/.ssh/id_dsa中。 您可以使用其他名称,但是必须将其包含在原始机器的ssh命令的-i选项上以明确指示私钥。

  2. 您的私钥必须是chmod 600

  3. 检查你的home文件夹是chmod 700

现在让一台机器接收请求。 一个常见的模式是pipe理员让你访问你不属于自己的机器(如共享networking主机)。 因此,使用ssh的想法是,你提供你的公钥给谁给你的帐户。 这就是为什么你通常不把私钥放在接收请求的机器上。 但是,如果你想让这台机器做出ssh的话,那么你必须把它作为一个原始的机器。

  1. 您的公钥必须放在一个名为~/.ssh/authorized_keys的文件下,该文件将接收连接。 您也可以在此处放置其他允许通过此帐户连接的密钥。 一个特别棘手的事情,如果你在vi中,并从PuTTY的粘贴缓冲区粘贴到文件的密钥是这样的:密钥以“ssh-”开头。 如果你不处于插入模式,第一个“s”将把vi放入插入模式,其余的键看起来就好了。 但是在密钥的开头你会错过一个“s”。 我花了几天的时间才find的。
  2. 我喜欢chmod 600 ~/.ssh/authorized_keys 。 它至less必须是gw。
  3. 现在,您必须将主机指纹添加到caching中。 去机器A,然后用ssh手工加工B. 第一次,你会得到一个像“你想添加…到主机密钥caching?”的查询。 如果您试图使自动化(例如脚本)使用此login,则必须确保自动化正在使用的ssh客户端不会得到此提示。

正如其他人所说,你的用户应该使用ssh-keygen在自己的客户机上为自己制作密钥对,并将他们的公钥添加到他们想login的机器上的〜/ .ssh / authorized_keys。

有关更详细的信息,我强烈build议SSH,安全壳 。

这里有很好的build议,所以我不再重复。 一旦您设置了一台服务器,允许您使用密钥login,则可以设置其他人对此服务器执行相同操作:

 remote=server1 server2 server3 server4 for r in $remote; do echo connecting to $r; tar czf - ./.ssh/id*.pub ./.ssh/authorized_keys2 ./.ssh/config | ssh $r "tar zxf -; chmod 700 .ssh" ; done 

只需cd到您的主目录,将variablesremote定义为一个或多个服务器名称,并一次做一堆。 它要求的密码将是您远程服务器的ssh密码。 你当然可以使用没有for循环的简化版本:

 tar czf - ./.ssh/id*.pub ./.ssh/authorized_keys2 ./.ssh/config | ssh YOUR_SERVER_NAME_HERE "tar ztvf -; chmod 700 .ssh" 

请记住:只能复制公钥。 你不希望你的私钥坐在一些服务器上,任何有sudo的人都可以复制它们,并强制你的密码。