本来在前天晚上就准备写这篇文章的,可由于前天实验一直没有成功,让我伤透了脑筋。结果只能拖到昨天继续研究,终于让我修得正果!

我的问题是,我用puttygen来生成了私钥和公钥,我将公钥文件导入到Linux服务器的authorized_keys文件中,却总是提示server refuse our key.

好了,不废话了。入正题!

前面我的putty都是用的密码认证的方式登录的服务器,但感觉这种方法不安全。而且每次登录输入那长长的密码也非常麻烦。既然密码认证,那么***就有机会不断偿试密码登录来暴力破解!于是,现在我得再次提升服务器的安全性啦!

要开启基于密钥的安全认证很简单。一般默认配置文件都不用动。只用将登录用户主目录下的.ssh目录下新建一个认证文件authorized_keys。然后将putty端生成的公钥导入到认证文件中即可。比如我的sunjiebin用户的主目录为/home/sjb,那么只需要将公钥导入到/home/sjb/.ssh/authorized_keys文件中即可!下面我们开始吧!

首先,提供一个Putty家族的下载地址。因为等下要用到putty的一些软件。http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 你可以在这里找到它的每一位成员啦!

一、生成密钥

要用密钥登录,首先得有密钥。所以第一位成员puttygen登场!用puttygen生成密钥。打开puttygen,点击Generate,然后鼠标在上面的框框里面运动几下(一定要移动鼠标,不然你会发现进度条卡在那不动了),就会看到密钥生成的进度条。生成后如图所示:

其中Public key for pasting into OpenSSH authorized_keys file是告诉我们,将下面的公钥粘贴到服务器的authorized_keys文件中去!懂了吧~

Key passsphrase 即设置你私钥的密码,这样别人拿到私钥也得先输密码才能使用私钥!Confirm passphrase 再次确定一次密码。强烈建议输入密码。

然后点击下面的Save private key 即可把私钥保存在windows客户端上。

好了,私钥现在有了,公钥也等待粘贴到服务器上了。

二、将公钥导入服务器端。

先用putty登录到服务器端,切换至~/.ssh目录(~即代表用户的家目录),建立authorized_keys文件,将Puttygen中的公钥粘贴进去(putty中右键即为粘贴)。

 

记得粘贴后检查下粘贴的公钥和puttygen中的公钥是否一样。不能少了一个字母啊!wq!保存退出。

好了,服务器端就这么简单了!下面我们设置putty,来实现密钥登录。

三、putty设置来实现密钥登录

先在putty中导入私钥,在Connection--SSH--Auth中的browser中加入导出的私钥,如图:

 

私钥有了,然后就是设定使用私钥登录的用户,在Connection--Data中的auto-login username中输入登录的用户名(注意,这里登录用户要与开始导入到服务器中的公钥认证用户相同)。由于前面我将公钥导入到了/home/sjb/.ssh即sunjiebin用户的登录文件夹中,所以这里我必须选择用sunjiebin用户登录。为了安全,不建议用root直接登录,而且我已经禁用了root直接远程登录,如图:

 

好了,密钥及登录用户设置好了,我们回到putty的session界面,在Host Name中设置好登录地址,Port中设定ssh端口号。由于前面我将ssh登录端口改为了800,所以这里就填写800.如图所示:

我们一般的主机都是装的中文默认,而我们知道,Putty登录主机后中文总是会乱码,所以要在window-Translation--Remote character set中把字符编码选为utf-8。这样就不会乱码了。

 

 让我们回到session页面,在Saved Sessions中输入保存会话的名称,然后点击Save.这样就把你这次的所有设置都保存下来了。下次再登录,就只用在保存框中双击就行了!免去每次设置的麻烦!如图:

 

 

好了,登录地址,端口,用户名,私钥,编码都定义好了,那让我们点击open登录远程主机吧!

四、登录中的问题

可是,我们会发现,怎么还要输入用户密码啊?显示server refused our key!证明密钥验证并没有成功。如图:

 

这是什么原因呢?让我们来看看sunjiebin的主目录相关文件的权限吧!如图:

