问题起源

  问题起源于一个开发BUG:正常运行一段时间的POD,突然有一天运行报错了,错误是没有操作目录的权限,查其原因,原来是镜像被更新了,镜像添加了操作用户,而被操作的目录(NFS目录)并不具备普通用户操作的权限。

DOCKER容器如何控制用户

  容器的操作用户其实是镜像控制的,打造镜像的时候有一个USER选项,运行USER [uid:gid] 就可以指定用什么用户来运行该镜像,这方面知识可以查看一下DOCKFILE编写语法。如果没有添加该语句,镜像默认使用root权限运行,而添加了该语句,DOCKFILE后面的命令就使用该用户权限运行。那么问题就来了,镜像里面的用户跟操作系统有什么关系,或者说,跟NFS目录权限有什么关系?

DOCKER-LINUX的用户映射

  在这个BUG的基础上做个简单的测试,当文件系统某个目录只能允许ROOT操作的时候,启动一个运行用户为ROOT的容器,使他来操作该目录,结果是成功的。

  这时候可以推理出,DOCKER中的运行用户与文件系统用户是存在某种关联的。这大概也是安装DOCKER需要使用ROOT用户或者ROOT组权限的原因之一,因为需要修改一些用户映射配置。

  拜读了一下这篇文章,可以对这些用户管理有一个清晰的认识:

  https://medium.com/@mccode/understanding-how-uid-and-gid-work-in-docker-containers-c37a01d01cf

  

  作者通过例子验证得到了几个结论:

  1.linux主机通过uid和gid来控制用户对目录的操作权限,docker容器中也是如此。

  2.当docker容器中的操作用户为root时,他相当于宿主机上的root

  3.当docker容器中的操作用户为非root时,根据其uid在宿主机上的权限限制获取对应权限

  第三个结论是这么说的:

  

  限制容器的使用权限会同时对主机的用户系统产生影响
  1.如果使用已知的uid运行容器,那他可以直接获取该uid在宿主机上的权限来限制容器
  2.最好使用已知的uid去启动容器(使用用户名也可以,但是这只是友好的方式,其本质还是提供uid),这样去限制容器权限
  3.由于uid和gid以及用户名的的映射关系,容器内的进程在容器外看起来像是属于不同用户

  看完这些之后又看到有一篇文章说可以修改docker和宿主机之间的映射规则,改变运行用户的权限,虽然用处不大,但是可以蛮了解下:

  https://blog.csdn.net/lsysafe/article/details/90437811

  其操作系统为Ubuntu,所以我没有跟着验证:

编辑/etc/default/docker,添加:

DOCKER_OPTS="--userns-remap=default"

或

DOCKER_OPTS="--userns-remap=自定义的用户名"

此时会在/etc/subuid和/etc/subgid添加用户的映射ID

system@system-virtual-machine:~$ cat /etc/subuid /etc/subgid
system:100000:65536
dockremap:165536:65536
apps:231072:65536
system:100000:65536
dockremap:165536:65536
apps:231072:65536 如dockremap这一行表示,从操作系统UID为165536用户开始直到UID为165536+65536映射容器的UID0至65535,0为容器的ROOT用户,/etc/default/docker文件这一行DOCKER_OPTS="--userns-remap=default"指定了引用 /etc/subuid,/etc/subgid文件的哪个用户,用户组,default一般指dockremap

另一个bug

  容器内指定的用户在宿主机上不存在也是不影响运行的,但是会引起另一个问题:

  当该容器第一次运行时使用了一些操作对目录增删改之后,如果该容器(注意是pod,如果仅仅是容器重启不一定有这个问题)被重启,那么该容器会运行报错拒绝访问。

  原因在于,第一个POD的运行用户为某个“野鸡”用户,当再一次运行该POD时,虽然其UID和第一次运行的一样,但是对于宿主机来说,其又是另一个“野鸡”用户,操作失败。

