增强服务器安全性——开启 SSH 密钥登录(日期:20180827)

2018年8月27日 0 条评论 84 次阅读 0 人点赞

相信不管是用独服还是 VPS 或者其它类似产品的各位,都或多或少的听过别人的一些忠告,比如禁用 Root 用户,修改端口,以及改用密钥登录 SSH 什么的。那么为什么大家要改用密钥登录,以及该怎么做呢?下面博主就来给大家说道说道~

 

为什么要用密钥登录

在给大家说教程以前,我们先来说说为什么大家都提倡用密钥登录。

根据博主在网上了解的信息,提倡用密钥登录主要是为了防止登录密码泄露给第三方。一般常用的密码登录的方式,工作原理是你本地连接服务器,服务器会返回一个公钥给你,你再在本地用这个公钥加密你的密码信息传输到服务器,服务器如果用私钥解密加密信息后获得的密码和服务器上的匹配,那么就证明你的密码是对的,SSH 登录成功。但是,这里面就存在一个问题,在没有其它辅助方法的情况下,你没办法保证服务器一开始发给你的公钥确实是你想连接的服务器发过来的,因为可能在你和服务器连接的过程中会存在中间人(比如你的 ISP 服务商或者其它的什么)。在有中间人的情况下,如果你的公钥其实是中间人那边发过来的,你再用这个公钥加密密码信息传输过去,毫无疑问,中间人用他的私钥解密之后,就相当于得到了你的服务器密码。同时,用密码登录的方式,也更容易被别人暴力破解,这个大家都应该能想到。

而用密钥登录的方式,虽然不能说是绝对安全,但是相比用密码登录来说,还是要安全一些的。首先是密钥登录的过程,按我的理解,在验证登录之前,服务器会先发过来一个通过服务器公钥加密的内容,你用设置好密钥登录之后获得的私钥对这个加密内容进行解密并传输回服务器,服务器用你传输过来的解密内容和它传输过去的内容进行对比,如果解密出来的内容和之前传输过去的一样,说明私钥与服务器公钥匹配(可以理解为密码匹配),则 SSH 登录成功。其次,本地保存的私钥也是可以用密码加密保存的,在没有密码的情况下,别人即使获得了你的私钥也是没什么用的。

以我自己的理解来看,用密钥登录有以下几个特点:

  1. 受中间人的影响较小,中间人即使进行了劫持,他也没办法获得登录需要的私钥(相当于密码)。
  2. 在便携性上还是不如用密码来得方便。
  3. 在被人意外获得了私钥的情况下,如果有用密码额外保护,则别人也没办法登录你的服务器(当然,一般发生了这种情况我还是建议你去更新下密钥)。
  4. 密钥登录加成 Buff:暴力破解难度 Max。

总体来说,密钥登录还是比直接用密码登录要安全的,也推荐大家采用这种方式来登录服务器。

 

改用 SSH 密钥登录的教程

首先还是先用密码登录你的服务器,注意,以后想用哪个用户来登录管理服务器,就用哪个用户来登录。

1.输入以下的命令,生成 512 位加密算法类型为 ECDSA 的密钥:

ssh-keygen -t ecdsa -b 521

跟大家简单说下 ssh-keygen 的各种参数:

-t:后面接的是加密算法类型,可以为 rsa、dsa 和 ecdsa。一般推荐用 rsa 或者 ecdsa,安全也可靠,怎么选看个人理解。

-b:后面接的是密钥对的位数,越大越难破解,但是不能瞎写,也可以不输入这个参数让系统使用默认值。RSA 的现阶段默认位数为 2048 位,ECDSA 默认为 256 位,DSA 不管自己写还是系统默认都只有 1024 位可以选择。

其它参数:非必要,感兴趣的可以搜索下 ssh-keygen 的参数说明。

PS:支持的加密算法类型视具体情况而定。现代系统不需要在意这些了,大部分三种都是支持的。

 

2.输入上面的命令之后,会有提示让你输入密钥对保存的路径和加密密钥的密码:

username@hostname:~# ssh-keygen -t ecdsa -b 521
Generating public/private ecdsa key pair.
Enter file in which to save the key (/username/.ssh/id_ecdsa): 
Created directory '/username/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /username/.ssh/id_ecdsa.
Your public key has been saved in /username/.ssh/id_ecdsa.pub.

Enter file in which to save the key (/username/.ssh/id_ecdsa):让你输入保存密钥对的完整路径,默认的是你的用户目录所在文件夹下的 .ssh 隐藏文件夹,比如 /root/.ssh/id_ecdsa。

Enter passphrase (empty for no passphrase):输入加密密钥的密码,默认为空即不设置密码,但这里还是推荐设置下,不然别人有你的私钥文件的话可以随便登录服务器而不需要密码确认。

这两个搞定之后,就能看到提示说密钥对生成成功,以及相应的存储位置了。

 

3.进入密钥对存储目录,在服务器上配置好公钥:

cd /username/.ssh
cat id_ecdsa.pub >> authorized_keys

