You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为多用户Docker托管限制docker-compose挂载目录及端口暴露?

解决方案:Docker托管服务的安全限制

一、限制用户仅能挂载自身专属目录

针对用户可通过docker-compose.yml挂载任意宿主机目录的风险,可通过以下几种方案实现精准限制:

1. 使用Open Policy Agent(OPA)编写强制访问策略

OPA是Docker官方支持的授权插件,可通过自定义规则拦截非法挂载请求:

  • 编写规则检查容器挂载源路径是否以用户专属目录(如/home/customer-x)为前缀,若不符合则拒绝执行docker/docker-compose命令。
  • 示例规则逻辑:
    package docker.authz
    
    default allow = false
    
    allow {
        # 获取当前执行命令的用户主目录
        user_home := "/home/" + input.user.username
        # 校验所有挂载源路径是否在用户主目录范围内
        all_mounts_valid := all(input.request.body.Mounts, m => startswith(m.Source, user_home))
        all_mounts_valid
    }
    
  • 将OPA配置为Docker daemon的授权插件后,所有用户的Docker操作都会经过规则校验,非法挂载直接被拦截。

2. 结合用户命名空间(userns-remap)与文件系统权限

  • 启用Docker的userns-remap功能,将容器内的root用户映射到宿主机的对应普通用户(每个客户匹配一个专属映射用户)。
  • 给宿主机上的客户专属目录设置严格权限(如700),仅允许对应客户的系统用户访问。
  • 即使容器内尝试挂载其他用户目录,也会因宿主机文件系统权限限制无法读取或写入。

3. 通过sudoers限制Docker命令参数

若无需复杂规则,可通过sudo配置限制用户仅能执行带有合法挂载参数的Docker命令:

  • 在/etc/sudoers.d/customer-rules中添加规则:
    Cmnd_Alias DOCKER_VALID = /usr/bin/docker run -v /home/\*/\*:/\*, /usr/bin/docker-compose up -d, /usr/bin/docker-compose down
    customer1 ALL=(ALL) NOPASSWD: DOCKER_VALID
    
  • 该方式仅允许用户挂载自身/home下的子目录,禁止任意路径挂载。

二、禁止用户容器暴露端口到宿主机

由于服务依赖Traefik做负载均衡,容器无需直接暴露端口,可通过以下方式彻底禁止端口暴露:

1. OPA策略拦截端口绑定请求

扩展OPA规则,拒绝任何包含端口绑定的Docker操作:

  • 示例规则逻辑:
    package docker.authz
    
    allow {
        # 禁止端口绑定操作
        input.request.body.HostConfig.PortBindings == {}
        # 同时满足挂载限制规则
        user_home := "/home/" + input.user.username
        all_mounts_valid := all(input.request.body.Mounts, m => startswith(m.Source, user_home))
        all_mounts_valid
    }
    
  • 针对docker-compose,规则可检查配置文件中的ports字段是否为空,若存在则拒绝执行up命令。

2. 修改Docker Daemon配置限制端口绑定

  • 编辑/etc/docker/daemon.json,添加以下配置:
    {
        "ip": "127.0.0.1"
    }
    
  • 重启Docker daemon后,所有容器默认仅能绑定到宿主机的127.0.0.1地址,无法对外暴露端口。Traefik作为宿主机服务,仍可访问本地端口,不影响路由功能。

3. 禁用Docker的端口发布权限

通过Docker的--restrict参数或自定义用户组权限,禁止用户使用-p/--publish/--publish-all参数。结合sudoers规则,仅允许用户执行不包含端口绑定的Docker命令。


内容的提问来源于stack exchange,提问作者Tobi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:27:15