通过上面我们可以看到sjb和.ssh文件夹权限为700,即只有sunjiebin可写,而authorized_keys却为664,即所属组用户有写的权限!问题就在这里了!这也是我当初遇到的问题之一!(默认新建的authorized_keys文件是664的权限!改为644就可以登录了

这里就涉及到ssh中sshd_config配置文件的一个参数StrictModes。这个参数的主要目的就在于审核用户相关文件的权限。审核什么文件呢?审核以下三个文件:1,用户主目录权限,也就是/home/sjb的权限;2,主目录下.ssh文件夹的权限。即/home/sjb/.ssh的权限;3,认证文件authorized_keys文件的权限。即/home/sjb/.ssh/authorized_keys的权限。为什么要审核这三个文件?其实道理很简单,那就是防止其它用户通过更改认证文件而获得登录权限!比如其它用户有权限修改我的authorized_keys文件,将它们自己的公钥加入到sunjiebin用户的authorized_keys文件中,然后再利用sunjiebin这个账户建立连接,那么他们就可以不用知道sunjiebin用户的密码而直接通过sunjiebin用户登录服务器了!那也就意味着我已经被顺利***了!所以,StrictModes文件就是为了防止这类事件发生而准备的!当这个参数开启时,即表示开启严格的审核。规则为只允许所属者或root对上述文件具有完全控制权限,其它用户不能有写权限

好了,那现在我们把权限改回来,可以看到现在是644了!也就是其它用户没有了写权限。(&&表示第一条命令执行成功后,继而执行&&后的下一条,为方便查阅,我这里将三条命令写在一起了)

再次用putty登录

看到没,没有要求输入用户名与密码便登录成功了!(由于我设立了私钥密码,所以开始登录时要输入密钥的密码。)

 好了,到这里我们的密钥登录就已经成功了!哈哈~

如果每次输入用putty登录私钥的密码是不是闲太麻烦了?但不设立密码又怕私钥泄露,那可是个很恐怖的事情啊!那么,怎样即不输密码,又要安全登录呢?这里就要用到putty家庭中第三位成员pageant啦!运行pageant,怎么没界面?再找找,原来在桌面右下角啊! 然后对它点右键,选择里面的Add key.然后将putty登录时用的私钥加进去。这时候会要求你输入私钥密码,输入后我们再用putty登录,就会看到不需要密钥密码了。如图:

这样以后每次开机只用在pageant中加载一次私钥,然后让它呆在那安静的右下角就行了!终于告别每次连接都得输入密钥密码的烦恼。

好了,登录成功之后是不是就什么也不用管了呢?当然不是!还有一个重要事情我们还没做呢@!那就是禁用密码验证登录啊!在sshd_config中将PasswordAuthentication 设为no即可!如图:

如果现在一个没有密钥的人登录服务器会是怎样呢?结果请看图:

无论是Putty,还是linux下ssh都已经无法登录了!好了。一切设置成功了!

五、我自己纠结很久的问题

下面讲讲我当时遇到的问题和解决办法~

我觉得故事还没有结束,因为我当初折腾那么久,问题并不是出在这里哦!我说说我登录问题所在吧~ 由于当初不知道Server refuesed our key 的原因,于是百度了一下,看了很多评论的解决办法一般都是说将StrictModes值设为no即可。当时不知道StrictModes参数的作用,就把它设为no了。然后当然是service sshd restart  如图:

瞧!是不是成功啦?好了,那我们把authorized_keys重新设置为664,再重新登录下瞧瞧~看是不真的生效了?

结果却显示网络错误!根本登录不上啦!这简直是在跟我开大玩笑啊!

什么原因?让我们再次service sshd restart 来看看真相!

看到没有,再次重启服务提示停止失败!我们看看sshd现在的状态

根本没启动服务!我们偿试启动看看

显示的是启动成功,结果却还是未启动!这“确定”十字简直是坑爹啊!再看看日志文件记录。

提示我绑定800商品失败!拒绝访问。为什么?就因为这个问题,让我一直苦恼了很久。后来苦苦探索,终于发现了问题所在---------selinux阻止了sshd服务的启动!那我们先关闭selinux,再偿试启动看!

看到没,启动了,神奇的启动了有木有!好了,现在我们再用putty登录试试。

看到没有,登录成功!再看看authorized_keys文件的权限,664!我们再看看StrictModes是不是真的关闭了

看到了吧~我没忽悠大家吧。呵呵!为了安全,改完后记得要setenforce 1,即将selinux开启啊!

好了,这篇文章暂且到此吧。可花了我n多心血才诞生的啊!虽然写得可能没别人好,但可是纯手工纯原创哦~!