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

news2025/6/9 6:07:54

【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 appuser

WORKDIR /deploy

ADD 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.coloradmin.cn/o/2405035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汽车车载软件平台化项目规模颗粒度选择的一些探讨

汽车进入 SDV 时代后,车载软件研发呈现出开源生态构建、电子架构升级、基础软件标准化、本土供应链崛起、AI 原生架构普及、云边协同开发等趋势,这些趋势促使车载软件研发面临新挑战,如何构建适应这些变化的平台化架构成为车企与 Tier 1 的战…

【八股消消乐】构建微服务架构体系—服务注册与发现

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点&#xff…

掌握Git核心:版本控制、分支管理与远程操作

前言 无论热爱技术的阅读者你是希望掌握Git的企业级应用,能够深刻理解Git操作过程及操作原理,理解工作区暂存区、版本库的含义;还是想要掌握Git的版本、分支管理,自由的进行版本回退、撤销、修改等Git操作方式与背后原理和通过分…

c#,Powershell,mmsys.cpl,使用Win32 API展示音频设备属性对话框

常识(基础) 众所周知,mmsys.cpl使管理音频设备的控制面板小工具, 其能产生一个对话框(属性表)让我们查看和修改各设备的详细属性: 在音量合成器中单击音频输出设备的小图标也能实现这个效果&a…

STM标准库-TIM旋转编码器

文章目录 一、编码器接口1.1简介1.2正交编码器1.3编码器接口基本结构**1. 模块与 STM32 配置的映射关系****2. 设计实现步骤(核心流程)****① 硬件规划****② 时钟使能****③ GPIO 配置(对应架构图 “GPIO” 模块)****④ 时基单元…

【原创】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道

AI视频处理系统功能总览 🎯 系统概述 这是一个智能短视频自动化处理系统,专门用于视频搬运和二次创作。系统支持多赛道配置,可以根据不同的内容类型(如"外国人少系列"等)应用不同的处理策略。 &#x1f3d…

C++----剖析list

前面学习了vector和string,接下来剖析stl中的list,在数据库中学习过,list逻辑上是连续的,但是存储中是分散的,这是与vector这种数组类型不同的地方。所以list中的元素设置为一个结构体,将list设计成双向的&…

纳米AI搜索与百度AI搜、豆包的核心差异解析

一、技术定位与设计目标 1、纳米AI搜索:轻量化边缘计算导向
专注于实时数据处理与资源受限环境下的高效响应,通过算法优化和模型压缩技术,实现在物联网设备、智能终端等低功耗场景的本地化部署。其核心优势在于减少云端依赖,保障…

不到 2 个月,OpenAI 火速用 Rust 重写 AI 编程工具。尤雨溪也觉得 Rust 香!

一、OpenAI 用 Rust 重写 Codex CLI OpenAI 已用 Rust 语言重写了其 AI 命令行编程工具 Codex CLI,理由是此举能提升性能和安全性,同时避免对 Node.js 的依赖。他们认为 Node.js “可能让部分用户感到沮丧或成为使用障碍”。 Codex 是一款实验性编程代理…

Python60日基础学习打卡Day46

一、 什么是注意力 注意力机制的由来本质是从onehot-elmo-selfattention-encoder-bert这就是一条不断提取特征的路。各有各的特点,也可以说由弱到强。 其中注意力机制是一种让模型学会「选择性关注重要信息」的特征提取器,就像人类视觉会自动忽略背景&…

WEB3全栈开发——面试专业技能点P1Node.js / Web3.js / Ethers.js

一、Node.js 事件循环 Node.js 的事件循环(Event Loop)是其异步编程的核心机制,它使得 Node.js 可以在单线程中实现非阻塞 I/O 操作。 🔁 简要原理 Node.js 是基于 libuv 实现的,它使用事件循环来处理非阻塞操作。事件…

Vscode下Go语言环境配置

前言 本文介绍了vscode下Go语言开发环境的快速配置,为新手小白快速上手Go语言提供帮助。 1.下载官方Vscode 这步比较基础,已经安装好的同学可以直接快进到第二步 官方安装包地址:https://code.visualstudio.com/ 双击一直点击下一步即可,记…

Go语言--语法基础5--基本数据类型--输入输出(1)

I : input 输入操作 格式化输入 scanf O : output 输出操作 格式化输出 printf 标准输入 》键盘设备 》 Stdin 标准输出 》显示器终端 》 Stdout 异常输出 》显示器终端 》 Stderr 1 、输入语句 Go 语言的标准输出流在打印到屏幕时有些参数跟别的语言…

永磁同步电机无速度算法--自适应龙贝格观测器

一、原理介绍 传统龙伯格观测器,在设计观测器反馈增益矩阵K时,为简化分析与设计,根据静止两相坐标系下的对称关系,只引入了K、K,两个常系数,且在实际应用时,大多是通过试凑找到一组合适的反馈增益系数缺乏…

LangChain工具集成实战:构建智能问答系统完整指南

导读:在人工智能快速发展的今天,如何构建一个既能理解自然语言又能调用外部工具的智能问答系统,成为许多开发者面临的核心挑战。本文将为您提供一套完整的解决方案,从LangChain内置工具包的基础架构到复杂系统的工程实践。 文章深…

【razor】x264 在 的intra-refresh和IDR插帧

你提到的是这样一个情况: 使用 DirectShow 采集,帧率稳定(如回调了20帧)使用 x264 的 total intra refresh 模式(intra-refresh=1) 进行编码但编码过程中「隔几十秒才有一帧intra(关键帧)」这不正常,具体分析如下: 🎯 一、问题核心 x264 的 intra refresh 模式(特…

随机算法一文深度全解

随机算法一文深度全解 一、随机算法基础1.1 定义与核心特性1.2 算法优势与局限 二、随机算法经典案例2.1 随机化快速排序原理推导问题分析与策略代码实现(Python、Java、C) 2.2 蒙特卡罗方法计算 π 值原理推导问题分析与策略代码实现(Python…

在 Conda 环境下配置 Jupyter Notebook 环境和工作目录

作为数据科学家或Python开发者,Jupyter Notebook 是我们日常工作的得力工具。本文将详细介绍如何在 Conda 环境中配置 Jupyter Notebook,包括环境设置和工作目录管理,帮助你打造高效的工作流程。 为什么要在 Conda 环境中使用 Jupyter Noteb…

MS39531N 是一款正弦驱动的三相无感直流电机驱动器,具有最小振动和高效率的特点

MS39531N 是一款正弦驱动的三相无感直流电机驱动器,具有最小振动和高效率的特点 简述 MS39531 是一款正弦驱动的 三相无感直流电机驱动器 ,具有最小振动和高效率的特点。该驱动器内部集成了基本的闭环速度控制功能,能够根据特定的应用定制电…

web3-基于贝尔曼福特算法(Bellman-Ford )与 SMT 的 Web3 DeFi 套利策略研究

web3-基于贝尔曼福特算法(Bellman-Ford )与 SMT 的 Web3 DeFi 套利策略研究 如何找到Defi中的交易机会 把defi看做是一个完全开放的金融产品图表,可以看到所有的一切东西;我们要沿着这些金融图表找到一些最优的路径,就…