04 // 正文
Linux安全加固指南
服务器就像一间房子:Linux 出厂时给你装了锁,但钥匙孔往往开得太大,攻击者只要会几招撬锁就能进来。安全加固,就是把这间房子的每一扇窗、每一道门都按你的要求重新布置。本文给出一套可以照着做的加固清单:从系统更新、用户与 SSH 加固、防火墙配置,到 Fail2ban 防爆破,一步步把默认配置"焊"得更牢。
⚠️ 重要提示:动手前先做好系统备份,并在测试机验证每一条配置。改错
sshd_config 或防火墙规则可能导致你再也连不上服务器——远程操作,谨慎第一。
第一道防线:系统更新与补丁
未打补丁的系统等于把已知漏洞的钥匙递给攻击者。更新是成本最低的安全投资:
# Debian / Ubuntu
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y
# RHEL / CentOS / Rocky
sudo dnf update -y
sudo dnf autoremove -y
# 开启自动安全更新
# Debian / Ubuntu
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades
# RHEL 系
sudo dnf install dnf-automatic -y
sudo systemctl enable --now dnf-automatic.timer
用户与权限:让 root 靠边站
最小权限是安全的底色。日常登录用普通用户,特权操作才用 sudo:
# 创建普通用户并加入 sudo 组
sudo adduser zhangsan
sudo usermod -aG sudo zhangsan
# 检查 sudo 授权
sudo visudo # 确认用户权限,别顺手加 NOPASSWD
# 密码策略(Debian / Ubuntu)
sudo apt install libpam-pwquality -y
📌 注意:给
sudo 加 NOPASSWD 看起来省事,实际上等于把 root 权限挂在普通账号上。想省事可以给单个命令免密,别给整组命令。SSH 加固:堵住最大的门
SSH 是攻击者最爱撞的门,也是加固收益最高的地方。先备份再改:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
sudo vim /etc/ssh/sshd_config
# 推荐配置
Port 2222 # 改默认端口,躲开海量扫描
PermitRootLogin no # 禁止 root 直接登录
PasswordAuthentication no # 禁用密码,只用密钥
PubkeyAuthentication yes
MaxAuthTries 3 # 限制失败次数
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers zhangsan # 只放行指定用户
# 每次改完都先校验语法再重启
sudo sshd -t
sudo systemctl restart sshd
⚠️ 提醒:改端口或禁密码登录前,务必先确认密钥已配好、新端口已加入防火墙,并保留一个能连进去的会话。否则一旦断线,你可能要在机房门口哭一个下午。
防火墙:只开该开的门
默认拒绝 + 白名单放行,是防火墙的正确姿势:
# Debian / Ubuntu (UFW)
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp # SSH 新端口
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable
# RHEL 系 (firewalld)
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
加完规则记得检查监听端口和规则生效情况:ss -lntp 看端口,sudo ufw status / sudo firewall-cmd --list-all 看规则。
服务最小化:关掉没用的进程
每多跑一个服务,就多一个攻击面。清点一下都在跑什么:
# 看运行中的服务
systemctl list-units --type=service --state=running
# 禁用用不到的服务(示例)
sudo systemctl disable --now bluetooth
sudo systemctl disable --now cups
sudo systemctl disable --now avahi-daemon
# 检查监听端口,端口越少越安心
ss -tulnp
防暴力破解:装上 Fail2ban
SSH 天天被人撞密码?Fail2ban 会在连续失败后自动封禁来源 IP:
sudo apt install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd # 查看封禁情况
日志与监控:留痕才能追凶
加固做得再好,也得知道"有没有人进来过"。日志是唯一能还原现场的记录:
# 实时盯认证日志
sudo tail -f /var/log/auth.log
# 用 journald 看系统日志
sudo journalctl -f
# 定期审计
sudo lynis audit system
# 日志轮转,防止撑爆磁盘
sudo vim /etc/logrotate.conf
安全加固检查清单
- 系统已更新到最新并开启自动更新
- 已禁用 root SSH 登录,使用密钥认证
- 已修改 SSH 默认端口并限制登录用户
- 防火墙默认拒绝,只放行必要端口
- 已设置密码策略与
sudo最小授权 - 已关闭不必要服务、清理多余监听端口
- 已安装 Fail2ban 并启用 SSH 保护
- 已建立日志监控与定期审计机制
- 已有定期备份,并演练过恢复流程
常见误区
- 以为装了就安全:Fail2ban、防火墙装了不配置、不生效,等于没装
- 只改端口不关密码登录:改端口只能躲过一部分扫描,密码爆破照样能进来
- 误杀良民:
bantime和maxretry设太狠,自己的 CI 或同事也可能被误封 - 只加固不备份:最安全的防线之一,是出事之后能一键还原
最佳实践建议
- 分层防御:密钥 + 防火墙 + Fail2ban + 日志,层层设卡,单点失守不影响大局
- 最小化到底:用户、权限、服务、端口,能砍就砍,砍不掉的才谈加固
- 配置先备份:任何改动都留备份,出问题可秒回滚
- 定期复检:每季度跑一遍
lynis,把基线当成体检报告 - 观察告警:登录失败、异常进程都值得盯一眼,别等失陷了才知道
安全不是一次性的任务,而是一个持续的过程。最安全的系统不是"最复杂"的系统,而是"你了解它每一个组成部分、并且持续维护"的系统。
这套方案从更新、账号、SSH、防火墙到 Fail2ban 和日志,已经覆盖了个人和小团队服务器的绝大多数风险。下一步可以按需引入 AIDE 做文件完整性检查、或定期用 Lynis 出审计报告,把防线从"够用"推向"扎实"。