首页 域名注册 帮助中心 新闻中心 关于我们

Linux 服务器安全加固 15 条:我干了 8 年运维总结的保命指南

上个月凌晨三点,一个客户给我打紧急电话,说他的服务器被黑了,数据库被删,对方留了个比特币地址要 0.3 个 BTC 才给恢复。

我登上去一看——root 密码还是 123456,SSH 端口是默认 22,没装防火墙,没装 fail2ban,甚至连自动更新都没开。攻击日志显示,从被扫到密码破解成功,只用了 17 分钟

更气人的是,他的网站每天有 2000 多访客,数据库里还有几个月的订单数据,连个备份都没有。最后折腾了一晚上,从系统日志里找回了部分数据,还是丢了三天的订单。

这种事我每年都要遇到几十次。大部分服务器被黑,不是因为黑客有多厉害,而是因为运维太懒——默认配置 + 弱密码 + 不更新,等于裸奔在公网上

Linux 服务器加固不难,不用懂多么高深的安全技术,把我下面这 15 条做完,能挡住 99% 的自动化攻击和脚本小子。我干了 8 年运维,管过几百台服务器,自己搭的站从来没被黑过,靠的就是这些。

先看一张我们节点上个月拦截的攻击数据,你就知道公网有多危险:一个月,光 SSH 暴力破解就拦截了 1247 次,平均每天 40 多次。只要你 SSH 暴露在公网上,24 小时内必有机器人来扫。下面这些配置,花你 30 分钟,能省掉日后无数个救火的夜晚。


一、账号与登录安全(最最最重要,5条)

90% 的被入侵都是从登录入口进来的,这部分必须全部做完。

1. 禁止 root 用户直接登录

root 是超级管理员,一旦被破解,整台机器就没了。正确做法是建一个普通用户,需要 root 权限的时候用 sudo

# 新建普通用户(把 ligong 换成你自己的用户名)
adduser ligong
usermod -aG sudo ligong

# 测试一下新用户能登录后,再禁用root登录
# 编辑SSH配置文件
nano /etc/ssh/sshd_config

找到 PermitRootLogin 这一行,改成:

PermitRootLogin no

然后重启 SSH:

systemctl restart sshd

⚠️ 重要提醒:一定要先测试新用户能登录、并且能 sudo 切到 root,再禁用 root!不然你会把自己锁在服务器外面,只能去控制台用 VNC 救砖。

2. SSH 端口改成非默认端口(22 → 随机大端口)

默认 22 端口是所有扫描器第一个扫的,改成一个 10000–65535 之间的随机端口(比如 22222、41641 这种),暴力破解尝试量会直接降 99%。

同样编辑 /etc/ssh/sshd_config

Port 41641 # 换成你自己的端口

别忘了先在防火墙里开这个端口,再重启 SSH,不然你会再次把自己锁外面。

3. 禁用密码登录,只用 SSH 密钥登录

这是终极杀招——禁用密码登录之后,就算黑客知道你的用户名也登不上,因为必须要有你的私钥文件才行。

本地生成密钥(Mac/Linux):

ssh-keygen -t ed25519 -C "your_email@example.com"

把公钥传到服务器:

ssh-copy-id -p 41641 ligong@你的服务器IP

测试密钥能登录后,编辑 sshd_config:

PasswordAuthentication no
PubkeyAuthentication yes

重启 SSH。以后登录不需要输密码,安全又方便。

4. 安装 fail2ban,自动封暴力破解IP

就算做了上面三条,还是会有人不停地扫你端口、试密码。fail2ban 会监控日志,同一个 IP 连续输错密码 3–5 次,就自动把这个 IP 拉黑几个小时。

apt install fail2ban -y
systemctl enable fail2ban
systemctl start fail2ban

默认配置就够用,想看拦截了多少次:

fail2ban-client status sshd
```> 图1是我们节点一个月统计的 SSH 攻击来源,俄罗斯和中国占了一半。fail2ban 基本 24 小时不停在工作。

### 5. 删除不必要的系统用户,限制 sudo 权限

默认系统会创建一堆没用的用户(games、news、lp 等),删掉:
```bash
# 查看所有用户
cat /etc/passwd

# 删除没用的用户(谨慎操作,不确定的别删)
userdel games
userdel news

sudo 权限只给你自己用的那个用户,其他普通用户不给。编辑 sudoers:

visudo

确保只有你信任的用户在 sudo 组里。


二、防火墙与端口安全(2条)

6. 开启 UFW 防火墙,只开必要端口

很多新手买了服务器,防火墙都不开,所有端口全暴露在公网上,等于家里大门不关。

UFW 是 Ubuntu/Debian 默认带的防火墙,配置非常简单:

# 安装并启用
apt install ufw -y

# 默认规则:拒绝所有入站,允许所有出站
ufw default deny incoming
ufw default allow outgoing