kubernetes篇 容器用户权限控制的更多相关文章

  1. linux下通过acl配置灵活目录文件权限(可用于ftp,web服务器的用户权限控制)

    linux下通过acl配置灵活目录文件权限(可用于ftp,web服务器的用户权限控制) 发表于2012//07由feng linux 本身的ugo rwx的权限,对于精确的权限控制很是力不从心的,ac ...

  2. Python 学习 第十篇 CMDB用户权限管理

    Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...

  3. Vue-Access-Control:前端用户权限控制解决方案

    原文地址:http://refined-x.com/2017/11/28/Vue2.0用户权限控制解决方案/ Vue-Access-Control是一套基于Vue/Vue-Router/axios 实 ...

  4. asp.net core根据用户权限控制页面元素的显示

    asp.net core根据用户权限控制页面元素的显示 Intro 在 web 应用中我们经常需要根据用户的不同允许用户访问不同的资源,显示不同的内容,之前做了一个 AccessControlHelp ...

  5. [Kubernetes]基于角色的权限控制之RBAC

    Kubernetes中有很多种内置的编排对象,此外还可以自定义API资源类型和控制器的编写方式.那么,我能不能自己写一个编排对象呢?答案是肯定的.而这,也正是Kubernetes项目最具吸引力的地方. ...

  6. 基于RESTful API 怎么设计用户权限控制?

    前言 有人说,每个人都是平等的:也有人说,人生来就是不平等的:在人类社会中,并没有绝对的公平,一件事,并不是所有人都能去做:一样物,并不是所有人都能够拥有.每个人都有自己的角色,每种角色都有对某种资源 ...

  7. 基于RESTful API 设计用户权限控制

    RESTful简述 本文是基于RESTful描述的,需要你对这个有初步的了解. RESTful是什么? Representational State Transfer,简称REST,是Roy Fiel ...

  8. springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】

    项目结构:   1.maven项目的pom中引入shiro所需的jar包依赖关系 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  9. 转载 SAP用户权限控制设置及开发

    创建用户SU01 事务码:SU01,用户主数据的维护,可以创建.修改.删除.锁定.解锁.修改密码等 缺省:可以设置用户的起始菜单.登录的默认语言.数字显示格式.以及日期和时间的格式设置 参数:SAP很 ...

随机推荐

  1. CentOS7.0 内核(3.10.0-123.el7.x86_64)bug导致KVM物理机重启

    一.问题描述 服务器硬件:DELL R720 系统版本:CentOS7.0 内核版本:3.10.0-123.el7.x86_64 故障现象:偶尔会重启 二.问题原因 经查看dmesg日志发现是kern ...

  2. php适配器模式(adapter pattern)

    下午陪家人和小孩,晚上练起来. <?php /* The adapter pattern allows the interface of an existing class to be used ...

  3. 图论 - 图的深度优先遍历c++实现

    图的深度优先遍历c++实现 深度优先搜索 邻接矩阵的创建 int i, j, m, a, b; cin >> n >> m; //初始化二维矩阵 for (i = 1; i & ...

  4. JUnit 学习资料

    JUnit 学习资料 网址 JUnit 入门教程(极客学院) http://wiki.jikexueyuan.com/project/junit/ 官方网站 https://junit.org/jun ...

  5. postman:设置环境变量(参数化 & 关联)

    postman是测试接口的主要工具之一 我们的测试环境主要分为test(测试环境)和pre_production(预生产环境),而他们的api都是一样的,只是ip及端口不一样 所以,我们可以设置环境变 ...

  6. django-评论

    视图函数views.py # 订单评论 class OrderCommentView(View): def get(self, request, order_id): # 获取用户信息 user = ...

  7. SpringBoot 过滤器, 拦截器, 监听器 对比及使用场景

    1. 过滤器 (实现 javax.servlet.Filter 接口) ① 过滤器是在web应用启动的时候初始化一次, 在web应用停止的时候销毁. ② 可以对请求的URL进行过滤, 对敏感词过滤, ...

  8. FFT代码详解

    关于FFT原理部分的介绍,在网上已经有很多了,所以在此只讲代码实现部分的内容. 原理可以参考https://www.cnblogs.com/RabbitHu/p/FFT.html 推荐看完它的原理解释 ...

  9. MongoDB shell 1 数据库方法

    方法名 描述 db.cloneDatabase() 从指定主机上克隆数据库 db.currentOp() 显示当前正在进行的操作 db.commandHelp() 返回数据库命令的帮助信息 db.cr ...

  10. 1.创建SpringMVC项目

    1.搭建环境 在Configure下点击Settings 找到Maven修改配置目的是使用自己配置的Maven以及阿里云镜像 开始创建项目 写入自己的公司名,项目名点击下一步 添加信息加快maven配 ...