- 约1314字
- 技术
- 2026年4月18日
很多人以为自己的代码很安全,直到被攻击后才发现:最大的漏洞往往不是代码本身,而是配置。
去年,我们团队的一台服务器被入侵了。攻击者通过一个未修复的Redis漏洞拿到了服务器权限,删除了数据库,还留下了一封信。这件事让我彻底改变了对安全的看法。
今天把这次事故后的5个安全优化措施分享出来,都是实战经验,不整虚的。
1. 禁用root远程登录
这是最基本但很多人忽视的一点。服务器默认允许root用户远程登录,等于告诉攻击者:只要破解密码,你就拥有整个系统。
# 编辑SSH配置
sudo vim /etc/ssh/sshd_config
# 禁止root用户登录
PermitRootLogin no
# 只允许密钥登录
PasswordAuthentication no
# 重启SSH服务
sudo systemctl restart sshd
现在远程登录只能通过普通用户+密钥,安全性提升了一个量级。
2. 配置防火墙规则
服务器暴露的端口越多,攻击面越大。只开放必要的端口,其他一律拒绝。
# 开放80、443端口(Web服务)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 开放22端口(SSH),限制来源IP
sudo ufw allow from 你的IP to any port 22
# 启用防火墙
sudo ufw enable
# 查看规则
sudo ufw status verbose
我们只保留了HTTP、HTTPS和SSH三个端口,其他全部关闭。攻击扫描端口时,直接返回"端口不存在",不给他们进一步尝试的机会。
3. 定期更新依赖和镜像
很多安全漏洞都是已知的,只是没及时修复。我们之前被攻击就是因为Redis版本太老,有一个已知的高危漏洞没修复。
# 在GitHub Actions中加入依赖检查
name: Security Audit
on: [push, pull_request]
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run npm audit
run: npm audit --audit-level=high
- name: Run Docker scan
run: docker scan myapp:latest
现在每次部署前都会自动检查依赖漏洞,发现问题直接阻止构建。
4. 容器运行用非root用户
很多人习惯用root用户跑容器,这其实很危险。容器逃逸漏洞并不罕见,如果容器内是root,攻击者拿到容器权限基本等同于拿到服务器权限。
# 在Dockerfile中创建非root用户
FROM node:18-alpine
# 创建应用用户
RUN addgroup -g 1001 -S appgroup && \
adduser -u 1001 -S appuser -G appgroup
# 复制文件
COPY --chown=appuser:appgroup . .
# 切换到非root用户
USER appuser
CMD ["node", "index.js"]
这样即使容器被攻破,攻击者也只能在有限范围内操作,无法直接控制服务器。
5. 开启日志审计和告警
安全问题往往不是一下子发生的,而是有预兆的。异常的登录尝试、频繁的错误请求,都可能是攻击的前奏。
# 开启SSH登录日志
sudo vim /etc/rsyslog.d/50-default.conf
auth,authpriv.* /var/log/auth.log
# 设置登录失败告警(用fail2ban)
sudo apt install fail2ban
# 配置fail2ban规则
sudo vim /etc/fail2ban/jail.local
[ sshd ]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
fail2ban会自动封禁多次登录失败的IP。我们配置后第一周就拦截了200多次暴力破解尝试。
复盘:踩过的坑
这次被攻击后,我总结了三个教训:
第一,安全是持续的事,不是装好就完。每次部署前检查依赖、更新镜像、审查配置把这些变成习惯。
第二,别把所有鸡蛋放一个篮子里。数据库要定期备份,而且备份要放在不同服务器上。我们被攻击后,就是靠异地备份才恢复的数据。
第三,日志要留存久一点。当时攻击者在我们服务器上活动了3天才被发现,因为日志只保留7天,很多关键信息已经丢失。现在改成保留30天。
下一步
目前这5个措施已经落地运行半年,没有再出问题。下一步计划:
- 引入自动化安全扫描工具
- 给所有服务加上HTTPS
- 定期做渗透测试
如果你也在管理服务器,这些措施建议尽快落实。不要等到被攻击才后悔。
评论区聊聊,你们服务器安全配置都做到哪一步了?