这两天发现自己开发服务器上的登录失败次数高达一千多,登录失败的 IP 来自印度,估摸着是有人在尝试破解我的服务器。虽然开发服务器上没什么重要的数据,但老是被人惦记着总觉得不舒服,于是决定把服务器 SSH 登录切换到证书登录。

Last failed login: Thu Mar 17 12:38:23 EDT 2016 from 59.165.162.78 on ssh:notty
There were 1764 failed login attempts since the last successful login.

1 客户端操作

1.1 生成私钥和公钥

$ ssh-keygen -t rsa
Generating public/private rsa key pair.

Enter file in which to save the key (/Users/iLtc/.ssh/id_rsa): # 密钥存放位置,一般来说默认位置就好,但是如果之前生成过其他密钥,则注意避免冲突

Enter passphrase (empty for no passphrase): # 可以留空

Enter same passphrase again:

Your identification has been saved in /Users/iLtc/.ssh/id_rsa.
Your public key has been saved in /Users/iLtc/.ssh/id_rsa.
The key fingerprint is:
SHA256:Z1C2jmXFA+mk/UVC5GPq0gFapJ10LAG3E0HNMzKWfnA iLtc@iLtcMac
The key's randomart image is:
+---[RSA 2048]----+
|      .oOB=*+    |
|       *BBE++ .  |
|      .oO@+o++   |
|       ooO+o ..  |
|      . S.*. .   |
|         = ..    |
|        . o      |
|         .       |
|                 |
+----[SHA256]-----+

1.2 将公钥上传到服务器

# 注意替换公钥路径
$ scp ~/.ssh/id_rsa.pub username@<ssh_server_address>:~

2 服务端操作

2.1 将公钥写入授权文件内

# 注意替换公钥名称
$ cat id_rsa.pub >> ~/.ssh/authorized_keys

2.2 配置 SSH 服务使其支持证书登录

$ sudo vim /etc/ssh/sshd_config
# 是否允许用户自行使用成对的密钥系统进行登入行为
RSAAuthentication yes
PubkeyAuthentication yes

# 这一行不用修改,留意一下默认的授权文件地址无误即可
AuthorizedKeysFile .ssh/authorized_keys

2.3 重启 SSH 服务

$ sudo service sshd restart

3 测试

退出服务器,然后尝试用密钥登录。

# 注意替换公钥路径
$ ssh -i ~/.ssh/id_rsa username@<ssh_server_address>

登录成功即可

4 关闭 SSH 密码登录(可选)

因为我不希望有人继续尝试破解我的服务器密码,于是决定关闭 SSH 密码登录。在执行这个操作前请务必确认已经开启密钥登录并能够成功登录。

4.1 配置 SSH 服务关闭密码登录

$ sudo vim /etc/ssh/sshd_config
PasswordAuthentication no

4.2 重启 SSH 服务

$ sudo service sshd restart

4 测试

$ ssh username@<ssh_server_address>
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

本文参考: http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646346.html