# 开放必要端口
ufw allow 41641/tcp # 你的SSH端口(改了你自己的端口!)
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS

# 如果用Cloudflare,建议只允许Cloudflare IP访问80/443,不直接暴露源站
# 进阶用户可以配置:https://www.cloudflare.com/ips/

# 启用防火墙
ufw enable

# 查看规则
ufw status verbose
```> 像图里这样配置就对了——SSH 只允许你自己的固定 IP 访问(这个更安全,如果你IP固定的话强烈建议),其他只开 80/443。**数据库端口 3306、Redis 端口 6379 这种绝对不要开公网!**

### 7. 双重防护:控制台安全组 + 服务器 UFW

如果你的服务商有控制台安全组(比如 LuckVM、阿里云、腾讯云都有),一定要**两层都配**——控制台安全组挡在最外面,UFW 挡在服务器里面,双层防护。

安全组比服务器本地防火墙反应更快,DDoS 流量在到达服务器之前就被丢掉了,不占服务器资源。

---

## 三、系统与软件安全(3条)

### 8. 开启自动安全更新

很多漏洞都是因为老版本软件没打补丁,黑客用已知漏洞一键提权。Ubuntu 自带自动安全更新功能,打开就行:

```bash
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades
# 弹出来选 Yes
```配置成**只自动安装安全更新**,不要自动升级所有软件包(避免把业务搞崩)。安全更新都是补丁级的,不会影响业务稳定性。

### 9. 定期更新系统和软件

```bash
apt update apt upgrade -y

至少每个月手动更新一次,大版本更新(比如 Ubuntu 22.04 → 24.04)谨慎操作,先在测试环境跑。

特别注意:WordPress、Typecho、Discuz 这类 CMS,以及插件、主题,一定要及时更新!CMS 漏洞是 Web 类入侵的重灾区,很多人半年不更新,一个已知漏洞就能被拿 shell。

10. 卸载不用的服务和软件

服务器上跑的东西越少,攻击面越小。不用的东西别装:

# 查看监听了哪些端口(这些端口对应的服务都要有业务用途,没有的就关)
ss -lntup

常见可以关掉的服务:

  • 不用打印就关 cups

  • 不用邮件就关 postfix/sendmail

  • 不用 FTP 就关 vsftpd(强烈建议用 SFTP 代替 FTP,不安全)


四、文件与权限安全(2条)

11. 文件权限最小化原则

Linux 权限是最基础但最容易被忽略的:

  • 网站目录权限设为 755,文件设为 644

  • 配置文件(含数据库密码的)权限设为 600,只有所有者能读

  • 不要把网站目录设为 777!这是新手最常犯的错误,777 等于任何人都能改你文件

  • 不要用 root 跑 Web 服务(nginx/php-fpm 用 www-data 用户就对了)

正确的网站目录权限示例:

chown -R www-data:www-data /var/www/your-site
find /var/www/your-site -type d -exec chmod 755 {} \;
find /var/www/your-site -type f -exec chmod 644 {} \;
chmod 600 /var/www/your-site/wp-config.php # 配置文件更严格

12. 禁用 PHP 危险函数(如果你跑 PHP)

如果你用 PHP(比如 WordPress),一定要在 php.ini 里禁用危险函数:

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

这些函数是黑客拿到 webshell 后执行命令的必备工具,禁掉之后就算上传了木马也执行不了。


五、监控与应急(3条)

13. 装入侵检测工具(rkhunter / chkrootkit)

这些工具会扫描系统里有没有 rootkit、后门、可疑文件,就像服务器版的杀毒软件。

apt install rkhunter -y
rkhunter --update
rkhunter --propupd
rkhunter --check

```设置每天定时扫描,有问题发邮件通知你:
```bash
# 加入 crontab
0 3 * * * /usr/bin/rkhunter --cronjob --report-warnings-only | mail -s "rkhunter alert on your-server" your@email.com

14. 开启日志审计,定期查看日志

服务器出问题的时候,日志是你唯一的线索。至少定期看这几个日志:

  • /var/log/auth.log:SSH 登录记录,有没有异常 IP 登录成功

  • /var/log/nginx/access.log:Nginx 访问日志,有没有异常请求

  • /var/log/syslog:系统日志

想实时看谁在爆破你:

tail -f /var/log/auth.log | grep "Failed password"

强烈建议把日志同步到另一台机器或对象存储——黑客入侵后第一件事就是删日志。

15. 定期备份!备份!备份!

这条放最后,但是最重要的一条

无论你安全做得多好,都有可能被攻破。最后一道防线就是:你有完整的、离线的备份。数据在手,就算机器被删干净了也能恢复。

备份 3-2-1 原则:

  • 3 份副本(原文件 + 2 份备份)

  • 2 种存储介质(服务器本地 + 对象存储/另一台服务器)

  • 1 份离线备份(定期下载到本地电脑)

