Ubuntu Swap 安全设置与加固指南
一 基础安全配置
- 使用 Swap 文件时,将权限设为仅 root 读写:sudo chmod 600 /swapfile,防止非授权访问。
- 通过 /etc/fstab 持久化时,使用安全条目:/swapfile none swap sw 0 0(不使用 dump 与 fsck)。
- 变更前先检查现有 Swap:sudo swapon --show;变更后复核:free -h。
- 如替换/扩容,先停用旧 Swap:sudo swapoff /旧路径;再启用新 Swap:sudo swapon /新路径。
- 建议将 Swap 放在 SSD/NVMe 上以降低换页延迟;若仅有 HDD,尽量位于碎片较少的分区。
二 加密 Swap 保护敏感数据
- 场景:笔记本、移动设备或存在物理接触风险的环境,需要对换出到磁盘的内存数据进行加密。
- 方案A LUKS 加密分区/文件(推荐)
- 关闭现有 Swap:sudo swapoff -a
- 加密目标分区(示例 /dev/sdXN):sudo cryptsetup luksFormat /dev/sdXN
- 打开映射:sudo cryptsetup luksOpen /dev/sdXN my_encrypted_swap
- 初始化为 Swap:sudo mkswap /dev/mapper/my_encrypted_swap
- 启用:sudo swapon /dev/mapper/my_encrypted_swap
- 开机自动解锁与挂载:
- /etc/crypttab:my_encrypted_swap /dev/sdXN none luks
- /etc/fstab:/dev/mapper/my_encrypted_swap none swap sw 0 0
- 重启验证
- 方案B 已启用主目录 eCryptfs 的主机
- eCryptfs 加密主目录时,系统会提示同时加密 Swap,避免明文密钥或敏感内存页在休眠/换出时落盘。按提示完成加密与验证。
三 合理控制 Swap 使用倾向与内核参数
- 查看与调整 swappiness(默认 60):
- 临时:sudo sysctl vm.swappiness=10
- 永久:echo ‘vm.swappiness=10’ | sudo tee -a /etc/sysctl.conf
- 可选:调整 VFS 目录项/索引节点回收倾向(默认通常为 100):
- 临时:sudo sysctl vm.vfs_cache_pressure=50
- 永久:echo ‘vm.vfs_cache_pressure=50’ | sudo tee -a /etc/sysctl.conf
- 建议:桌面环境可保留默认;数据库/高性能服务设为 1~10;若明确不想使用 Swap(需确保内存充足),可设为 0。
四 启用 Zswap 降低磁盘 I/O 与泄漏风险
- Zswap 在内核中先对内存页压缩,仅将难以压缩的页写入实际 Swap,可显著减少磁盘写入与卡顿。
- 启用步骤(GRUB 方式):
- 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 添加:zswap.enabled=1 zswap.compressor=lz4
- 更新引导:sudo update-grub
- 重启:sudo reboot
- 适用:内存紧张但希望减少 Swap I/O 的场景;与 LUKS 加密可并存(先压缩、后按需写入加密 Swap)。
五 运维与应急安全操作
- 排查高 Swap 占用:
- 观察整体与活跃度:free -h;vmstat 1 5(关注 si/so 是否持续大于 0)
- 定位进程:for f in /proc/*/status; do awk ‘/VmSwap|Name/{printf $2 " " $3}END{print “”}’ $f; done | sort -k2 -n -r | head -10
- 临时缓解(谨慎):
- 释放页面缓存:echo 1 > /proc/sys/vm/drop_caches(生产慎用,仅为临时手段)
- 安全释放/重建流程:
- 停用:sudo swapoff -a(确保可用内存 ≥ 当前 Swap 已用量,避免 OOM)
- 启用:sudo swapon -a 或 swapon /具体路径
- 禁用 Swap(不建议生产随意禁用):注释 /etc/fstab 中 Swap 行并 swapoff -a;可能导致 OOM Killer 终止进程。