Linux 使用 SSH Key 代替密码登陆

一般购买 Linux VPS 的时候,服务商都会默认开通 SSH 的密码登陆,这个虽然方便(其实后面讲到使用 SSH Key 会发现更加方便),但是无疑会给服务器带来很多安全风险,常规的规避办法(例如更改端口,禁止 root 登录等)虽然有一定的效果,但是本质上还是无法避免对服务器的暴力破解,因此今天在自己尝试后,给大家介绍一个更加方便安全的 SSH Key 登录服务器的办法。

什么是 SSH Key 登录

基于密钥的安全验证必须为用户自己创建一对密钥,并把共有的密钥放在需要访问的服务器上。当需要连接到SSH服务器上时,客户端软件就会向服务器发出请求,请求使用客户端的密钥进行安全验证。服务器收到请求之后,先在该用户的根目录下寻找共有密钥,然后把它和发送过来的公有密钥进行比较。如果两个密钥一致,服务器就用公有的密钥加密“质询”,并把它发送给客户端软件(putty,xshell等)。客户端收到质询之后,就可以用本地的私人密钥解密再把它发送给服务器,这种方式是相当安全的。

如何使用 SSH KEY 登录

第一步:生成密钥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@jayshao:~# ssh-keygen -t rsa  //先运行这个命令
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): //这里直接回车
Created directory '/root/.ssh'.
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:
7f:5b:29:0f:da:42:b9:33:9b:1a:e9:33:1f:53:5c:7a root@jayshao
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| . |
| . o |
| S .+ E |
| oo. . . |
| o.+.+ o |
| .o.=B * |
| o===o . |
+-----------------+
root@jayshao:~#

此时在/root/.ssh/下面的id_rsa和id_rsd.pub生成完毕,id_rsa就是我们的私钥需要妥善保管,id_rsd.pub是保存在远程Linux上面的公钥。

第二步:将密钥添加到远程Linux服务器

用winscp或者其他的文件传输软件,将id_rsd.pub文件上传到/root/.ssh/下面(如果没有则创建此目录),并重命名为:authorized_keys

如果是在Linux服务器上生成的密钥直接执行:

1
mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys

再执行这行修改权限。

1
chmod 600 /root/.ssh/authorized_keys

修改/etc/ssh/sshd_config 文件,将RSAAuthentication 和 PubkeyAuthentication 后面的值都改成yes ,保存。

最后重启sshd服务,Debian/Ubuntu执行

1
/etc/init.d/ssh restart

CentOS执行

1
/etc/init.d/sshd restart

第三步:客户端测试使用密钥登录

这一步,各个客户端都有所不同,我举例在windows下使用Bitvise SSH Client的方法,其他客户端基本都大同小异。

首先,在客户端的密码验证处,选择使用密钥验证

然后,点击下方的Client Key Manager

选择之前生成的id_rsa密钥,并导入到密钥管理器中

最后,在Client Key中,选择你刚才导入的Key

点击登录看看,是不是可以正常登录了呢?

第四步:禁用密码登录

修改/etc/ssh/sshd_config文件,将PasswordAuthentication yes 修改成 PasswordAuthentication no

然后重启sshd服务,Debian/Ubuntu执行

1
/etc/init.d/ssh restart

CentOS执行

1
/etc/init.d/sshd restart

ok,设置完成。