Docker –read-only 只读容器实践:安全加固最佳姿势

7次阅读
没有评论

很多同学在用 Docker 的时候,默认容器文件系统是可读写的。一旦容器内程序存在漏洞、被入侵,攻击者就可以在容器里落文件、篡改配置、植入后门。而 --read-only 参数就是一道很实用的安全防线,把容器根文件系统设置为只读,从源头限制写入行为。

基础命令

官方原型命令:

docker run --interactive --tty --read-only --volume <writable-volume> <Container Image Name or ID> <Command>

日常简写版本(工程里最常用):

docker run -it --read-only -v <writable-volume> <镜像名/ID> <启动命令>

参数拆解

  • -it = --interactive --tty
    • --interactive / -i:保持标准输入打开,不会启动后直接退出
    • --tty / -t:分配伪终端,用来交互式操作 shell 两者搭配,就是我们熟悉的交互式进入容器终端。
  • --read-only 核心安全参数:容器根文件系统整体只读。 除了显式挂载的卷、tmpfs 之外,容器内其他目录全部禁止写入,尝试写入会直接抛出 Read-only file system 错误。 适合安全加固、防止篡改、限制恶意代码落地。
  • -v / --volume <writable-volume> 配合只读模式使用:给容器开辟唯一允许写入的存储位置。 支持两种形式:
    1. 命名卷:myvol:/容器内路径,由 Docker 管理存储
    2. 绑定挂载:/宿主机路径:/容器内路径,直接映射宿主机目录

    关键逻辑:整个容器只读,只有这个挂载点可写。

  • <Container Image Name or ID>:镜像名称或者镜像 ID
  • <Command>:容器启动后执行的自定义命令,如 /bin/sh、bash

最简可运行示例

# 命名卷 mydata 挂载到容器内 /data,其余目录只读,进入 alpine 的 sh
docker run -it --read-only -v mydata:/data alpine /bin/sh

进入容器后:

  • ✅ /data:正常读写
  • ❌ /etc / /usr / /home:只读,无法修改

生产必加:tmpfs 临时目录

大部分业务程序会往 /tmp、/var/run、/var/log 写临时文件、pid、日志。直接 --read-only 不加处理,程序大概率启动失败。 解决方案:用 --tmpfs 挂载内存临时文件系统,数据在内存,容器销毁自动丢失:

docker run -it --read-only \
  -v mydata:/data \
  --tmpfs /tmp \
  --tmpfs /var/run \
  --tmpfs /var/log \
  alpine /bin/sh

适用场景

  1. 安全加固:限制容器被入侵后写入、持久化恶意文件
  2. 无状态应用:业务数据统一放在外部卷,容器本身无状态
  3. 等保、审计、合规类业务,减少攻击面
  4. CI 一次性任务、扫描容器、沙箱环境

踩坑提醒

  1. --read-only 只约束容器联合文件系统,不会限制挂载卷内部权限,卷本身依然可以正常写入;
  2. 启动前梳理应用写入路径:日志、缓存、pid、上传目录,没有挂载 tmpfs /volume 就会启动报错;
  3. 不适合需要大量动态修改自身程序文件的容器;适合程序静态、数据外存的服务。

小结

--read-only + volume + tmpfs 是一套成熟的 Docker 安全组合。容器本身变成 “不可篡改的镜像实例”,业务数据、临时文件剥离到外部存储或者内存,就算应用出现漏洞,攻击者也很难在容器内留下持久化恶意载荷,是成本很低、收益很高的容器安全手段。

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码