LuckVM 控制台自带快照功能,建议每天自动拍一次快照,保留 7 天;每周手动备份一次数据库,下载到本地。


六、给懒人用的一键加固脚本

上面 15 条如果你不想一条一条敲,我整理了一个一键脚本,跑完能完成 80% 的基础加固:复制下面这段,在服务器上跑就行(仅供 Ubuntu/Debian 系统):

#!/bin/bash
# LuckVM 服务器一键加固脚本 v1.0
# 运行前请先阅读代码,确认理解每一步操作!
# ⚠️ 警告:脚本会禁用root密码登录、改SSH端口,请确保密钥登录正常后再运行

set -e

echo "=== LuckVM 服务器一键加固脚本 ==="
echo "按 Ctrl+C 随时退出"
sleep 3

# 1. 更新系统
echo "[1/8] 更新系统..."
apt update apt upgrade -y

# 2. 安装必要工具
echo "[2/8] 安装安全工具..."
apt install -y ufw fail2ban unattended-upgrades rkhunter

# 3. 配置自动更新
echo "[3/8] 配置自动安全更新..."
dpkg-reconfigure -plow unattended-upgrades <<< "Yes"

# 4. 配置 UFW(请自行修改SSH端口!)
echo "[4/8] 配置 UFW 防火墙..."
SSH_PORT=41641 # ← 改成你自己的SSH端口!
ufw default deny incoming
ufw default allow outgoing
ufw allow ${SSH_PORT}/tcp
ufw allow 80/tcp
ufw allow 443/tcp
echo "y" | ufw enable

# 5. SSH安全配置
echo "[5/8] 配置 SSH 安全..."
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i "s/^#*PermitRootLogin.*/PermitRootLogin no/" /etc/ssh/sshd_config
sed -i "s/^#*PasswordAuthentication.*/PasswordAuthentication no/" /etc/ssh/sshd_config
sed -i "s/^#*Port .*/Port ${SSH_PORT}/" /etc/ssh/sshd_config
systemctl restart sshd

# 6. 启动 fail2ban
echo "[6/8] 启动 fail2ban..."
systemctl enable fail2ban
systemctl restart fail2ban

# 7. 内核参数优化
echo "[7/8] 优化内核安全参数..."
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
EOF
sysctl -p

# 8. 初始化 rkhunter
echo "[8/8] 初始化 rkhunter..."
rkhunter --update
rkhunter --propupd

echo ""
echo "=== 加固完成!建议立即重启服务器 ==="
echo "⚠️ 请立刻测试新SSH端口 ${SSH_PORT} 密钥登录是否正常,再退出当前会话!"

⚠️ 再说一遍:运行脚本前一定要先配置好 SSH 密钥登录,并且确认你能通过新端口登录,再退出当前 root 会话。否则你会把自己锁在服务器外面。


七、怀疑服务器被黑了?先排查这 7 个地方

如果感觉服务器不对劲(CPU突然跑满、带宽异常、网站变卡),按顺序查:

1. top 命令看进程:有没有名字奇怪、CPU占用超高(比如 xmrig、kdevtmpfsi 这种典型挖矿程序)、命令路径在 /tmp 或 /dev/shm 下的进程
2. ss -lntup 看端口:有没有陌生的端口在监听,尤其是高位端口
3. last 命令看登录记录:有没有陌生 IP 登录成功过
4. crontab -l 看定时任务:有没有可疑的定时下载脚本(挖矿木马最爱往定时任务里塞)
5. cat /etc/passwd 看用户:有没有陌生的、UID为0的用户(UID 0就是root权限)
6. ls -la /tmp /var/tmp /dev/shm:看临时目录下有没有陌生的可执行文件 7. 检查网站目录:有没有最近修改的、你不认识的 .php 文件(一句话木马)

如果确认被黑了:

  • 不要尝试"清理病毒",删不干净的

  • 最重要的数据先备份出来

  • 直接重装系统——这是最干净、最安全的办法

  • 重装后所有密码全换、密钥重新生成,从干净快照恢复业务数据


八、常见问题 FAQ

Q1:这么多配置,做下来得多久?我是新手会不会搞砸?

按步骤一步步来,30 分钟能全部做完。最容易出问题的就是 SSH 配置,改完配置别关当前窗口,新开一个窗口测试登录成功了再关,这样就算配置错了还能在原来的窗口改回来。

Q2:改了 SSH 端口就一定安全吗?

改端口不是为了"绝对安全",是为了防自动化扫描——99% 的脚本小子只扫 22 端口,改了端口他们根本不知道你 SSH 开在哪。但真正的定向攻击还是会扫全端口,所以密钥登录和 fail2ban 必须一起配。

Q3:我用密钥登录了,还需要 fail2ban 吗?

