作业环境
操作系统:CentOS 5.5-i386、Win7
相关软件:openssh-4.3p2-41(Linux),SSH Secure Shell Client(Windows)
一、RSA/DSA 密钥
OpenSSH 的 RSA 和 DSA 认证协议的基础是一对专门生成的密钥,分别叫做 专用密钥和公用密钥。使用这些基于密钥的认证系统的优势在于:在许多情况下,有可能不必手工输入密码就能建立起安全的连接。 其工作原理摘录如下:
让我们从一种假想的情形开始,假定我们想用 RSA 认证允许一台本地的 Linux 工作站(称作 localbox)打开 remotebox上的一个远程 shell, remotebox 是我们的 ISP 的一台机器。此刻,当我们试图用 ssh 客户程序连接到 remotebox时,我们会得到如下提示:
% ssh drobbins@remoteboxdrobbins@remotebox's password:
此处我们看到的是 ssh 处理认证的缺省方式的一个示例。换句话说,它要求我们输入remotebox上的 drobbins 这个帐户的密码。如果我们输入我们在 remotebox 上的密码, ssh 就会用安全密码认证协议,把我们的密码传送给 remotebox 进行验证。但是,和 telnet 的情况不同,这里我们的密码是加密的,因此它不会被偷看到我们的数据连接的人截取。一旦 remotebox 把我们提供的密码同它的密码数据库相对照进行认证,成功的话,我们就会被允许登录,还会有一个 remotebox 的 shell 提示欢迎我们。虽然 ssh 缺省的认证方法相当安全,RSA 和 DSA 认证却为我们开创了一些新的潜在的机会。
但是,与ssh安全密码认证不同的是,RSA认证需要一些初始配置。我们只需要执行这些初始配置步骤一次。之后,localbox和remotebox之间的 RSA 认证就毫不费力了。要设置 RSA 认证,我们首先得生成一对密钥,一把专用密钥和一把公用密钥。这两把密钥有一些非常有趣的性质。公用密钥用于对消息进行加密,只有拥有专用密钥的人才能对该消息进行解密。
公用密钥只能用于加密,而专用密钥只能用于对由匹配的公用密钥编码的消息进行解密。RSA(和 DSA)认证协议利用密钥对的这些特殊性质进行安全认证,并且不需要在网上传输任何保密的信息。要应用 RSA 或者 DSA 认证,我们要执行一步一次性的配置步骤。我们把公用密钥拷贝到 remotebox。公用密钥之所以被称作是“公用的”,是因为它只能用于对那些给我们的消息进行加密,所以我们不需要太担心它会落入其它人手中。一旦我们的公用密钥已经被拷贝到 remotebox并且为了 remotebox 的 sshd 能够定位它而把它放在一个专门的文件(~/.ssh/authorized_keys)里,我们就为使用 RSA 认证登录到 remotebox上做好了准备。
要用RSA登录的时候,我们只要在localbox的控制台键入ssh drobbins@remotebox,就象我们常做的一样。可这一次,ssh告诉remotebox的sshd它想使用RSA认证协议。接下来发生的事情非常有趣。Remotebox的sshd会生成一个随机数,并用我们先前拷贝过去的公用密钥对这个随机数进行加密。然后,sshd 把加密了的随机数发回给正在localbox上运行的ssh 。接下来,轮到我们的ssh用专用密钥对这个随机数进行解密后,再把它发回给 remotebox,实际上等于在说:“瞧,我 确实有匹配的专用密钥;我能成功的对您的消息进行解密!”最后,sshd得出结论,既然我们持有匹配的专用密钥,就应当允许我们登录。因此,我们有匹配的专用密钥这一事实授权我们访问remotebox。
二、在管理服务器端生成公钥密钥对
公钥密钥是在管理服务器上生成的,故需要在Localhost上进行操作
首先确保Localhost上的Linux系统安装了OpenSSH。CentOS5.5默认安装并启动OpenSSH,查看其版本号
[root@sqing25 ~]# rpm -qa openssh
openssh-4.3p2-41.el5
1、使用ssh-keygen命令生成密钥对
[root@sqing25 ~]# ssh-keygen -b 1024 -t dsa
Generating public/private dsa key pair. //生成dsa密钥对
Enter file in which to save the key (/root/.ssh/id_dsa): //钥匙存放的位置,回车表示用默认的位置/root/.ssh/id_dsa
Created directory '/root/.ssh'. //系统在/root下自行生成.ssh文件夹
Enter passphrase (empty for no passphrase): //输入密码短语,可以为空
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa. //私钥存放位置
Your public key has been saved in /root/.ssh/id_dsa.pub. //公钥存放位置
The key fingerprint is:
19:e8:fd:c8:01:32:da:a3:18:de:7e:83:c4:2d:f2:7f root@sqing25 //key的指纹
2、将管理服务器上生成的公钥拷贝到被管理服务器
[root@sqing25 ~]# scp .ssh/id_dsa.pub shuqing@10.8.110.24: //注意,后面有个冒号
The authenticity of host '10.8.110.24 (10.8.110.24)' can't be established.
RSA key fingerprint is 6e:49:32:73:8d:40:4e:f2:ee:dc:48:fb:3e:37:a3:b8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.8.110.24' (RSA) to the list of known hosts.
shuqing@10.8.110.24's password:
id_dsa.pub 100% 602 0.6KB/s 00:00
三、在被管理服务器上设置公钥
在Remotehost上,以shuqing用户登录,在其home目录下可以看到传过来的id_dsa.pub公钥
[shuqing@sqing24 ~]$ ls
id_dsa.pub
1、在home下建立.ssh文件夹,并将其权限设置为700
[shuqing@sqing24 ~]$ mkdir .ssh
[shuqing@sqing24 ~]$ chmod 700 .ssh
2、将公钥存放到.ssh目录下,改名为authorized_keys,并且将其权限设置为600
[shuqing@sqing24 ~]$ mv id_dsa.pub .ssh
[shuqing@sqing24 ~]$ cd .ssh
[shuqing@sqing24 .ssh]$ cat id_dsa.pub >> authorized_keys
[shuqing@sqing24 .ssh]$ ls
authorized_keys id_dsa.pub
[shuqing@sqing24 .ssh]$ chmod 600 authorized_keys
[shuqing@sqing24 .ssh]$ rm -rf id_dsa.pub
四、使用密钥对进行远程登录
Localhost对Remotehost发出请求:
[root@sqing25 ~]# ssh shuqing@10.8.110.24
Enter passphrase for key '/root/.ssh/id_dsa': //需要输入密码
Last login: Wed Feb 9 16:25:48 2011 from 10.8.5.28
[shuqing@sqing24 ~]$ //进入到Remotehost
五、使用ssh-agent自动输入密码短语
ssh-agent是OpenSSH中默认包括的ssh代理程序,可用于记住密码短语。ssh-agent的设置是在管理服务器(Localhost)上进行的
1、查看ssh-agent的环境变量
[root@sqing25 ~]# ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-HiVUUH3278/agent.3278; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3279; export SSH_AGENT_PID;
echo Agent pid 3279;
2、使用eval命令自动声明环境变量
[root@sqing25 ~]# eval `ssh-agent` //注意,这里是反单引号
Agent pid 3282
[root@sqing25 ~]# printenv | grep ssh //检查ssh环境变量是否已加入当前会话
OLDPWD=/root/.ssh
SSH_AUTH_SOCK=/tmp/ssh-opbSnB3281/agent.3281
3、将密钥添加到ssh-agent的缓存中
[root@sqing25 ~]# ssh-add ~/.ssh/id_dsa
Enter passphrase for /root/.ssh/id_dsa: //输入密码短语
Identity added: /root/.ssh/id_dsa (/root/.ssh/id_dsa)
[root@sqing25 ~]# ssh-add –l //查看 ssh代理的缓存内容
1024 19:e8:fd:c8:01:32:da:a3:18:de:7e:83:c4:2d:f2:7f /root/.ssh/id_dsa (DSA)
4、Localhost远程登录Remotehost
此时,可以直接登录remote服务器而不用输入密码短语了
[root@sqing25 ~]# ssh shuqing@10.8.110.24
Last login: Wed Feb 9 16:47:07 2011 from 10.8.110.25
[shuqing@sqing24 ~]$
六、Windows(Localhost)用SSH Secure Shell Client登录CentOS(Remotehost)
在Windows使用SSH Secure Shell Client访问Linux,通常采用的认证方式是password,每时登录时,都需要输入密码,比较麻烦。改用Public Key方式,可以省时省力。
1、在SSH Secure Shell Client中生成公钥密钥对
单击Edit菜单下的Setting子菜单,弹出Setting对话框。进入Keys页面(Global Settings -> User Authentication -> Keys),点击“Generate New…”按钮,弹出Key Generation对许框,默认设置,一路点“下一步”,有一步是设置私钥的,需要设置文件名、描述、密码短语。
2、上传Public key
在生成公钥密钥时,如果已经通过密码认证方式连到Remotehost的话,可以直接上传Public key。公钥密钥生成后,在连接Remotehost的情况下,也可以通过Key页面的“Upload…”按钮将公钥上传到对端主机。默认的上传路径是.ssh2,将其改为.ssh
3、被管理服务器对上传过来的文件进行格式转换并设置权限
[shuqing@sqing24 ~]$ cd .ssh
[shuqing@sqing24 .ssh]$ ssh-keygen -X -f sqing.pub >> authorized_keys2
[shuqing@sqing24 .ssh]$ chmod 600 authorized_keys2
4、Localhost远程登录Remotehost
此时,Windows上的SSH Secure Shell Client采用Public Key认证方式就可以直接登录到Remotehost了
本文转自Sunshyfangtian 51CTO博客,原文链接:http://blog.51cto.com/sunshyfangtian/496640,如需转载请自行联系原作者