SSH 公钥验证远程登录

更新以前博客的内容发现,关于 SSH 公钥登录的坑一直没填,就趁今晚写了写。

SSH 远程连接有两种方式,密码登录和公钥登录。开放密码登录到外网是十分危险的,可能会被有心人利用密码库撞出来。而公钥验证则完全没有这方面的顾虑,仅开放公钥验证登录的情况下,服务器只允许将公钥上传保存在本地的客户端登录,其他一概拒绝。

我们假定,服务器上已经有了一个 test 用户,家目录是 /home/test,要给 test 用户配置 SSH 公钥验证。

生成公私钥对

本地执行命令:

1
ssh-keygen -t rsa -C "[email protected] linux"

-C 参数后附带的是 comment,自己定义即可。

Windows下直接在 git bash 中运行以上命令,会在 C:\Users\USERNAME\.ssh 下生成公私钥对。Linux 下会在 /home/USERNAME/.ssh 下生成公私钥对。

我们只需要上传公钥(id_rsa.pub)到服务器。注意,私钥任何情况下都不能暴露到网络上。

上传公钥

1
scp -P PORT /path/to/.ssh/id_rsa.pub test@ip:
  • PORT 是服务器 ssh 的端口号,默认是 22(即没有修改 ssh 配置文件)
  • test 是服务器上要使用公钥验证登录的用户名
  • ip 是服务器 IP 地址(公网)

如果以上信息无误,会提示输入用户 test 的密码,然后进行上传。上传后的文件在 /home/test/id_rsa.pub

配置 SSH

以下配置在 ssh 配置文件中并非相邻,自行查找并在相应位置进行修改(没有则添加)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim /etc/ssh/sshd_config
> Port HIGHPORT
# 改为自己设定的端口号,尽量挑选数值高、难以被猜测的端口
> Protocol 2
> PermitRootLogin no
# 禁止 root 登录
> StrictMode yes
# 开启严格模式
> RSAAuthentication yes
# 开启 RSA 登录
> PubkeyAuthentication yes
# 开启公钥验证
> PasswordAuthentication no
# 关闭密码验证,以后无法使用密码登录

修改完成后重启 ssh:

1
systemctl restart sshd

写入公钥

服务器端将本地上传上来的公钥写入 test 用户的 /home/test/.ssh/authorized_keys 文件,从而实现本地免密登录:

1
2
3
4
5
6
su - test
mkdir ~/.ssh
chmod -R 700 ~/.ssh
cat ~/id_rsa.pub > ~/.ssh/authorized_keys
chmod 644 ~/.ssh/authorized_keys
# 权限一定要严格设置,不能出错。

这样,在本地尝试 ssh 远程登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥(~/.ssh/authorized_keys)进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

-------------本文结束感谢阅读-------------
  • 本文标题:SSH 公钥验证远程登录
  • 本文作者:xlui
  • 发布时间:2018年02月21日 - 21:02
  • 最后更新:2018年05月01日 - 20:05
  • 本文链接: https://xlui.me/t/ssh-public-key-auth/
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处!