ssh 自动登录

自动登录

SSH提供了公钥登录,可以省去每次登录都要输入的秘密的步骤。

公钥登录原理:

  1. 用户将自己的公钥存储在远程主机上。
  2. 登录的时候,远程主机向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。
  3. 远程主机利用事先存储的公钥进行解密,如果成功,就证明用户是可行的,直接允许登录shell,不再要求输入密码。

客户端生成密钥

用命令 ssh-keygen


$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Documents and Settings/Administrator/.ssh/id_rsa): abc
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in abc.
Your public key has been saved in abc.pub.
The key fingerprint is:
c9:c0:7e:d0:f0:cc:20:34:ca:79:85:78:30:81:4b:a2 rKF58842@LUITSWX24970

生成的文件abc保存的是私钥,abc.pub保存的是公钥。如果不指定文件,默认生成的是 id_rsa 和 id_rsa.pub

会提示输入保存密钥的文件名和私钥的秘密。对于保存文件,一般不要输入,默认就好。如果担心私钥的安全,可以输入私钥秘密。

把公钥传到远程主机

用命令:ssh-copy-id user@host,此命令会把当前目录下的公钥保存到user 的:~/.ssh/authorized_keys文件里。

在我win7系统安装的ssh客户端没有上面这个命令,可以这样:
ssh coderbee@coderbee.net 'cat > ~/.ssh/authorized_keys' < id_rsa.pub

手工粘贴到目标文件也是可以的。

修改ssh服务配置

删除远程主机的 /etc/ssh/sshd_config 文件里的下面三项前面的注释符#

 RSAAuthentication yes
 PubkeyAuthentication yes
 AuthorizedKeysFile .ssh/authorized_keys

修改配置后重启远程主机的ssh服务: service ssh restart

现在客户端可以自动登录了: ssh coderbee@coderbee.net

ssh-agent

在生成密钥时,如果不输入私钥的密码,那么一旦客户机被攻击了,那么服务器也就被攻击了。但如果输入密码,那么每次进行ssh连接时都需要输入私钥的密码,也非常麻烦。

ssh-agent(专用密钥告诉缓存)是为解决每次都需要输入私钥密码而设计的,内建在OpenSSH里。

ssh-agent 是个长时间持续运行的守护进程(daemon),设计它的唯一目的就是对解密的专用密钥进行高速缓存。

ssh 包含的内建支持允许它同 ssh-agent 通信,允许 ssh 不必每次新连接时都提示您要密码才能获取解密的专用密钥。对于 ssh-agent ,您只要使用 ssh-add 把专用密钥添加到 ssh-agent 的高速缓存中。这是个一次性过程;用过 ssh-add 之后, ssh 将从 ssh-agent 获取您的专用密钥,而不会提示要密码短语来烦您了。

使用 ssh-agent

  • 如果私钥之前是没有设置密码的,用命令 ssh-keygen -p 设置。
  • 启动ssh-agent:ssh-agent,输出大概如下:

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-VMkGwT1536/agent.1536; export SSH_AUTH_SOCK;
SSH_AGENT_PID=4572; export SSH_AGENT_PID;
echo Agent pid 4572;

输出是是shell命令,主要是设置导出环境变量的,需要手动执行。也可以直接把启动ssh-agent输出当命令来执行:evalssh-agent

  • 把私钥添加到ssh-agent: ssh-add,会提示输入私钥密码。
  • 再次登录远程主机,发现不再需要输入私钥密码了。

具体过程如下:


$ ssh-keygen -p
Enter file in which the key is (/c/Documents and Settings/Administrator/.ssh/id_rsa):
Key has comment '/c/Documents and Settings/Administrator/.ssh/id_rsa'
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.

$ ssh coderbee@coderbee.net
Enter passphrase for key '/c/Documents and Settings/Administrator/.ssh/id_rsa':
Welcome to Ubuntu 12.04 LTS (GNU/Linux 2.6.32-042stab076.8 i686)

* Documentation:  https://help.ubuntu.com/
Last login: Thu Jun  6 10:35:45 2013 from 183.238.56.177
coderbee@coderbee:~$ logout
Connection to coderbee.net closed.

$ eval `ssh-agent`
Agent pid 5820

$ ssh-add
Enter passphrase for /c/Documents and Settings/Administrator/.ssh/id_rsa:
Identity added: /c/Documents and Settings/Administrator/.ssh/id_rsa (/c/Documents and Settings/Administrator/.ssh/id_rsa
)

$ ssh coderbee@coderbee.net
Welcome to Ubuntu 12.04 LTS (GNU/Linux 2.6.32-042stab076.8 i686)

* Documentation:  https://help.ubuntu.com/
Last login: Thu Jun  6 15:51:26 2013 from 183.238.56.177
coderbee@coderbee:~$

启动 ssh-agent 的最佳方式就是把上面这行(eval ssh-agent)添加到您的 ~/.bash_profile 中;这样,在您的登录 shell 中启动的所有程序都将看到环境变量,而且能够定位 ssh-agent ,并在需要的时候向其查询密钥。尤其重要的环境变量是 SSH_AUTH_SOCK;SSH_AUTH_SOCK 包含有 ssh 和 scp 可以用来同 ssh-agent 建立对话的 UNIX 域套接字的路径。

ssh-agent 的不足之处

~/.bash_profile 中的 eval ssh-agent 使每次登录会话都会启动一个新的 ssh-agent 副本,而且需要向每个副本添加密钥。

有关 ssh-agent 的缺省设置的另外一个问题是它同 cron 作业不兼容。由于 cron 作业是 cron 进程启动的,这些作业无法从它们的环境中继承 SSH_AUTH_SOCK 变量,因而也无从知道 ssh-agent 进程正在运行以及如何同它联系。


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据