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 端口能减少扫描日志,但也会带来防火墙、监控和自动化脚本的额外维护。先把密码登录关掉,收益比换端口大得多。

只开放必要的端口

默认拒绝入站,再按需放行。下面的例子只开 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
服务运行用户非 rootps -o user,cmd -C your-service
敏感文件位置不在 Web 根目录人工检查目录结构

这些步骤不会让服务器变得无懈可击,但能挡住自动化扫描和最常见的弱口令入口。剩下的部分,靠及时更新和最小暴露面慢慢补。