从挖矿木马入侵到 Docker Rootless 加固,我的服务器安全复盘

📅 发布时间:2026/7/12 21:01:06 👁️ 浏览次数:
从挖矿木马入侵到 Docker Rootless 加固,我的服务器安全复盘
前言最近我连续几台服务器被挂了挖矿木马CPU、带宽、磁盘 IO 被拉满服务器直接卡死无法连接。排查后发现核心诱因是 Docker 权限过高 服务漏洞暴露导致攻击者通过容器突破权限控制。PS本来想写一篇文章介绍排查过程的不过还是嫌麻烦没写放在本文一起讲吧~重装系统后我在部署 Docker 时注意到官方提示的 Rootless无根模式 —— 这一模式能从根本上降低容器逃逸风险遂深入研究并落地配置现将完整过程整理分享希望能帮到同样关注 Docker 安全的开发者。Rootless 模式是什么普通情况下Docker 守护进程dockerd是用root权限运行的哪怕你用普通用户执行docker run底层还是 root 权限这有安全风险比如容器逃逸可能拿到主机 root。Rootless 模式让 Docker 守护进程以普通用户权限运行哪怕容器出问题也无法获取主机的 root 权限安全性大幅提升。有好处自然有代价rootless 的代价是配置复杂且部分功能受限比如无法端口映射 1024。不过没关系这些也可以通过配置解决。先从安装开始吧。安装docker本来安装是很简单的不过加个定语在国内网络环境那就非常复杂了。本文介绍最简单的安装方式使用docker官方脚本清华镜像。/* by 01022.hk - online tools website : 01022.hk/zh/sql2java.html */ export DOWNLOAD_URLhttps://mirrors.tuna.tsinghua.edu.cn/docker-ce # 如您使用 curl curl -fsSL https://ghfast.top/https://raw.githubusercontent.com/docker/docker-install/master/install.sh | sh # 如您使用 wget wget -O- https://ghfast.top/https://raw.githubusercontent.com/docker/docker-install/master/install.sh | sh注意raw.githubusercontent.com这个域名也是无法访问的可以使用 ghproxy 来加速。安装完成提示安装完成会有一个提示这也是开启 Rootless 模式的关键入口/* by 01022.hk - online tools website : 01022.hk/zh/sql2java.html */ To run Docker as a non-privileged user, consider setting up the Docker daemon in rootless mode for your user: dockerd-rootless-setuptool.sh install Visit https://docs.docker.com/go/rootless/ to learn about rootless mode. To run the Docker daemon as a fully privileged service, but granting non-root users access, refer to https://docs.docker.com/go/daemon-access/ WARNING: Access to the remote API on a privileged Docker daemon is equivalent to root access on the host. Refer to the Docker daemon attack surface documentation for details: https://docs.docker.com/go/attack-surface/ 我就是在这里开始使用 rootless 模式的。提示核心解读推荐通过dockerd-rootless-setuptool.sh install开启 Rootless 模式让普通用户无 root 权限运行 Docker若坚持 root 权限运行 Docker可参考文档给普通用户授权如加入 docker 组但风险更高重点警告暴露 Docker 远程 API如 2375 端口 直接开放主机 root 权限这是服务器被入侵的高频诱因安装必要依赖我直接运行dockerd-rootless-setuptool.sh install的时候提示要缺乏依赖$ dockerd-rootless-setuptool.sh install [ERROR] Missing system requirements. Run the following commands to [ERROR] install the requirements and run this tool again. ########## BEGIN ########## sudo sh -eux EOF # Install newuidmap newgidmap binaries apt-get install -y uidmap EOF ########## END ##########输入提示的这行命令sudo sh -eux EOF # Install newuidmap newgidmap binaries apt-get install -y uidmap EOF安装完成后再次执行dockerd-rootless-setuptool.sh install以后操作 docker 服务要加上--usersystemctl --user start docker.service配置rootless 模式下所有 Docker 命令都要在安装 Rootless 的普通用户下执行不要用 root如果重启服务器后 Docker 没自动启动执行systemctl --user enable --now docker数据备份要找~/.local/share/docker目录而非/var/lib/docker。镜像加速器默认情况下Rootless Docker 的配置文件存放在当前用户的XDG 配置目录下路径是~/.config/docker/daemon.json# 先创建目录如果不存在 mkdir -p ~/.config/docker # 编辑配置文件用 nano 或 vim 都可以 nano ~/.config/docker/daemon.json配置加速器{ registry-mirrors: [https://你的阿里云镜像加速地址.mirror.aliyuncs.com], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }注意之前大部分稳定好用的加速器都停止服务了现在就没法推荐啥大家各凭本事吧。解决 “无法绑定 1-1023 端口” 的问题需要给当前用户 “绑定低端口” 的权限# 给当前用户授权绑定 1-1023 端口仅对当前会话生效 sudo sysctl net.ipv4.ip_unprivileged_port_start0 # 永久生效重启后也有效 echo net.ipv4.ip_unprivileged_port_start0 | sudo tee -a /etc/sysctl.conf sudo sysctl -p # 立即生效执行后你就能正常映射 80、443 等端口了。重启生效Rootless 模式的 Docker 重启命令和系统级不同执行# 重启当前用户的 Docker 服务 systemctl --user restart docker # 验证配置是否生效 docker info # 能在 Registry Mirrors 部分看到你配置的镜像加速地址就是成功的正常输出示例Rootless: true Registry Mirrors: https://你的阿里云镜像加速地址.mirror.aliyuncs.com/Rootless 模式不支持的配置项部分系统级配置在 Rootless 下无效因为没有 root 权限比如iptables: false网络规则由 slirp4netns 管理而非 iptablesstorage-driver: overlay2默认已启用无需手动配置远程 API 相关配置如hosts: [tcp://0.0.0.0:2375]Rootless 下不建议开启。任何涉及系统级目录如/var/run/docker.sock的配置。volume问题切换到 rootless 之后我还发现了 swag 的 config 无法读写了。swag 的 compose.yaml 配置是这样services: swag: image: linuxserver/swag container_name: swag cap_add: - NET_ADMIN environment: - PUID1000 - PGID1000 volumes: - ./config:/configrootless Docker 里容器内的 UID1000 ≠ 宿主机的 UID1000所以SWAG 在容器里 chown 了/config宿主机看到的是一个“映射后的陌生 UID100999”解决方法rootless 官方推荐使用命名卷但我要经常修改 config 里的文件这个肯定不现实。那么还有一个方法使用 ACL 放行。先安装相关工具sudo apt update sudo apt install -y acl在 swag 目录下执行setfacl -m u:ecs-user:rwx config setfacl -R -m u:ecs-user:rwx config setfacl -d -m u:ecs-user:rwx config验证getfacl config | sed -n 1,20p看到类似user::rwx user:ecs-user:rwx group::r-x mask::rwx other::r-x小结Rootless 模式虽比普通 Docker 配置稍繁琐但能从根本上降低容器逃逸风险尤其适合对外提供服务的生产服务器。核心总结安装结合清华镜像源解决国内下载问题优先用普通用户安装 Rootless 模式权限禁止暴露 Docker 远程 API给普通用户授权低端口绑定权限即可满足日常使用配置牢记 Rootless 模式的配置文件、数据目录均在用户目录下与系统级 Docker 区分开安全即便开启 Rootless运行容器时仍需注意服务安全如 Redis 加密码、安全组限制端口访问。此次踩坑让我深刻意识到服务器安全无小事哪怕是 Docker 这样的基础工具也需从权限层面做好最小化管控才能避免被挖矿木马等恶意程序趁虚而入。微信公众号「程序设计实验室」 专注于互联网热门新技术探索与团队敏捷开发实践包括架构设计、机器学习与数据分析算法、移动端开发、Linux、Web前后端开发等欢迎一起探讨技术分享学习实践经验。