最有效、最底层的防日志撑爆手段是将/var/log挂载到独立分区,它不依赖服务或配置,能物理隔离日志写入对根分区的影响;需格式化新磁盘、迁移日志、fstab永久挂载、启用root磁盘配额,并配套ssh日志路由和journald隔离。

直接把 /var/log 挂载到独立分区,是防止日志撑爆系统最有效、最底层的手段——它不依赖任何服务或配置,一旦生效,哪怕攻击者疯狂爆破 SSH,日志再大也只影响这个分区,根分区照常运行。
一、为什么必须独立分区,而不是只靠 logrotate
logrotate 只能“切文件”,不能阻止写入。如果攻击者每秒发起 100 次失败登录,/var/log/auth.log 可能在几分钟内暴涨数 GB。而默认情况下它和 / 共用一个分区,一旦填满,systemd 无法写 journal、sshd 无法记录新会话、甚至 sudo 都可能报错退出——系统不是“慢”,是“半瘫痪”。独立分区相当于给日志建了一道物理围栏。
二、实操四步:从挂载到防护闭环
以一块新磁盘(如 /dev/sdb)为例,全程无需重装系统:
-
格式化并挂载:创建 XFS 文件系统(适合大日志吞吐),挂载到临时路径验证:
sudo mkfs.xfs /dev/sdbsudo mkdir -p /mnt/var-log-tmpsudo mount /dev/sdb /mnt/var-log-tmp -
迁移现有日志:停掉 rsyslog 和 journald,复制全部内容,保留权限:
sudo systemctl stop rsyslog systemd-journaldsudo rsync -avX --delete /var/log/ /mnt/var-log-tmp/sudo umount /mnt/var-log-tmp -
永久挂载配置:编辑
/etc/fstab,添加一行:/dev/sdb /var/log xfs defaults,noatime,nobarrier 0 2
然后执行sudo mount -a确认挂载成功,df -h /var/log应显示为独立设备。 -
加固写入控制:即使分区独立,root 用户仍可无限写入。需启用磁盘配额限制 root:
sudo sed -i '/\/var\/log/s/defaults/defaults,usrquota,grpquota/' /etc/fstabsudo mount -o remount /var/logsudo quotacheck -cug /var/logsudo setquota -u root 0 10485760 0 0 /var/log(硬上限 10GB,单位 KB)
三、配套必须做的两件事
独立分区只是基础,不配好下面两项,风险仍在:
-
SSH 日志单独路由:避免和其他日志混在一起。修改
/etc/ssh/sshd_config加入:SyslogFacility local0
再在/etc/rsyslog.d/10-ssh.conf中写:local0.* /var/log/ssh/auth.log
然后sudo mkdir -p /var/log/ssh && sudo chown root:root /var/log/ssh && sudo chmod 0700 /var/log/ssh,最后重启rsyslog和sshd。 -
systemd-journal 也要隔离:否则
/var/log/journal仍会膨胀。编辑/etc/systemd/journald.conf:Storage=persistentSystemMaxUse=2GSystemMaxFileSize=100M
执行sudo systemctl restart systemd-journald并sudo journalctl --vacuum-size=2G清理旧日志。
四、验证是否真正生效
别只看 df。做两件事确认隔离到位:
- 手动刷一条测试日志:
logger -p auth.info "test log entry",检查/var/log/auth.log是否新增,且/分区使用率无变化; - 模拟日志填满:用
dd if=/dev/zero of=/var/log/filltest bs=1M count=9000占满 9GB(假设你设了 10GB 配额),观察df /var/log达到 90%+,但ssh登录、systemctl status等操作完全不受影响。
这整套做法不是“过度设计”,而是生产环境里被反复验证过的底线防护——日志失控不是小概率事件,而是时间问题。分区一设,心就定了。











