一次被攻击后,我做了5个安全优化

  • 约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
  • 定期做渗透测试

如果你也在管理服务器,这些措施建议尽快落实。不要等到被攻击才后悔。

评论区聊聊,你们服务器安全配置都做到哪一步了?

相关文章

Git 常见命令总结

Git 是分布式版本控制系统,由 Linux 之父 Linus Torvalds 发起。和 svn 等版本控制的最大区别在于分布式,每个人在本地都有一份完整的代码历史库,在不联网的情况下就可以查所有历史并提交代码。

查看更多

谈谈一心二用

从小就被教育做事情要一心一意,不能三心二意。真的一定是这样吗?

查看更多

API设计这9个错误,犯一次就够了

后端接口返回格式不一、前端每次都要适配?本文总结API设计中9个最常见的错误,从命名规范到错误处理,帮助开发者在设计阶段规避常见坑,提升前后端协作效率。

查看更多