自动登录
SSH提供了公钥登录,可以省去每次登录都要输入的秘密的步骤。
公钥登录原理:
- 用户将自己的公钥存储在远程主机上。
- 登录的时候,远程主机向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。
- 远程主机利用事先存储的公钥进行解密,如果成功,就证明用户是可行的,直接允许登录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输出当命令来执行:eval
ssh-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笔记,可以更及时回复你的讨论。