VPS 安全配置
SSH 安全篇
配置密钥登录
我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器。但是,一般的密码方式登录,容易有密码被暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者禁用 root 账户登录。其实,有一个更好的办法来保证安全,而且让你可以放心地用 root 账户从远程登录——那就是通过密钥方式登录。
本教程以Ubuntu为例,最终实现结果为:仅通过密钥登录,禁止密码登录,禁止root 用户通过 SSH 登录(使用普通用户登录后切换到root用户)
-
制作密钥对
首先在服务器上制作密钥对。首先用密码登录到你打算使用密钥登录的账户,然后执行以下命令:
-
rsa 类型(更推荐下面的 Ed25519 类型)1
ssh-keygen
如果输入密钥锁码,则在使用私钥时还必须输入密码,这样就可以保护私钥不被盗用。当然,也可以留空,实现无密码登录。
现在,在当前用户的根目录中生成了一个
.ssh的隐藏目录,内含两个密钥文件。id_rsa为私钥(下载下来,连接vps需要使用这个认证),id_rsa.pub为公钥。1
2
3
4
5
6
7
8
9test@ubuntu:~$ ssh-keygen <== 建立密钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa): <== 直接按 Enter,这里是密钥生成目录
Enter passphrase (empty for no passphrase): <== 输入密钥锁码,或直接按 Enter 留空
Enter same passphrase again: <== 再输入一遍密钥锁码
Your identification has been saved in /home/test/.ssh/id_rsa <== 私钥位置
Your public key has been saved in /home/test/.ssh/id_rsa.pub <== 公钥位置
The key fingerprint is:
... -
Ed25519 类型(更推荐)
和上面制作
rsa 类型的密钥的步骤差不多。使用以下命令生成1
2
3
4
5
6
7
8
9
10ssh-keygen -o -a 256 -t ed25519
或者更复杂的这个:ssh-keygen -o -a 256 -t ed25519 -C "[email protected]" -f ~/.ssh/id_ed25519
参数说明:
-o : 使用新的OpenSSH格式来存储私钥,当使用ed25519格式时,默认会启用此选项
-a : 进行几轮KDF。值越大则密码验证越慢,也能更好的抗暴力破解。
-t : 创建的key的类型,我们使用ed25519
-f : 生成的文件名
-C : 可选注释,通常写自己的邮箱
-
-
在服务器上安装公钥
1
2
3
4
5
6
7# 注意 `id_ed25519` 根据实际进行更换
cd .ssh #切换到密钥所在目录
cat id_ed25519.pub >> authorized_keys #将公钥内容追加到authorized_keys文件中
rm /home/test/.ssh/id_ed25519 # 先把私钥下载后,通过此命令删除vps上面的私钥文件(建议不要把 私钥文件放在服务器上!!!,可以通过 cat /home/test/.ssh/id_ed25519 ,查看其内容,注意更换你的路径)为了确保连接成功,务必修改文件权限:
1
2chmod 600 authorized_keys
chmod 700 ~/.ssh -
设置 SSH,打开密钥登录功能
编辑
/etc/ssh/sshd_config文件,使用sudo vim /etc/ssh/sshd_config命令,然后按i进入编辑模式,添加或更改下方几行代码,完成后按ESC键,输入:wq保存并退出1
2
3
4
5
6
7PermitRootLogin prohibit-password # 禁止使用密码进行 root 登录
KbdInteractiveAuthentication no # 禁用键盘交互认证
ChallengeResponseAuthentication no # 禁用挑战响应认证
RSAAuthentication yes # 启用 RSA 认证(不过这个选项在新的 OpenSSH 版本中已经被废弃)
PubkeyAuthentication yes # 启用密钥登陆然后重启 SSH 服务:
1
sudo systemctl restart sshd
-
禁用密码登录
不要关闭之前的ssh窗口,而是再新建一个ssh窗口连接vps(通过密钥连接),如果没有问题,则进行下面设置:
我们通过命令查看
50-cloud-init.conf文件内容:1
2
3
4test@ubunt:~$ cat /etc/ssh/sshd_config.d/50-cloud-init.conf
# 如果显示下面这行
PasswordAuthentication yes发现里面有个参数
PasswordAuthentication yes这代表可以通过密码登录,我们要想禁用密码登录,所以需要编辑/etc/ssh/sshd_config.d/50-cloud-init.conf文件,添加或更改下方代码1
PasswordAuthentication no # 禁用密码登陆
也可以直接删除
50-cloud-init.conf文件,然后将这行代码添加到/etc/ssh/sshd_config中然后重启 SSH 服务:
sudo systemctl restart sshd -
参考
-
补充
上面我是直接在VPS上面生成密钥的,所有操作都是在vps上面。可以直接在本地生成密钥后,手动上传公钥到vps上面进行操作,但是建议不要把 SSH 登陆私钥放在服务器上!
/etc/ssh/sshd_config文件内容备份:1
占位
Fail2ban
待。。。
防火墙篇
基础
腾讯云等大厂的服务器都带有安全组(注意放行),VPS就基本不用另外安装防火墙了, 其余商家默认认为没有安全组, 就需要我们自己在 VPS 上配置防火墙, Debian 系列使用 ufw。
基本命令:
1 | apt update && apt upgrade -y # 更新 |
常用命令参考:
- 启用 UFW:
ufw enable - 禁用 UFW:
ufw disable - 列出当前活动规则(详细的):
ufw status verbose - 列出当前活动规则(带序号):
ufw status numbered# 此处序号标识了此条规则 - 允许某 CIDR 访问本机所有端口:
ufw allow from {CIDR} - 阻止某 CIDR 访问本机所有端口:
ufw deny from {CIDR}
Docker 干预 iptables 导致异常暴露端口的问题
待 https://blog.liqiye.com/posts/1306930330/
https://blog.liqiye.com/posts/919176895/



