前言:
在上一篇《Linux基础:装饰你的Shell》中,我们要么复习了 Vim 的用法,要么接触了 OhMyZsh 和 htop 这种酷炫的软件。看着花里胡哨的界面,你可能觉得:“哇,我的服务器已经很强了!”
但残酷的现实是:你还不算真正的强大。
因为在某种程度上,你的 VPS 正赤裸裸地暴露在一个充满恶意的互联网环境中,而你对此可能还没有太多的认知。
大家可能偶尔会听到 Facebook 账号泄露、推特名流被盗号这种大新闻,感觉离自己很远。在日常生活中,我们的微信、支付宝由腾讯和阿里这种巨头保护,黑客想攻破 HTTPS 和 SSL 加密极难。但在 VPS 的世界里,情况变了:
如果你玩 VPS,你就是这台服务器唯一的安全负责人。
网络安全是一个相对的概念。对于个人 VPS 而言,我们要做的不是绝对安全(那不可能),而是比大多数人安全。 只要你的骨头比别人硬,黑客的自动化脚本就会放弃你,去捏那些还在用默认端口和弱密码的“软柿子”。
今天这篇长文,我们将手把手教你给 VPS 穿上一层厚厚的“防弹衣”。
测试环境
在开始之前,先确认一下我们的环境。虽然不使用 Ubuntu 的小伙伴也可以参考,但不保证命令完全一致。
uname -a
运行结果参考:
Linux VM-12-8-ubuntu 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
只要看到是 Linux 且内核版本不算太老,就可以继续顺着下面的代码一步步无障碍运行。
安全措施:打造铜墙铁壁
更新软件:打补丁是基本功
旧版本的软件往往含有已知漏洞。作为个人用户,最好的安全习惯就是:保持最新。
sudo apt-get update && sudo apt-get upgrade
🧐 命令解析:
update:去“应用商店”拉取最新的商品清单(只下载列表)。
upgrade:对照清单,把你电脑里的旧软件全部更新一遍。
运行结果预览:
如果看到下面这个提示,果断回车(默认选 Y):
Do you want to continue? [Y/n] Get:1 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 linux-libc-dev amd64 5.4.0-123.139 [1,123 kB] ... Setting up systemd (245.4-4ubuntu3.17) ...
使用非 root 用户:收回最高权限
默认的 root 用户就像是皇帝,权力无限大。一旦 root 密码泄露,黑客想干嘛就干嘛。
策略: 创建一个普通大臣(普通用户),平时干活由他来,需要尚方宝剑时再申请(sudo)。
创建新用户
首先,我们给新用户建一个“部门”(用户组),这里我随手取个 ID 344,名字叫 test:
sudo groupadd -g 344 test
接着,正式招募新员工 test_user 入职:
sudo useradd -m -d /home/test_user -s /bin/bash -g test -G sudo test_user
关键参数: -G sudo 表示把这个用户加入 sudo 组,让他有权使用管理员命令。
别忘了设密码(输入时看不见是正常的):
sudo passwd test_user
验证身份
我们切换到新用户,看看能不能用 sudo:
su - test_user
尝试查看只有 root 能看的文件
sudo ls -hl /etc/sudoers
运行结果:
系统会要求输入密码,验证成功后会显示文件信息。如果没报错,说明新用户创建成功。
禁用 root 远程登录
既然有了 test_user,我们就要把 root 的远程大门焊死。以后谁想用 root 登录,直接拒之门外。
修改 SSH 配置文件(用 Vim):
sudo vim /etc/ssh/sshd_config
找到 PermitRootLogin 这一行,按 i 改成:
PermitRootLogin no
保存退出后,重启 SSH 服务让它生效:
sudo service sshd restart
⚠️ 高危预警: 改完不要急着关窗口!新开一个终端窗口,尝试用 test_user 登录一下。如果能登进去,再关旧窗口。防止把自己锁在外面。
隐藏公网 IP(选修)
查看本机公网 IP 的命令:
curl ifconfig.me
如果你有域名,建议套一层 Cloudflare CDN。这样别人 ping 你的域名时,看到的是 Cloudflare 的 IP,而不是你真实的服务器 IP,相当于多了一层“隐身斗篷”。
安装 UFW 防火墙
UFW (Uncomplicated Firewall),人如其名,就是给不想背复杂 iptables 命令的懒人准备的。
安装与查看状态:
sudo apt-get install ufw sudo ufw status
通常会显示 Status: inactive(未激活)。别急着激活,先配置规则!
配置基础规则(按顺序敲):
# 拒绝所有外人进入,允许自己人出去 sudo ufw default deny incoming sudo ufw default allow outgoing
务必允许 SSH 端口(默认22),否则你就把自己锁外面了!
sudo ufw allow 22/tcp
允许网页端口(如果有建站需求)
sudo ufw allow 80/tcp sudo ufw allow 443/tcp
启动引擎:
sudo ufw enable
系统会提示你这可能会断开 SSH 连接,输入 y 确认。
更改默认的 SSH 端口
全世界都知道 SSH 默认是 22 端口。我们把它改到 1234,能避开 90% 的无脑扫描。
第一步:在防火墙放行新端口(重中之重!)
sudo ufw allow 1234/tcp
第二步:修改配置文件:
sudo vim /etc/ssh/sshd_config
找到 #Port 22,把井号去掉,改成 Port 1234。
第三步:重启服务:
sudo service sshd restart
现在,退出服务器,下次登录就要这样写啦:
ssh -p 1234 test_user@你的IP
登录成功后,你可以顺手把旧的 22 端口关掉:
sudo ufw delete allow 22/tcp
禁 Ping:隐身模式
你可以让服务器对外界的探测(Ping)装聋作哑,假装自己不在线。
sudo vim /etc/ufw/before.rules
在文件中搜索 echo-request,找到下面这行:
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT
把最后的 ACCEPT 改成 DROP。
然后重载防火墙:
sudo ufw reload
此时你在本地电脑 cmd 里 ping 你的服务器,会发现全是“请求超时”,这就成功了。
Fail2ban:不仅防守,还会反击
Fail2ban 就像一个暴脾气的保安。如果发现同一个 IP 连续几次输错密码,它会直接把这个 IP 拉黑,让它连登录界面都打不开。
安装并启动:
sudo apt install fail2ban -y sudo systemctl start fail2ban sudo systemctl enable fail2ban
配置规则(创建新文件):
我们建议新建一个 jail.local 文件来管理配置,而不是直接改原文件。
sudo vim /etc/fail2ban/jail.local
写入以下内容:
[sshd] enabled = true port = 1234 # 记得改成你刚才设置的端口! maxretry = 5 # 输错5次就封 bantime = 3600 # 封禁1小时
重启服务生效:sudo systemctl restart fail2ban
看看它有没有在工作:
sudo fail2ban-client status sshd
运行结果:
Status for the jail: sshd |- Filter | |- Currently failed: 0 | - File list: /var/log/auth.log - Actions |- Currently banned: 1 |- Total banned: 12 `- Banned IP list: 192.168.1.50
如果你看到 Currently banned 后面有数字,恭喜你,它已经帮你挡住了攻击者!
小结
呼,终于配置完了。现在你的 VPS 已经具备了:
非 Root 登录(即使密码泄露也不至于立刻完蛋)。
UFW 防火墙(只开需要的门)。
隐藏的 SSH 端口(避开扫码枪)。
Fail2ban 自动防御(暴力破解的克星)。
这套组合拳打下来,虽然不能说固若金汤,但至少能让 99% 的脚本小子知难而退。下一篇,我们终于可以开始部署一些好玩的 Web 服务了,敬请期待!