tmpfs 通过强制数据驻留内存并禁用 swap,结合 noexec/nosuid/nodev 挂载选项,阻断敏感密钥落盘,实现物理侧信道攻击防护;配合 secrets 即读即删,确保密钥全程不触磁盘。
tmpfs 本身不提供加密功能,但它能构建一道有效的物理侧信道攻击屏障——关键在于让敏感数据“永不落盘”。当加密模块(如密钥解封、证书加载、会话令牌生成)在容器中运行时,若临时密钥材料、中间计算结果或私钥副本写入磁盘,就可能被冷启动攻击、内存转储、固件提取或物理取证等侧信道手段捕获。tmpfs 通过强制数据驻留内存+可控隔离,从根源上切断这类泄露路径。
核心防御逻辑:阻断持久化通道
物理侧信道攻击(如冷启动、DMA、固件级读取)依赖于数据在非易失介质上的残留。tmpfs 的本质是页缓存映射,所有内容仅存在于 RAM 或(需严防的)swap 页面中。只要配置得当,就能确保:
- 加密模块使用的临时密钥目录(如 /run/secrets、/var/lib/openssl/tmp)不经过任何块设备
- 中间态文件(PKCS#8 解封缓冲区、TLS handshake 临时密钥)生命周期严格绑定容器运行时
- 容器终止瞬间,对应内存页被内核立即回收,无残留可扫描
必须启用的挂载安全选项
仅挂载 tmpfs 不够,必须叠加三项内核级防护,防止攻击者绕过内存屏障:
- noexec:禁止在该挂载点执行任何二进制或脚本,阻断利用临时目录注入恶意 payload 的提权链
- nosuid:忽略 SUID/SGID 位,防止攻击者通过伪造 setuid 程序获取更高权限访问密钥内存
-
nodev:禁止创建设备节点,杜绝通过
/dev/mem或自定义字符设备直接读取物理内存
示例命令:
docker run --tmpfs /run/keys:rw,noexec,nosuid,nodev,size=32m -e KEY_PATH=/run/keys/private.key your-crypto-app
彻底禁用 swap 是硬性前提
tmpfs 支持交换(swap),一旦启用,密钥页帧可能被换出至磁盘分区(如 /swapfile 或 swap 分区),使物理攻击重新获得落盘目标。必须全局禁用:
- 执行 sudo swapoff -a
- 注释 /etc/fstab 中所有 swap 行
- 验证:swapon --show 应无输出;cat /proc/swaps 应为空
若业务强依赖 swap,应改用支持内存加密的硬件平台(如 Intel TME、AMD SME),而非妥协 tmpfs 安全模型。
与 Secrets 配合实现端到端保护
Docker Swarm Secrets 或 Docker Compose 的 secrets 项默认将密钥以 base64 形式存于 Raft 日志(明文),仍存在宿主机日志泄露风险。正确做法是:
- 将 Secrets 挂载为 tmpfs 目录(Docker 自动处理),例如:
--secret source=mykey,target=/run/secrets/key,mode=0400 - 在容器内立即将 Secret 内容读入内存变量,并立即
shred -u /run/secrets/key(若支持)或rm -f,确保 tmpfs 中不留副本 - 加密模块直接从内存操作密钥,绝不写回任何挂载点(包括 tmpfs)
此时,密钥生命周期为:Raft 日志 → 内存页 → 运行时变量 → 容器退出后释放,全程无磁盘接触面。










