2008年6月16日星期一

用publickey验证登录SSH服务器

前些天帮一个朋友解决了一个比较头痛的问题:他一个人管理了近20台Linux服务器,由于SSH采用 了用户名+密码的验证,为了防止暴力破解,所有的机器Deny掉了root用户的远程登录,每个机器的用户名和密码都不一致,于是乎,该同学不得不做了一 个Execl文档记录每台机器的口令和密码——比较夸张。有什么放法可以解决呢?

SSH提供了基于Publickey方式的验证。

非对称密钥加密,呵呵至于什么算法模型我也不甚了解,我的数学比较差。对我而言所谓非对称密钥就是加密和解密过程是互逆的两种运算方式且无法由加密 算法推导出解密算法。将公钥(public key)公开,将私钥(private key)自行保留,这样就轻易的解决了加密和签名(用私钥加密)的技术难题。

废话少说,开始正题,我本人习惯上用putty来做远程终端。下载地址:http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
这里要注意的是,因为你需要生成密钥(以及对应的公钥)还需要下载PuTTYgen,为了使用方便,建议下载Pageant,我比较图方便,直接下载了Windows-style installer (x86 only) for everything except PuTTYtel的安装程序。

首先,看看不使用密钥登录时候的状况:

服务器会提示输入用户名

设置SSHD
OK,大刀阔斧的修改下sshd_config文件(下面以Fedora为例),
#vi /etc/ssh/sshd_config
修改相关的设置

RSAAuthentication yes #允许使用RSA认证方式登录
PermitRootLogin no #拒绝root用户远程直接登录,为了安全起见,修改一下吧,尽管su很烦
PermitEmptyPasswords no //允许空密码,PK验证通过后就不需再输入密码了。
PasswordAuthentication yes //如果没有PK,验证密码。比较激进的做法了,这里还是建议不要开Yes

其余的选项不要去改就可以了。

生成密钥对
运行puttygen-〉选择SSH2-RSA->Generate,不停的移动鼠标吧,程序需要大量的随机数——我讨厌笔记本电脑的触控板

按照提示结束后Save public key 和 Save Private Key, 这样,你就获得了一对RSAkey ,这里说明的是一般只需要默认的1024bit的key已经够用的了,如果比较变态,可以试试4096或者更高的位数。

导入公钥
将生成的Pub-key文件(不要搞错哦) 上传到用户目录下的.ssh目录,该目录为隐藏,如果不存在先mkdir一个,千万要注意属组和权限的问题(自爆丑闻:我已经不止一次的犯了此低级错误了)。
# ssh-keygen -i -f Pub-key >> authorized_keys //这里的“Pub-key"是你保存的Publickey文件名,authorized_keys权限644。
这里还要多唠叨一句:很多文档介绍只要自己将pubkey复制到authorized_keys文件中去就可以了,其实为了安全起见,还是不要这么做,N多的字符,排除格式的问题,只要有一个出了毛病,后果很严重。

完成
别急着退出登录,小心把自己关在门外。
重启SSHD : #/etc/init.d/sshd restart
运行pageant,并Add key ,添加你的private key。
开个新窗口看看成功否?

恭喜!已经不需要密码了。
如果用pageant,稍微麻烦一点,Putty->ssh->auth->brow添加Private key.

没有评论:

发表评论

Powered By Blogger