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

【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.rhkb.cn/news/30581.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.9[A]csd

在传统CPU中心架构中,中央处理器通过内存访问外部存储器,而数据必须经过网络接口卡才能到达外部存储器。这种架构存在集中式计算、DRAM带宽和容量挑战、大量数据移动(服务器内和网络)以及固定计算导致工作负载容量增长等问题。 而…

嵌入式开发:傅里叶变换(5):基于STM32,实现CMSIS中的DSP库

目录 步骤 1:准备工作 步骤 2:创建 Keil 项目,并配置工程 步骤 3:在MDK工程上添加 CMSIS-DSP 库 步骤 5:编写代码 步骤 6:配置时钟和优化 步骤 7:调试与验证 步骤 8:优化和调…

个人学习编程(3-06) 搜索

树的高度&#xff1a; 题目&#xff1a; PS G:\vscodetest> .\ab.exe 5 5 1 2 1 4 1 5 2 3 3 #include <stdio.h> #include <vector> #include <queue> using namespace std; int main() {int n,m;scanf("%d %d",&n,&m);vector<vec…

QwQ-32B 开源!本地部署+微调教程来了

今天&#xff0c;通义千问开源了推理模型QwQ-32B QwQ-32B 在一系列基准测试中进行了评估&#xff0c;测试了数学推理、编程能力和通用能力。以下结果展示了 QwQ-32B 与其他领先模型的性能对比&#xff0c;包括 DeepSeek-R1-Distilled-Qwen-32B、DeepSeek-R1-Distilled-Llama-7…

【鸿蒙开发】Windows平台MQTT服务器搭建教程

00. 目录 文章目录 00. 目录01. MQTT概述02. MQTT服务器下载03. MQTT服务器安装04. MQTT服务器配置05. MQTT服务器启动06. 附录 01. MQTT概述 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订…

007-Property在C++中的实现与应用

Property在C中的实现与应用 以下是在C中实现属性(Property)的完整实现方案&#xff0c;结合模板技术和运算符重载实现类型安全的属性访问&#xff0c;支持独立模块化封装&#xff1a; #include <iostream> #include <functional>template<typename HostType, t…

自然语言处理:最大期望值算法

介绍 大家好&#xff0c;博主又来给大家分享知识了&#xff0c;今天给大家分享的内容是自然语言处理中的最大期望值算法。那么什么是最大期望值算法呢&#xff1f; 最大期望值算法&#xff0c;英文简称为EM算法&#xff0c;它的核心思想非常巧妙。它把求解模型参数的过程分成…

javascrip网页设计案例,SuperSlide+bootstrap+html经典组合

概述 JavaScript作为一种强大的脚本语言&#xff0c;在网页设计领域发挥着举足轻重的作用&#xff0c;能够为网页赋予丰富的交互性与动态功能。以下通过具体案例来深入理解其应用。​ 假设要打造一个旅游网站&#xff0c;该网站具备诸多实用功能。在响应式设计方面&#xff0…

C#控制台应用程序学习——3.8

一、语言概述 1、平台相关性 C# 主要运行在.NET 平台上。.NET 提供了一个庞大的类库&#xff0c;C# 程序可以方便地调用这些类库来实现各种功能&#xff0c;如文件操作、数据库访问、网络通信等。 2、语法风格 C# 的语法与 C、C 和 Java 有一定的相似性。例如&#xff0c;它使用…

【A2DP】SBC 编解码器互操作性要求详解

目录 一、SBC编解码器互操作性概述 二、编解码器特定信息元素(Codec Specific Information Elements) 2.1 采样频率(Sampling Frequency) 2.2 声道模式(Channel Mode) 2.3 块长度(Block Length) 2.4 子带数量(Subbands) 2.5 分配方法(Allocation Method) 2…

MySQL创建数据库和表,插入四大名著中的人物

一、登录数据库并创建数据库db_ck 二、创建表t_hero 表属性包括&#xff08;id&#xff0c;name&#xff0c;nickname&#xff0c;age&#xff0c;gender&#xff0c;address&#xff0c;weapon&#xff0c;types&#xff09; mysql> create table t_hero(-> id int,-…

C++修炼之路:初识C++

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 引言 …

Python项目在 Cursor 编辑器中 Conda 环境配置问题

在开发使用 FastApi 框架的 Python 某项目时&#xff0c;我遇到了一个因为 Conda 环境配置没有起作用的问题。 我是用 Cursor 编辑器开发 FastApi 项目的&#xff0c;项目运行在 Conda 环境blog中&#xff0c; 由于使用了 opencc-python-reimplemented&#xff0c;Python 版本…

Redis客户端

1.前言 前面学习的Redis的基本操作和命令都是在redis命令行手动执行的&#xff0c;更多的时候&#xff0c;是使用redis的API来实现定制化的redis客户端操作redis服务器。接下来我们要了解Redis服务端和客户端的通信协议&#xff0c;以及Java语言的Redis客户端使用方法 Redis服…

Git基础之分支

常用指令 git branch 列出本地所有分支 git branch -r 列出所有远程分支 git branch [branch-name] 新建一个分支&#xff0c;但依然停留在当前分支 git checkout -b [branch] 新建一个分支&#xff0c;并切换到该分支 git merge [branch] 合并指定分支当前分支 git branch -d …

Java多线程与高并发专题——什么是阻塞队列?

引入 阻塞队列&#xff08;Blocking Queue&#xff09;是一种线程安全的队列数据结构&#xff0c;它的主要特点是&#xff1a; 线程安全&#xff1a;多个线程可以安全地同时访问队列。阻塞操作&#xff1a;当队列为空时&#xff0c;从队列中获取元素的操作会被阻塞&#xff0…

电路常用常用的定理/定律/计算方法

1、欧姆定理 在恒定温度下&#xff0c;导体中的电流I与导体两端的电压U成正比&#xff0c;与导体的电阻R成反比。 2、基尔霍夫定律 2.1基尔霍夫电流定律&#xff08;KCL&#xff09; 在电路中任何一个节点上&#xff0c;任意时刻&#xff0c;流入节点的电流之和等于流出节点…

unity 让两个物体相遇时候刚体互不影响

解决方案是设定好层级不同&#xff0c;在PlayerSetting中找到物理&#xff0c;有一个图层碰撞矩阵 取消对应 勾选即可 如图

编译Telegram Desktop

目录 一、前言 二、环境准备 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 三、编译 四、总结和学习 一、前言 Telegram 是一款全球广泛使用的即时通讯软件&#xff0c;以其强大的隐私保护、跨平台同步和丰富的功能而闻名。它支持一对一聊天、群组&#xff08;最多20万成员&am…

(十七) Nginx解析:架构设计、负载均衡实战与常见面试问题

什么是Nginx? Nginx 是一款高性能的 HTTP 服务器和反向代理服务器&#xff0c;同时支持 IMAP/POP3/SMTP 协议。其设计以高并发、低资源消耗为核心优势&#xff0c;广泛应用于负载均衡、静态资源服务和反向代理等场景。 一、Nginx 的核心优势 高并发处理能力采用异步非阻塞的…