cd /username/.ssh:/username/.ssh 这里请填写你上一步设置的密钥对保存目录。

cat id_ecdsa.pub >> authorized_keys:注意这里的 id_ecdsa.pub 文件,根据你生成的密钥对加密类型不同,文件名也不同,一般 RSA 的是 id_rsa.pub,DSA 的是 id_dsa.pub,请根据自己的类型填写。

PS:做完上面这步之后,原先生成的 id_ecdsa.pub 已经可以删除了,id_ecdsa 这个文件里保存的是私钥,请下载之后保存好!保存好之后服务器上的也可以删除了。

 

4.设置好权限

设置权限有两种做法,一种是设置对应的文件只有文件所有者有读取和写入的权限,而目录只有对应的所有者才有读取写入和执行的权限:

chmod 600 authorized_keys
chmod 700 /username/.ssh

简单的跟大家说一下权限的数字是怎么来的,从左往右:

第一位:文件或者文件夹所有者的权限,最高 7,计算公式为 r(读取权限,有则为 4,无则为 0)+w(写入权限,有则为 2,无则为 0)+x(执行权限,有则为 1,无则为 0)。

第二位:文件或文件夹所属的群组除所有者之外的人拥有的权限。计算公式同上。

第三位:其它群组用户所拥有的权限,计算公式同上。

PS:第二条为了方便大家理解,我写的是密钥对所在目录的完整路径,这里大家记得自己改成第 2 步中自己设置的。

 

上面说的是一种做法,还有一种做法是设置文件只有所有者有读取权限,且文件和文件夹不能被修改、删除、重命名、设定链接,同时也不能写入和新增内容,比上一个更加严格和安全:

chmod 400 /username/.ssh/authorized_keys
chattr +i /username/.ssh/authorized_keys
chattr +i /username/.ssh

第一条命令:参照第一种做法关于数字的说明。

第二条和第三条命令:将文件和文件夹设置为不能被修改、删除、重命名、设定链接,同时也不能写入和新增内容。

注:第二和第三条命令在日后需要更新密钥或其它操作时,要先执行一下以下的命令才可以:

chattr -i /username/.ssh
chattr -i /username/.ssh/authorized_keys

PS:再次提醒,命令中的文件和文件夹路径请根据第 2 步中自己设置的来。有关 chattr 命令的有关说明还请自己多多了解。

 

5.检查是否能够用私钥登录

将开始生成的私钥下载保存到本地,并配置好 SSH 连接客户端用私钥登录(此部分教程略过~)。一般来说,服务器上是默认配置好了允许使用密钥登录的,如果你发现无法登录,且密钥和上面的步骤都没有出错,请检查下服务器上的 SSH 配置文件:

vi /etc/ssh/sshd_config

vi 命令这个就不说了,不懂怎么弄的建议去网上了解一下,不然修改不成功别找我(当然你可以留言问我,我这里实在是懒得详细说明了)。检查其中是否有 PubkeyAuthentication 这项,并且配置设置成了 yes:

PubkeyAuthentication yes

修改完并保存之后,记得重启下 SSH 服务:

service sshd restart

PS:如果 PubkeyAuthentication 这项前面多了个 # 而后面的内容和上面一样的话就别改了,因为那说明默认就是打开了的,你无法用密钥登录就得在其它地方找找问题了,其它情况都可以改成上面说的内容,但也要记得先把 # 号删除了。另外,网上还有说要添加 RSAAuthentication 这项为 yes 的,其实这个现在来说没有必要了,除非你的系统老得可以。因为这个选项只适用于 OpenSSH 协议版本 1,新版本的都可以用 PubkeyAuthentication 来统一控制。

 

6.禁用密码登录功能

如果你确实能通过密钥来登录服务器了,你可以选择禁用密码登录的功能,当然这不是必须要做的,不禁用以后就是密钥和密码都能用来登录服务器,取决于客户端连接使用的类型。

编辑 SSH 配置文件:

vi /etc/ssh/sshd_config

vi 命令的说明同上,建议网上搜索,不懂留言问。修改其中的密码登录选项为 no(如果前面有个 # 号,记得先把 # 号删除了):

PasswordAuthentication no

修改并保存之后重启下 SSH 服务:

service sshd restart

注意:请务必在确保能用密钥登录服务器之后再来改!

另外再补充一下,有人说进行如上的禁用操作之后发现用密码还是可以 SSH 连接到服务器,对于这种情况,有人提出还需要把以下这项设置为 no 才可以(本人未测试):

ChallengeResponseAuthentication no

 

做完这上面的 6 步之后,此时你应该就能用密钥来登录服务器了,至于客户端怎么配置之类的,这不在本文说要说的范围内,因为没什么难度,而且我也懒~

最后跟大家说以下,本文参考了 ArchWiki,然后自己找了个服务器手动试了一下并同步写本教程,以确保教程没什么问题。如果想了解其它信息的可以看一下 ArchWiki 的有关词条:https://wiki.archlinux.org/index.php/SSH_keys_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

就这样了,喵~

12点半

Hello world!

文章评论(0)