在Windows管理Linux服务器时,常使⽤putty登陆ssh进⾏远程管理。默认登陆验证⽅式为密码认证,该⽅式虽然简单,但每次登陆都要输⼊⼀长串的密码,相当⿇烦。⽽且,如果万⼀把root允许登陆打开,还有可能被强⼒破解,导致严重的后果。 所以,通常建议⽤密钥登陆验证代替密码⽅式,即简单,⼜可靠。⼀、为什么建议使⽤密钥登陆
通常现在的Linux发⾏版都使⽤OpenSSH代替telnet、rsh等明⽂传输的终端服务。 以红旗 DC Server 5.0为例:
# rpm -qa|grep -E -w 'openssh'openssh-clients-4.0p1-1.2AXopenssh-server-4.0p1-1.2AXopenssh-4.0p1-1.2AX
⽽OpenSSH默认是同时⽀持密码和密钥两种认证⽅式的。转⼀个说明:
为什么要使⽤公钥认证
通常,通过ssh登录远程服务器时,使⽤密码认证,分别输⼊⽤户名和密码,两者满⾜⼀定规则就可以登录。但是密码认证有以下的缺点:
a)⽤户⽆法设置空密码(即使系统允许空密码,也会⼗分危险) b)密码容易被⼈偷窥或猜到
c)服务器上的⼀个帐户若要给多⼈使⽤,则必须让所有使⽤者都知道密码,导致密码容易泄露,⽽且修改密码时必须通知所有⼈
⽽使⽤公钥认证则可以解决上述问题。
a)公钥认证允许使⽤空密码,省去每次登录都需要输⼊密码的⿇烦 b)多个使⽤者可以通过各⾃的密钥登录到系统上的同⼀个⽤户c)即使修改了对应⽤户的密码,也不会影响登陆
d)若同时禁⽤密码认证,则只要保证私钥的安全,不会受到暴⼒破解的威胁
⼆、使⽤putty⽣成密钥和登陆
根据公钥认证的原理(见后⾯说明),认证双⽅任何⼀⽅都可制作该钥匙对,并且只要认证⽅有被认证⽅的公钥信息,即可匹配成功。
这⾥,我们先以Windows上的putty登陆Linux服务器为例说明。所以,该密钥对由putty制作。继续前,请确保您已经把整个putty包都下载完:官⽅⽹站:
最新版本:0.63或1.0,我截图的版本是0.55的。
其中包括:PuTTY、Puttygen、PSCP、Plink、Pagent 等⼯具。1、使⽤puttygen制作密钥
启动puttygen⼯具,为兼容OpenSSH密钥,选择“SSH2 RSA”:
单击 Generate 按钮,并使⽤⿏标在“key”框内移动,以获得⾜够的随机数据供⽣成密钥使⽤:
※期间,你会看到进度条上⾯有个提⽰“Please generate some radomness by moving the mouse over the blank area.”,意思就是让你⽤⿏标在空⽩区域随机移动。随着⿏标在空⽩区域的移动,进度条会⼀直⾛下去。停⽌移动⿏标,进度条也就停⽌了。所以,那我们要移动⿏标,直到进度条⾛满为⽌。完成后的窗⼝如下:其中:引⽤
Key comment:是注释,不会影响密钥的有效性,但可作为⾃⼰⽤于区别其他密钥的参考;
Key passphrase 和 Confirm passphrase :⽤于保护私钥,如果不输⼊该信息,那么任何⼈只要拿到该私钥,即可⽆密码登陆系统,⾮常危险;通常情况下,我是建议⼤家输⼊的,但这⾥为了⽅便说明,暂时留空,请看后⾯使⽤的说明。
随后,点击“Save private key”保留私钥。
如果没有输⼊Key passphrase信息,会有警告:
输⼊私钥的⽂件名:
※公钥信息可以不⽤保留在本地的,puttygen可以从私钥得到它,验证时也不会⽤到。2、修改openssh配置
修改/etc/ssh/sshd_config:
ChallengeResponseAuthentication no #关闭挑战应答⽅式UsePAM no #不使⽤PAM认证然后重启sshd服务,原因见:
3、拷贝公钥信息
上⾯密钥信息窗⼝的“Key”框最后⽣成的就是公钥信息:
需要把该信息拷贝到Linux服务器的特定⽂件中:~/.ssh/authorized_keys其中,“~”表⽰对应⽤户的主⽬录,以root为例。
若.ssh⽬录不存在,请创建它,并把公钥信息写⼊⽂件中:# mkdir ~/.ssh
# chmod 700 ~/.ssh
# vi ~/.ssh/authorized_keys
# chmod 644 ~/.ssh/authorized_keys
※请务必留意:⽂件和⽬录的权限问题,⽤户必须是将要进⾏认证的⽤户,⽽权限必须是0644,也就是禁⽌其他⼈对该⽂件写⼊信息。(否则,某些有⼼⼈把⾃⼰的公钥写⼊这⾥,他也可以⽆密码进来了)
因为,通常umask是0022或0002的,所以请使⽤chown和chmod修改为对应的权限咯。4、使⽤putty使⽤密钥登陆
对putty进⾏⼀些简单配置,即可使⽤密钥登陆Linux服务器。
选择Connection-SSH-Auth,在“Private key file for authentication”输⼊密钥的路径:然后在Connection的“Auth-login username”输⼊登陆的⽤户名,例如root:◎Putty 0.60 版本在Connection-Data页内。然后点击Open即可:
若⼀切正常,则可以在session中Save保存配置。三、使⽤OpenSSH⽣成密钥
密钥既可使⽤putty⽣成,也可⽤OpenSSH⽣成。1、Linux下⽣成密钥运⾏:引⽤
# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <-密钥路径Enter passphrase (empty for no passphrase): <-密钥保护密码Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa. <-私钥Your public key has been saved in /root/.ssh/id_rsa.pub. <-公钥The key fingerprint is:
17:28:4c:c3:e4:18:d4:c2:31:bd:be:a7:a9:d4:a8:48 root@mail.linuxfly.org2、把公钥信息写⼊authorized_keys⽂件中运⾏:
# cd ~/.ssh
# cat id_rsa.pub >> authorized_keys
3、⽣成putty的私钥
由于SSH的标准中,并没有固定密钥⽂件的格式。⽽Putty使⽤的私钥格式和OpenSSH⽣成的有点不同,需要转换⼀下。a)把id_rsa传到Windows机器上
b)使⽤puttygen的“Load”读取id_rsa⽂件
这⾥也可以从图中的公钥信息,与id_rsa.pub对⽐⼀下,应该是⼀致的。c)点击“Save private key”保留私钥。
d)putty使⽤该新的私钥登陆服务器即可。四、注意事项
1、检查OpenSSH服务端的配置
OpenSSH的配置通常保存在:/etc/ssh/sshd_configPermitRootLogin no # 禁⽌root⽤户登陆
StrictModes yes # 检查密钥的⽤户和权限是否正确,默认打开的RSAAuthentication yes # 启⽤ RSA 认证
AuthorizedKeysFile .ssh/authorized_keys # 验证公钥的存放路径PubkeyAuthentication yes # 启⽤公钥认证
PasswordAuthentication no # 禁⽌密码认证,默认是打开的。
说明:
a)如果StrictModes为yes,⽽authorized_keys的权限为664等的情况,则验证密钥的时候,会报错:bad ownership or modes for file /home/linuxing/.ssh/authorized_keys
b)若PasswordAuthentication设置为no,则禁⽤密码认证,配合启动公钥认证,是更安全的⽅式。2、公钥存放的路径
Putty作为客户端是不需要使⽤公钥的,⽽Linux服务端的公钥是存放在:~/.ssh/authorized_keys中。也就是讲,如果登陆⽤户的主⽬录不同,存放的路径是不相同的。例如某⽤户:
$ echo ~
/home/linuxing则密钥在:
/home/linuxing/.ssh/authorized_keys
若你想使⽤同⼀私钥,但不同⽤户登陆服务器,则请保证公钥信息已经写⼊每个⽤户的验证⽂件中咯。并且⼀定要注意验证⽂件的⽤户和权限不能搞错哦。
3、Key passphrase密码
如果你在保存私钥的时候,输⼊了Key passphrase密码。其就会使⽤该信息对私钥加密。这会带来⼀个好处:就是万⼀您的私钥给盗⾛了,但如果⼩偷不知道该密码,他也⽆法使⽤该私钥登陆服务器的。简单来说,就是加强了安全性。a)在putty使⽤这种私钥登陆服务器的时候,就会有提⽰:
只有输⼊正确的密码才能通过认证。
※这⾥看上去和使⽤密码认证⽅式登陆OpenSSH有点类似。但实际上是完全不同的。该
Key passphrase密码是⽤于管理私钥,避免私钥被盗⽤的;⽽OpenSSH的密码认证⽅式使⽤的密码,指的是Linux服务器端的⽤户密码,即PAM信息。也就是说,即使你修改了PAM的密码,但只要Key passphrase信息正确,你还是可以登陆到服务器上的。(因为使⽤它解压出来的私钥是没变的)
b)若每次登陆都要输⼊Key passphrase,明显达不到我们简化登陆步骤的⽬的。在既要保证安全,⼜要简便的情况下,我们可以使⽤PAGEANT。
PAGEANT的作⽤很简单,就是在我们输⼊⼀次私钥密码后,把解密后的私钥保存在PAGEANT中。
再次使⽤putty登陆的时候,PAGEANT就会⾃动的把解密后私钥⽤于认证,这样就不⽤我们多次输⼊密码了。⽽
当我们退出PAGEANT的时候,会⾃动删除私钥,重新登陆的时候需要再次检验。实现“⼀次验证,多次使⽤”的⽬的。打开PAGEANT,其会⾃动放⼊Windows右下⾓的任务栏中:右键点击后,选择“View Keys”:
在弹出框中,选择“Add Key”,输⼊Putty的私钥(.PPK),并会提⽰输⼊Key passphrase:结果:
直接选择菜单的“Add Key”也可以。
这时候,使⽤putty再次登陆服务器就不需要Key passphrase啦。
◎其实,即使没有Key passphrase的私钥也可以导⼊PAGEANT中的,这时候就可以不⽤在Putty的配置⽂件中指定私钥的路径咯。也可以达到⼀定的安全⽬的的。
c)若要修改Key passphrase,可以使⽤puttygen重新Load私钥,其会咨询Key passphrase信息:
输⼊正确密码后,即可修改,并保存新私钥即可。是否存在或修改Key passphrase是不会改变公钥信息的。4、保存putty的配置信息
putty的配置信息是保存在Windows注册表的,需使⽤下⾯的命令导出:
regedit /e PuTTY.config.reg \"HKEY_CURRENT_USER\\Software\\SimonTatham\\PuTTY\"
5、使⽤DSA密钥
默认配置下,OpenSSH就同时⽀持RSA和DSA两种编码的密钥。只要在⽣成密钥的时候选择“DSA”即可。例如:# ssh-keygen -t dsa
使⽤上和RSA是没有区别的,把公钥信息拷贝到验证⽂件中即可使⽤。
五、公钥认证的原理
所谓的公钥认证,实际上是使⽤⼀对加密字符串,⼀个称为公钥(public key),任何⼈都可以看到其内容,⽤于加密;另⼀个称为密钥(private key),只有拥有者才能看到,⽤于解密。通过公钥加密过的密⽂使⽤密钥可以轻松解密,但根据公钥来猜测密钥却⼗分困难。
ssh 的公钥认证就是使⽤了这⼀特性。服务器和客户端都各⾃拥有⾃⼰的公钥和密钥。为了说明⽅便,以下将使⽤这些符号。Ac 客户端公钥 Bc 客户端密钥 As 服务器公钥 Bs 服务器密钥
在认证之前,客户端需要通过某种安全的⽅法将公钥 Ac 登录到服务器上。认证过程分为两个步骤:
1、会话密钥(session key)⽣成
客户端请求连接服务器,服务器将 As 发送给客户端。 服务器⽣成会话ID(session id),设为 p,发送给客户端。
客户端⽣成会话密钥(session key),设为 q,并计算 r = p xor q。 客户端将 r ⽤ As 进⾏加密,结果发送给服务器。 服务器⽤ Bs 进⾏解密,获得 r。 服务器进⾏ r xor p 的运算,获得 q。
⾄此服务器和客户端都知道了会话密钥q,以后的传输都将被 q 加密。2、认证
服务器⽣成随机数 x,并⽤ Ac 加密后⽣成结果 S(x),发送给客户端 客户端使⽤ Bc 解密 S(x) 得到 x
客户端计算 q + x 的 md5 值 n(q+x),q为上⼀步得到的会话密钥 服务器计算 q + x 的 md5 值 m(q+x) 客户端将 n(q+x) 发送给服务器
服务器⽐较 m(q+x) 和 n(q+x),两者相同则认证成功
因篇幅问题不能全部显示,请点此查看更多更全内容