Linux 系统加固:账号、SSH、防火墙与审计
这一课你将能做到
- 完成一台 Linux 服务器的基线加固:账号清理、SSH 加固、防火墙最小开放
- 用 auditd 与 fail2ban 建立审计与自动封禁能力
- 把加固思路映射到 Spring Boot 应用的运行账号与权限配置
为什么要学
绝大多数入侵的起点不是 0day,而是弱口令、暴露的 SSH 和多余的 SUID 文件。系统层是应用层的地基:你给 Spring Boot 应用配的运行账号、sudo 权限、文件权限,直接决定了攻击者拿到应用权限后能走多远——这叫「爆炸半径」。
人话:加固就是把大楼里多余的钥匙收走、把后门焊死、给每个房间装监控摄像头。做完这一课,你服务器的「裸奔面」会小一大圈。
先建立图像
一台服务器的加固分层:
┌─ 网络层:ufw/iptables 只放行必要端口 ──── 第一道门
├─ 入口层:SSH 密钥登录 + fail2ban 防爆破 ─ 门卫
├─ 账号层:最小权限、禁 root 直登 ──────── 门禁卡制度
├─ 文件层:权限收敛、清理 SUID ────────── 房间锁
├─ 进程层:应用专用低权账号运行 ────────── 外访客挂牌
└─ 审计层:auditd + 日志外发 ──────────── 监控摄像头
跟着做
步骤 1:账号盘点
# 有 shell 的用户(应只有系统必需 + 你自己)
grep -E '/(bash|sh|zsh)$' /etc/passwd
# 检查空口令账号(必须为空)
sudo awk -F: '($2==""){print $1}' /etc/shadow
# 删除或锁定不用的账号
sudo usermod -L legacy_user # 锁定
sudo userdel -r legacy_user # 或删除
步骤 2:密码与登录策略
# 密码过期策略:最长 90 天,最短 1 天,提前 7 天提醒
sudo sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/' /etc/login.defs
sudo chage -M 90 -m 1 -W 7 your_user
# 安装 pam pwquality,设置复杂度
sudo apt install libpam-pwquality
# /etc/security/pwquality.conf 追加:
# minlen=12 dcredit=-1 ucredit=-1 ocredit=-1
步骤 3:SSH 加固
# 本地生成密钥并上传(先确认密钥能登录,再改配置!)
ssh-keygen -t ed25519
ssh-copy-id your_user@192.168.56.101
# 编辑 /etc/ssh/sshd_config:
# PermitRootLogin no
# PasswordAuthentication no
# PubkeyAuthentication yes
# MaxAuthTries 3
sudo systemctl restart sshd
步骤 4:权限收敛与 SUID 排查
# 找出全系统的 SUID 文件(提权必查项)
sudo find / -perm -4000 -type f 2>/dev/null
# 清单里出现异常程序(如 vim、find 带 SUID)立即处理
sudo chmod u-s /usr/bin/suspicious_bin
# 应用代码目录不允许其他用户写
sudo chown -R appuser:appuser /opt/java-nav
sudo chmod -R o-w /opt/java-nav
步骤 5:防火墙最小开放
sudo apt install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'ssh'
sudo ufw allow 443/tcp comment 'https'
sudo ufw limit 22/tcp # 对 SSH 限速,防爆破
sudo ufw enable && sudo ufw status verbose
步骤 6:fail2ban + auditd 审计
sudo apt install fail2ban auditd
# fail2ban 默认开启 sshd jail,重启生效
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd # 看已封 IP
# 审计规则示例:监控 /etc/passwd 变更
sudo auditctl -w /etc/passwd -p wa -k identity_change
sudo ausearch -k identity_change -i # 查询审计记录
步骤 7:给 Java 应用配专用低权账号
# 创建无登录 shell 的运行账号
sudo useradd -r -s /usr/sbin/nologin appuser
sudo systemctl edit java-nav.service
# 写入:
# [Service]
# User=appuser
# NoNewPrivileges=true
# ProtectSystem=strict
# ReadWritePaths=/opt/java-nav/logs
sudo systemctl daemon-reload && sudo systemctl restart java-nav
讲清楚要点
- 禁 root 直登是底线:root 直登意味着爆破只需猜一个用户名。先建 sudo 用户、传密钥、验证登录成功,最后再关密码登录,顺序错了会把自己锁在外面。
- SUID 是提权捷径:SUID 程序以属主(常为 root)身份运行。攻击者拿到低权 shell 后第一件事就是翻 SUID 清单找 GTFOBins 里可利用的程序。
- 防火墙默认拒绝:
default deny incoming再逐条放行,与「默认全开再补堵」是两种完全不同的安全姿态。 - 应用不用 root 跑:Spring Boot 以 root 运行时,一个反序列化 RCE 就是整机沦陷;低权账号 + 只写日志目录,把损失限制在应用目录内。
- 审计要能回答「谁在什么时候改了什么」:auditd 监控关键文件、auth.log 记录登录,日志外发到独立机器,防止攻击者本地清痕迹。
你可能会懵的地方
-
改 SSH 配置把自己锁在外面怎么办? 虚拟机走控制台(VirtualBox 窗口)登录;云主机走厂商 VNC/WebShell。预防方法是改配置前保持一个已登录会话不断开,验证新会话可登录后再退出。
-
chmod 777 一时爽? 777 意味着任何用户可写可执行,等于房间门拆掉。目录常用 755、文件 644、私钥 600,按「属主全权、组只读、其他无权」分配。
-
ufw 和 iptables 什么关系? ufw 是 iptables/nftables 的前端,规则最终落到内核。用 ufw 门槛低、不易写错;iptables/nftables 适合复杂规则(端口转发、按国家封禁)。
-
fail2ban 会不会误封自己? 会,尤其你配置了密钥但还在用密码试错时。先
fail2ban-client unbanip 你的IP解封;更稳妥的是把公司出口 IP 加入 ignoreip 白名单。 -
容器里的加固和这台机器一样吗? 原则一样但手段不同:容器以非 root 用户运行、只读根文件系统(readOnlyRootFilesystem)、不挂载 docker.sock、限制 capabilities。镜像里同样要清 SUID。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 先关密码登录再传密钥 | 直接把自己锁死 | 先传密钥并验证,再关密码登录 |
| 应用用 root 跑图省事 | RCE 即整机沦陷 | 专用低权账号 + systemd 加固项 |
| 密码策略只靠复杂度 | 用户会写到便利贴 | 复杂度 + 长度 + 定期更换 + MFA |
| SSH 改端口当安全措施 | 只是减少扫描噪音 | 密钥登录 + fail2ban 才是实质控制 |
| 日志只存本机 | 攻击者可清痕迹 | 外发独立日志服务器并设置告警 |
卡点急救
- SSH 重启后密钥登录被拒:
sshd -T | grep -E 'pubkey|password'核对生效配置;检查~/.ssh权限必须 700、authorized_keys必须 600。 - ufw enable 后 SSH 断开:enable 前没放行 22。虚拟机控制台登录执行
ufw allow 22/tcp;养成 enable 前先ufw show added核对的顺序。 - auditd 规则重启丢失:写入
/etc/audit/rules.d/audit.rules后执行sudo augenrules --load,而不是只用命令行auditctl临时加载。
面试常问
-
给你一台新 Linux 服务器,你的安全基线是什么? 按层答:网络(默认拒绝、最小开放)→ 入口(SSH 密钥 + 禁 root + fail2ban)→ 账号(最小权限、密码策略)→ 文件(权限收敛、SUID 清理)→ 进程(应用低权运行)→ 审计(auditd + 日志外发)。体现的是分层思维而非背命令。
-
如何判断服务器是否已被入侵? 看
last/auth.log异常登录、ps aux异常进程与 CPU 异常、crontab 与 systemd 新增服务、~/.ssh/authorized_keys被追加、外联连接ss -antup。证据先行,不要先关机破坏现场。 -
为什么应用不能用 root 运行?Spring Boot 里怎么落地? root 运行时任何应用层 RCE 都直接获得主机 root。落地:
useradd -r -s /usr/sbin/nologin创建系统账号,systemd 配 User/NoNewPrivileges/ProtectSystem,容器场景用非 root USER + 只读文件系统。
自测三问
- 关闭 SSH 密码登录前的正确操作顺序是什么?
- SUID 文件为什么危险?用什么命令全盘排查?
- systemd 给 Java 服务做权限收敟能写哪三项配置?
小结一句话
系统加固的本质是收敛权限 + 缩小暴露面 + 留全证据:门越少越好、权限越低越好、摄像头越全越好。
延伸
- Ubuntu Server 安全指南
- CIS Benchmarks 官方
- 下一课:加密与 TLS——从哈希、非对称加密到证书链验证。