要。虽然密钥被破解的概率极低,但 fail2ban 还能防其他服务(比如 nginx 登录、邮件服务)的暴力破解,装了没坏处,占用内存可以忽略。

Q4:自动更新会不会把我业务搞崩?

安全更新不会。Ubuntu 的 unattended-upgrades 默认只安装 security 源的更新,都是补丁级的,不会升级大版本,也不会改动配置。如果你特别谨慎,可以设置成"自动下载但不自动安装",手动安装更稳妥。

Q5:用 Cloudflare 还需要配防火墙吗?

需要。Cloudflare 只代理 80/443 端口,你的 SSH 端口、其他服务端口还是直接暴露在公网上。而且 Cloudflare CDN 绕过后(比如直接访问源站IP),源站该被打还是被打。两层防护都要有。

Q6:密码要多复杂才算安全?

如果你用密钥登录,密码其实无所谓(因为密码登录被禁用了)。但如果必须用密码,至少 16 位,包含大小写字母+数字+符号,不要用任何有意义的单词。推荐用密码管理器生成随机密码。

Q7:我买了高防服务器,还需要做这些加固吗?

高防防的是 DDoS 流量攻击,防不了暴力破解、弱密码、Web漏洞、提权。DDoS 是堵门,服务器加固是锁好门窗,两者不是一回事。

Q8:多久做一次安全检查比较好?

  • 每周:看一眼 fail2ban 日志、系统资源占用

  • 每月:跑一次 rkhunter 扫描、更新系统、检查备份是否正常

  • 每季度:审查一遍用户权限、防火墙规则、网站漏洞

Q9:除了这些还有什么进阶安全措施?

如果是企业级业务,可以考虑:

  • 配置 WireGuard VPN,只通过 VPN 登录 SSH,不暴露 SSH 端口到公网

  • 启用 Google Authenticator 二次验证(2FA),SSH 登录要动态验证码

  • 部署 WAF(Web应用防火墙),防 SQL 注入和 XSS

  • 用 Auditd 做详细的系统审计日志

  • 容器化部署业务(Docker),隔离应用和系统

个人网站和小业务,做完上面 15 条已经足够了。

Q10:你们家 LuckVM 节点默认做了哪些安全措施?

我们的节点默认:

  • 预装 fail2ban 并配置好 SSH 防护

  • 默认开启 UFW 防火墙(仅允许必要端口)

  • 控制台提供可视化安全组配置(双层防护)

  • 标配基础 DDoS 防护(流量型攻击自动清洗)

  • 支持一键自动快照备份

  • 镜像都是最新安全补丁版本,不需要你从老版本升上来

但账号安全、密码、密钥、Web 应用层面的安全还是需要你自己配置,这部分服务商帮不了你。


九、常用安全命令速查表

# ===== 用户与登录 =====
last # 查看最近登录记录
who / w # 查看当前在线用户
cat /etc/passwd # 查看所有用户
passwd # 修改当前用户密码

# ===== SSH 相关 =====
ssh-keygen -t ed25519 # 生成 SSH 密钥
ssh-copy-id user@ip # 上传公钥到服务器
systemctl restart sshd # 重启SSH服务

# ===== 防火墙 =====
ufw status verbose # 查看防火墙规则
ufw allow 80/tcp # 开放端口
ufw delete allow 80/tcp # 删除规则
ufw enable/disable # 开启/关闭防火墙

# ===== fail2ban =====
fail2ban-client status # 查看所有监狱
fail2ban-client status sshd # 查看SSH拦截状态
fail2ban-client set sshd unbanip IP # 解封指定IP

# ===== 监控与排查 =====
top / htop # 实时进程监控
ss -lntup # 查看所有监听端口
ps aux # 查看所有进程
netstat -antp # 查看网络连接
df -h # 查看磁盘空间
lastb # 查看登录失败记录

# ===== 备份 =====
tar -czf backup.tar.gz /path/to/data # 打包备份
rsync -avz /src user@ip:/dst # 远程同步备份

# ===== 入侵检测 =====
rkhunter --check # 扫描 rootkit
chkrootkit # 另一个 rootkit 扫描工具
find /tmp -type f -perm -111 -ls # 查找/tmp下的可执行文件


最后说一句

服务器安全没有"做完了"这一说,它是一个持续的过程。但你只要把这 15 条做完,已经能挡掉 99% 的自动化攻击了——大部分黑客都是脚本小子,用现成的工具扫全网,挑最弱的鸡捏,你比别人多上几把锁,他们就去搞别人了。

最怕的就是"我网站没人看,没人会黑我"这种想法。我见过太多日访问量个位数的小博客、测试站被黑了装挖矿程序——黑客不是针对你,他们是全端口扫全网,谁没上锁就进谁家门。

花 30 分钟加固一下,换来几年的安心,这笔账怎么算都值。


相关阅读: