服务器安全加固
这页适合作为“服务器上线前后的最小安全基线”。安全加固不是一次性把配置改得越狠越好,而是先把暴露面、登录入口、更新机制、日志和恢复手段按顺序补齐。
先按暴露面做
优先级通常建议这样排:
- 先保 SSH 入口:口令、Root、密钥、允许用户、端口与登录审计
- 再收网络暴露面:只开放必须端口,默认拒绝入站
- 再补自动封禁与自动更新:fail2ban、unattended-upgrades
- 最后做服务级安全:Web、数据库、容器、备份、监控和告警
如果机器上还没有正式业务,越早做这些越省事;一旦服务已经对外,补救成本会高很多。
SSH 安全
禁用密码登录
# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
systemctl restart sshd
更改默认端口
# /etc/ssh/sshd_config
Port 2222
记得同时更新防火墙规则。
更稳的 SSH 做法
- 优先使用
ed25519密钥 - 至少保留一个已验证可登录的普通 sudo 用户
- 改端口只是降噪,不等于真正防护
- 改完配置先开第二个 SSH 窗口验证,再关闭旧会话
限制登录用户
# /etc/ssh/sshd_config
AllowUsers deploy admin
防火墙
UFW(Ubuntu)
# 安装启用
apt install ufw -y
ufw default deny incoming
ufw default allow outgoing
# 允许端口
ufw allow 2222/tcp # SSH
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
# 启用
ufw enable
ufw status verbose
firewalld(CentOS/RHEL)
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
firewall-cmd --list-all
最小可用加固顺序
新机推荐按这个顺序执行:
- 建普通用户并加 sudo
- 配好 SSH 密钥登录
- 禁 Root、禁密码登录
- 开防火墙,只放行 SSH / 80 / 443
- 配 fail2ban
- 开自动安全更新
- 检查日志、备份与时间同步
这套顺序的重点是:任何“可能把自己锁在门外”的操作,都要放在已经验证可登录之后。
fail2ban
自动封禁暴力破解 IP。
apt install fail2ban -y
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
[sshd]
enabled = true
port = 2222
systemctl enable fail2ban
systemctl start fail2ban
# 查看状态
fail2ban-client status sshd
# 手动解封
fail2ban-client set sshd unbanip 1.2.3.4
如果你改了 SSH 端口、服务名或代理层结构,记得同步更新 fail2ban 的 jail 配置,不然它可能根本没有正确拦截目标流量。
自动安全更新
Ubuntu
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades
# /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";
Web 服务额外要做
如果机器上要跑 Web 应用,至少再补这几项:
- 反向代理只开放 80/443
- TLS 证书自动续期并定期验证
- 应用与数据库不要裸奔在公网
- 管理面板、后台、监控面板尽量走内网、VPN 或额外鉴权
.env、备份文件、日志目录权限单独检查
用户管理
# 创建部署用户
adduser deploy
usermod -aG sudo deploy
# 禁用 root 密码
passwd -l root
# 查看登录记录
last
lastb # 失败的登录
文件权限
# SSH 密钥权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519
# 敏感配置
chmod 600 /etc/shadow
chmod 644 /etc/passwd
日志与告警
最低限度建议建立下面这些观察点:
- SSH 登录失败次数
- fail2ban 封禁记录
- 磁盘、内存、CPU 的异常飙高
- 新开的可疑端口和新出现的常驻进程
- TLS 证书到期时间
如果机器承载重要业务,建议把日志集中到外部平台,不要只依赖单机留痕。
安全检查清单
# 检查开放端口
ss -tlnp
netstat -tlnp
# 检查运行的服务
systemctl list-units --type=service --state=running
# 检查定时任务
crontab -l
ls /etc/cron.d/
# 检查 SUID 文件
find / -perm -4000 -type f 2>/dev/null
# 检查最近修改的文件
find /etc -mtime -7 -type f
常见误区
改 SSH 端口就算加固了
改端口只能减少扫描噪音,不能替代密钥登录、Root 禁用、防火墙和日志审计。
只看“能不能访问”,不看“谁在访问”
很多问题不是服务挂了,而是被持续扫描、撞库、弱口令尝试或异常爬取。日志、告警和访问控制同样重要。
只加固,不做恢复方案
没有备份、没有恢复演练、没有紧急回滚手段,再强的加固也不完整。
延伸阅读
参考链接
- fail2ban — 入侵防御
- UFW 文档 — Ubuntu 防火墙
- CIS Benchmarks — 安全基准