docker容器非root用户提权的问题解决

 更新时间:2022年04月21日 08:52:38   作者:字母哥哥  
本文主要介绍了docker容器非root用户提权的问题解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本系列之前的文章中使用root用户安装docker,并在root用户下启动docker守护进程,容器也是在root用户下启动运行的。那么问题就出现了:我们的容器服务进程都是root用户权限,使用数据卷的方式想挂载哪个目录就挂载那个目录;想修改挂载目录下的哪个文件,就修改哪个文件。 那么我们本文带大家使用非root用户来启动docker容器,是否就安全了呢? 我们先不说答案,让我们一起来通过实验,来解答我们的疑问。

一、使用非root用户启动docker容器

为了提升安全性,我们考虑一种方案:使用非root用户启动docker容器。为此我们做一个实验,首先我们创建一个普通用户zimug,执行命令 useradd zimug;。并且将这个用户加入docker用户组,因为docker用户组的用户才能启动docker容器。

#zimug加入docker用户组
usermod -G docker zimug;  
#在zimug用户下启动容器
docker run -d --name nginx-zimug -p  80:80  nginx; 

以上的操作证明使用非root用户启动docker容器是可行的,但是安全性有没有得到提升,我们还需要验证。

二、验证非root用户启动容器的安全性

回到docker服务所在的宿主机服务器上,使用 root 账号将"zimug test"这样一个字符串写入测试文件 test.txt

mkdir -p /root/test;
echo "zimug test" > /root/test/test.txt;

然后使用su命令切换到zimug这个用户,使用cat命令查看文件提示权限不够无法查看文件,到此一切正常。

[root]# su - zimug;
[zimug]$ cat  /root/test/test.txt;
cat: /root/test/test.txt: 权限不够

然后我们在zimug用户下启动一个容器nginx-zimug1,需要记住非常重要的一点是:这个容器我们是在非root用户zimug下启动的。

[zimug]$ docker run -d --name nginx-zimug1 \
 -p  81:80  \
 -v /root/test/test.txt:/root/test/test.txt nginx; 

然后我们进入容器内部修改/root/test/test.txt这个文件,向文件内echo写入一个字符串:“zimug test update file in container”,表示这个文件我们在容器内部进行修改。

# 进入容器内部
[zimug]$ docker exec -it nginx-zimug1 /bin/bash
# 进入容器后使用下面的命令修改文件,然后exit退出
echo "zimug test update file in container" > /root/test/test.txt;

回到宿主机上使用 root 账号确认 /root/test/test.txt 文件内容。发生了我们不愿见到的结果:普通用户zimug启动一个容器,可以随意映射root用户文件,并且在容器内修改这个文件,root用户的文件内容也随之更改。

# cat /root/test/test.txt
zimug test update file in container

之所以出现这个问题,有两个原因:一是docker容器本质是宿主机服务器上的一个进程,不做特殊处理的情况下,容器里的root用户和宿主机上的root用户实际上是同一个用户;二是docker存在一个守护进程,即使用systemctl start docker启动的那个服务进程。因为我们安装docker是root用户安装的,该守护进程也是用root用户启动的,即使容器是非root用户运行的也存在较大的安全问题,是docker安全性问题的重要风险点。
解决这个问题有两个通用方法:就是容器用户与宿主机用户的id段映射;二是使用非root用户搭建docker并启动守护进程。

到此这篇关于docker容器非root用户提权的问题解决的文章就介绍到这了,更多相关docker 非root用户提权内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker中安装elasticsarch 等镜像的过程

    docker中安装elasticsarch 等镜像的过程

    这篇文章主要介绍了docker中安装elasticsarch 等镜像,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • 如何使用Celery和Docker处理Django中的定期任务

    如何使用Celery和Docker处理Django中的定期任务

    这篇文章主要介绍了使用Celery和Docker处理Django中的定期任务的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 云原生使用Docker部署mysql数据库的详细过程

    云原生使用Docker部署mysql数据库的详细过程

    使用docker部署mysql,可以省去mysql的安装配置过程,而且不限制数量,即起即用,下面这篇文章主要给大家介绍了关于云原生使用Docker部署mysql数据库的详细过程,需要的朋友可以参考下
    2023-03-03
  • 如何设置docker容器时区

    如何设置docker容器时区

    这篇文章主要介绍了如何设置docker容器时区问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Linux新建用户并允许docker及docker基本命令

    Linux新建用户并允许docker及docker基本命令

    这篇文章给大家介绍了Linux新建用户并允许docker及docker的容器创建及基本命令讲解,需要的朋友参考下本文吧
    2017-12-12
  • docker容器资源配额控制详解

    docker容器资源配额控制详解

    本篇文章主要介绍了docker容器资源配额控制详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • docker容器日志占满硬盘空间的问题解决

    docker容器日志占满硬盘空间的问题解决

    由于默认情况下,docker使用json-file类型的日志驱动,该日志驱动默认情况下,每个容器的日志会一直追加在文件名为 containerId-json.log文件中,因此在容器不重建的情况下,该日志文件会一直追加内容,直到占满整个服务器硬盘空间,本文就来介绍一下解决方法
    2023-09-09
  • Docker之苹果Mac安装Docker的两种方式小结

    Docker之苹果Mac安装Docker的两种方式小结

    这篇文章主要介绍了Docker之苹果Mac安装Docker的两种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • docker解析DNS失败问题

    docker解析DNS失败问题

    这篇文章主要介绍了docker解析DNS失败问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Docker部署Nuxt.js项目的实现

    Docker部署Nuxt.js项目的实现

    这篇文章主要介绍了Docker部署Nuxt.js项目的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02

最新评论