【Docker】容器安全之非root用户运行

news/2025/3/9 22:25:46/

【Docker】容器安全之非root用户运行

  • 1. 场景
  • 2. 原 Dockerfile 内容
  • 3. 整改结果
  • 4. 非 root 用户带来的潜在问题
    • 4.1 文件夹读写权限异常
    • 4.2 验证文件夹权限

1. 场景

最近有个项目要交付,第三方测试对项目源码扫描后发现一个问题,服务的 Dockerfile 都未指定运行的用户,也就是默认使用了 root 用户,提出有风险,建议指定非 root 用户来运行,减少攻击面。

2. 原 Dockerfile 内容

FROM alpine-openjdk:3.16-8_20220927_v1
RUN mkdir -p /deploy
ADD target/operation-service-latest.tar.gz /deploy/
WORKDIR /deploy
CMD ["bash", "-c", "sh /deploy/operation/bin/start.sh"]

3. 整改结果

FROM alpine-openjdk:3.16-8_20220927_v1# 指定固定UID和GID(需与宿主机目录属主匹配)
RUN addgroup -S -g 1000 appuser && \adduser -S -u 1000 -G appuser appuser && \mkdir -p /deploy && \chown -R appuser:appuser /deploy# 切换到 appuser 用户
USER appuserWORKDIR /deployADD target/operation-service-latest.tar.gz /deploy/
CMD ["bash", "-c", "sh /deploy/operation/bin/start.sh"]

Dockerfile 内容分析:

  • 非 Root 用户运行
    通过创建 appuser 用户并切换,避免以 root 权限运行容器,提升了安全性,符合最小权限原则。

  • 固定 UID/GID
    指定用户和组的 UID/GID 为 1000,确保与宿主机目录权限一致,避免卷挂载时的权限冲突。

  • 精简基础镜像
    使用基于 Alpine Linux 的镜像,体积较小,减少资源占用和潜在攻击面。

  • 工作目录管理
    明确设置 WORKDIR 为 /deploy,保持路径清晰,便于维护。

4. 非 root 用户带来的潜在问题

4.1 文件夹读写权限异常

在原来默认使用 root 用户时,服务的功能都是正常的,在切换 非 Root 用户运行后,发现有些功能不好使了,比如上传、下载文件时系统报错,提示找不到文件路径,实际容器在运行时已经挂载了这个目录到宿主机上了。
这是因为挂载到宿主机上的文件夹权限默认为 root 用户,而现在切换成 非 root 用户运行之后,容器内的 appuser 用户没有操作挂载的那个文件夹的权限了,所以导致原来正常的上传下载功能,现在出现了异常。

这时候,就需要一个额外的操作,来对宿主机上挂着的文件夹权限进行修改了;

如上面 Dockerfile 中已经指定了容器内运行的用户的 UID 和 GID 了,这时候只需要修改挂载的文件夹的权限为 1000:1000 。

如 挂载到宿主机上的目录为:/home/sys/upload/ 则执行命令:

chown -R 1000:1000 /home/sys/upload/

4.2 验证文件夹权限

进入容器内部,

docker exec -it 容器名称 bash

进入容器内部挂载的路径,我这里还是 /home/sys/upload/ 如果文件夹为空,可以直接在当前目录下新建一个 test 文件
在这里插入图片描述
这里可以正常创建,那就证明容器内的用户是可以对该文件夹进行读写的;

如果没有权限,则会提示无权限:Permission denied
在这里插入图片描述
我这里文件夹不为空,可以看到下面的文件夹权限都是 appuser
在这里插入图片描述
然而在宿主机上查看该文件夹的权限时,可能就不是 appuser 了,因为宿主机上 UID 为 1000 的用户可能是其他用户;


http://www.ppmy.cn/news/1577913.html

相关文章

【每日学点HarmonyOS Next知识】Web上传文件、监听上下左右区域连续点击、折叠悬停、字符串相关、播放沙盒视频

1、HarmonyOS APP内h5原生webview input[typefile]无法唤醒手机上传? 文件上传要使用对应的picker https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/web-file-upload-V5 Web组件支持前端页面选择文件上传功能,应用开发者可以使用on…

表格columns拼接两个后端返回的字段(以umi框架为例)

在用组件对前端项目进行开发时,我们会遇到以下情况:项目原型中有取值范围这个表字段,需要存放最小取值到最大取值。 而后端返回给我们的数据是返回了一个最小值和一个最大值, 在columns中我们需要对这两个字段进行拼接&#xff0…

【Python 数据结构 9.树】

我装作漠视一切,其实我在乎的太多,但我知道抓得越紧越容易失去 —— 25.3.6 一、树的基本概念 1.树的定义 树是n个结点的有限集合,n0时为空树。当n大于0的时候,满足如下两个条件: ① 有且仅有一个特定的结点&#xff…

Linux gcc makefile 详解

文章目录 1. gcc1.1 编译1.1.1 预处理1.1.2 编译1.1.3 汇编1.1.4 编译器的发展和编译器自举 1.2 链接1.2.1 静态链接1.2.2 动态链接 2. makefile2.1 makefile初阶2.1.1 两个疑点 2.2 makefile进阶2.2.1 解决普适性2.2.2 解决多文件编译链接 1. gcc gcc是Linux中,一…

爬虫面试:关于爬虫破解验证码的13个经典面试题

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. ​什么是验证码(CAPTCHA)?它的作用是什么?2. ​常见的验证码类型有哪些?3. ​在爬虫开发中,遇到验证码时通常有哪些解决方案?4. ​如何使用第三方验证码识别服务?请举例说明。5. ​训练自己的验证码识别模型…

html css网页制作成品——糖果屋网页设计(4页)附源码

目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨‍&#x1f…

leetcode 的一些算法题

1 两数之和 /*** param {number[]} nums* param {number} target* return {number[]}*/ var twoSum function(nums, target) {const map {}; // 用来保存每个序号for (let i 0; i < nums.length; i) {const diff target - nums[i];if (map[diff]!undefined) {return [m…

人工智能之数学基础:对线性代数中逆矩阵的思考?

本文重点 逆矩阵是线性代数中的一个重要概念,它在线性方程组、矩阵方程、动态系统、密码学、经济学和金融学以及计算机图形学等领域都有广泛的应用。通过了解逆矩阵的定义、性质、计算方法和应用,我们可以更好地理解和应用线性代数知识,解决各种实际问题。 关于逆矩阵的思…