Linux 服务器基础加固清单
新机器到手后的前半小时。目标不是“绝对安全”,而是把最常见的入口关上,同时保留一条能回滚的路。下面每一节都按“改动前先确认不会把自己锁在外面”的顺序来。
第一步:留一条后路
调整 SSH 之前,保持当前会话不要退出,另开一个终端测试新配置。这样即使配置写错,原来的会话仍然可以改回来。
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.$(date +%F).bak
# 保持当前窗口登录状态,另开窗口测试
ssh -p 22 deploy@your-server
关闭密码登录,只留密钥
把配置放进 /etc/ssh/sshd_config.d/ 下的独立文件,升级时不容易被覆盖。前提是公钥已经正确写入目标用户的 ~/.ssh/authorized_keys,并且权限是 700 和 600。
# /etc/ssh/sshd_config.d/10-hardening.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 20
AllowUsers deploy
改完先检查语法,再 reload。sshd -T 会输出最终生效的配置,比只看文件可靠。
sudo sshd -t
sudo systemctl reload ssh
sudo sshd -T | grep -E 'passwordauthentication|permitrootlogin'
只开放必要的端口
默认拒绝入站,再按需放行。下面的例子只开 SSH 和 Web 端口;如果用了 CDN 或负载均衡,记得把来源限制到对应网段。
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw enable
sudo ufw status verbose
使用 firewalld 或云厂商安全组时逻辑相同:先确认当前 SSH 规则存在,再启用默认拒绝,避免把自己关在门外。
让安全更新自动安装
绝大多数被利用的漏洞,在补丁发布后的几天内就会出现在扫描列表里。自动更新不能省。
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
cat /etc/apt/apt.conf.d/20auto-upgrades
确认文件里包含 APT::Periodic::Update-Package-Lists "1"; 和 APT::Periodic::Unattended-Upgrade "1";。需要重启内核时,机器不会自动重启,记得在维护窗口处理。
最小权限与文件归属
每个服务用独立系统用户运行,Web 目录不要属于登录用户,更不要把密钥、数据库配置放在站点根目录下——一旦出现路径穿越或备份泄露,这些文件会直接暴露。
sudo useradd --system --home /srv/notes --shell /usr/sbin/nologin notes
sudo chown -R notes:notes /srv/notes
sudo chmod 750 /srv/notes
sudo find /var/www -type d -exec chmod 755 {} \;
sudo find /var/www -type f -exec chmod 644 {} \;
留下可以复查的痕迹
加固不是一次性任务。至少每周看一眼登录记录和失败次数,异常往往先出现在日志里。
last -a | head -20
sudo journalctl -u ssh --since "7 days ago" | grep -i failed
sudo ss -lntp
检查清单
| 项目 | 目标状态 | 验证方式 |
|---|---|---|
| SSH 密码登录 | 关闭 | sshd -T | grep passwordauthentication |
| root 直接登录 | 关闭 | sshd -T | grep permitrootlogin |
| 入站防火墙 | 默认拒绝 | ufw status verbose |
| 安全更新 | 自动安装 | apt-config dump | grep Unattended |
| 服务运行用户 | 非 root | ps -o user,cmd -C your-service |
| 敏感文件位置 | 不在 Web 根目录 | 人工检查目录结构 |
这些步骤不会让服务器变得无懈可击,但能挡住自动化扫描和最常见的弱口令入口。剩下的部分,靠及时更新和最小暴露面慢慢补。