如何设置ssh以使用密钥而不是用户名/密码进行身份验证?


34

如何设置ssh以使用密钥而不是用户名/密码对用户进行身份验证?

Answers:


27

对于每个用户:他们应该使用(在本地计算机上)生成密钥对ssh-keygen -t rsarsa可以使用dsa或替换rsa1,尽管不建议使用这些选项)。然后,他们需要将其公钥(id_rsa.pub)的内容放入~/.ssh/authorized_keys正在登录的服务器上。


我要添加的唯一其他内容是查看文件和目录的权限。
特伦特

2
别忘了chmod 0700 .ssh chmod 0600 .ssh / authorized_keys
Dave Cheney

3
绝对可以通过这种方式生成密钥,但是请查看@Chris Bunch的有关“ ssh-copy-id”的帖子。这样便可以转移您的“ id_rsa.pub”。
加雷斯

@gyaresu:谢谢!我刚学到新东西!:-D
克里斯·杰斯特·杨

23

我实际上更喜欢ssh-copy-id,它是默认情况下在* nix上找到的脚本(也可以很容易地放在Mac OS X上),它可以自动为您执行此操作。从手册页:

ssh-copy-id是一个使用ssh登录到远程计算机的脚本(大概使用登录密码,因此应该启用密码身份验证,除非您已经巧妙地使用了多个身份)

它还更改了远程用户的主目录,〜/ .ssh和〜/ .ssh / authorized_keys的权限,以删除组可写性(如果远程sshd在其配置中设置了StrictModes,则这将阻止您登录)。

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


2
@Chris Bunch每个人都在这里寻找!:) ssh-copy-id绝对是共享一个人的id_rsa.pub的方式
Gareth,2009年

1
太酷了,我从来不知道这件事……我写了自己的剧本来做同样的事情:-/
David Z

6

哼,不明白。只需创建一个密钥并开始。:) HOWTO 另外,您可以禁止通过密码登录。在例如/ etc / ssh / sshd_config中:

PasswordAuthentication no

2
并且您还需要将UsePAM设置为no(或相应地配置PAM)。令人惊讶的是有多少HOWTO错过了这一部分。否则,您仍然可以使用密码登录。
弥敦道

3

这是相当简单的操作-在这里可以找到一个简单的演练。

要点如下:

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

重要的是要记住,这将为有权访问您计算机上的私钥的任何人提供对远程计算机的相同访问权,因此在生成密钥对时,您可以选择在此处输入密码以提高安全性。


我建议剪切粘贴而不是复制。authorized_keys文件可以包含多个密钥,并且您不想破坏那里已经存在的其他密钥。
克里斯·杰斯特·杨

我最喜欢的演练已委托给Wayback Machine:web.archive.org/web/20061103161446/http
菲利普·德宾

@Chris oops-我的意思是将其复制到文件中,而不是覆盖!现在答案更新澄清
ConroyP


1

总结其他人所说的话,设置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

只需在提示处按Enter,然后在出现提示时输入密码-理想情况下,该密码与当前主机和您将通过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.

如果您的发行版没有该密钥,则应将密钥复制到目标主机,并将其添加到(可能存在的).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等),则只需注销并重新登录即可为您启动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

1

这旨在作为清单。如果逐点进行操作,则应涵盖无密码登录的最常见陷阱。这些要点大多数在其他地方提到。这是一个汇总。

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

(专用)密钥必须在没有密码短语的情况下生成,否则可以启动一个代理,该代理将保存解密版本的带有密码短语的密钥供客户端使用。使用启动代理ssh-agent $SHELL。这是$SHELL我花了一段时间才找到的部分。如果要使用代理,请参见手册页,因为其中包含许多详细信息。

不要忘记默认情况下,最新版本的sshd不接受弱(<2048位DSA)键。

以下必须在客户端机器上完成,以发起的连接。

  1. 你的私钥必须被放置在~/.ssh/id_rsa~/.ssh/id_dsa适当。您可以使用其他名称,但是必须在原始计算机上ssh命令的-i选项中包含该名称,以显式指示私钥。

  2. 您的私钥必须为chmod 600

  3. 检查主文件夹是否为chmod 700

现在用于允许机器接收请求。常见的模式是管理员允许您访问您不拥有的计算机(例如共享虚拟主机)。因此,使用ssh的想法是,您将公共密钥提供给向您提供帐户的任何人。这就是为什么您通常不将私钥放在接收请求的计算机上的原因。但是,如果您还希望此计算机也执行传出ssh,则必须按照上述步骤将其视为原始计算机。

  1. 您的公共密钥必须放在~/.ssh/authorized_keys接收连接的帐户下名为的文件中。您也可以在此处放置其他允许通过此帐户连接的密钥。如果您正在使用vi并将密钥从PuTTY中的粘贴缓冲区粘贴到文件中,这将是一件特别棘手的事情:密钥以“ ssh-”开头。如果您未处于插入模式,则第一个“ s”会将vi置于插入模式,其余键看起来也很好。但是,您会在密钥的开头丢失一个“ s”。我花了好几天才找到它。
  2. 我喜欢chmod 600 ~/.ssh/authorized_keys。它必须至少是gw。
  3. 现在,您必须将主机指纹添加到缓存中。转到机器A,然后手动SSH到机器B。第一次,您将收到诸如“是否要将...添加到主机密钥缓存?”之类的查询。如果尝试使自动化(例如脚本)使用此登录名,则必须确保自动化使用的ssh客户端不会收到此提示。

0

正如其他人所说,您的用户应使用ssh-keygen在客户端计算机上为其自己进行密钥对,并将其公共密钥添加到要登录的计算机上的〜/ .ssh / authorized_keys中。

但是,有关更多详细信息,我强烈建议使用SSH(安全外壳)


0

这里有很好的建议,因此我不再重复。一旦设置了一台服务器以允许您使用密钥登录,就可以设置其他服务器以使用此一台服务器进行相同的操作:

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到您的主目录,将变量remote定义为一个或多个服务器名称,然后一次执行一堆即可。它要求的密码将是您的远程服务器的ssh密码。您当然可以使用不带for循环的简化版本:

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

记住:仅复制您的公共密钥。您不希望您的私钥坐在某个服务器上,任何具有sudo的人都可以复制它们并强行使用您的密码。

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.