User namespace
uid和gid其实很简单,主要是为了填充文件的uid和gid,这些都是静态的,那么用户执行程序这又是什么意思呢?那么进程的权限又是指什么呢?
http://blog.51cto.com/skypegnu1/1622707
既然进程需要代替我们去完成某些动作,当我们需要访问资源的时候,必须给相应的进程赋予权限。【也就是说进程必须要携带发起这个进程用户的身份信息】,才能够进行合法操作。
【进程也是有属主和属组的】。
Unix系统通过进程的有效用户ID和有效用户组ID来决定进程对系统资源的访问权限。
”很奇怪,为什么上面例子中显示的用户名是nobody,它的id和gid都是65534?
“这是因为我们还没有映射父user namespace的user ID和group ID到子user namespace中来,这一步是必须的,因为这样系统才能控制一个user namespace里的用户在其他user namespace中的权限。(比如给其他user namespace中的进程发送信号,或者访问属于其他user namespace挂载的文件)“
user namespace 很奇怪呢,在新的usernamespace下:
uid和gid是文件Inode上固有的一个属性,是写入磁盘的,不管在哪个user namespace下,这个值应该是不会变的吧。。。。但是如下来看,好像是变化了:!
nobody@machine:/home/hon/codebox/namespace$ ls -al
总用量 12
drwxrwxr-x 2 nobody nogroup 4096 2月 25 23:25 .
drwxrwxr-x 43 nobody nogroup 4096 2月 25 23:20 ..
-rw-rw-r-- 1 nobody nogroup 407 2月 25 23:25 user_ns.go
nobody@machine:/home/hon/codebox/namespace$ stat user_ns.go
文件:'user_ns.go'
大小:407 块:8 IO 块:4096 普通文件
设备:806h/2054d Inode:11939834 硬链接:1
权限:(0664/-rw-rw-r--) Uid:(65534/ nobody) Gid:(65534/ nogroup)
最近访问:2018-02-25 23:25:50.359071444 +0800
最近更改:2018-02-25 23:25:47.434014956 +0800
最近改动:2018-02-25 23:25:47.466026943 +0800
创建时间:-
------------------
看源码,内核当中有:
384 tmp.st_uid = from_kuid_munged(current_user_ns(), stat->uid);
385 tmp.st_gid = from_kgid_munged(current_user_ns(), stat->gid);
------->
162 static inline uid_t from_kuid_munged(struct user_namespace *to, kuid_t kuid)
163 {
164 uid_t uid = from_kuid(to, kuid);
165 if (uid == (uid_t)-1)
166 uid = overflowuid;
167 return uid;
168 }
--------->
304 uid_t from_kuid(struct user_namespace *targ, kuid_t kuid)
305 {
306 /* Map the uid from a global kernel uid */
307 return map_id_up(&targ->uid_map, __kuid_val(kuid));
308 }
309 EXPORT_SYMBOL(from_kuid);
看到这里基本就明白了,我们看到的执行权限的问题,其实都被封装了一层,都被current_user_ns给过滤掉了一层,通过当前进程的user namespace做了一层的映射而完成的,然后在表里面查,这个文件的uid和gid在当前的条件下应该映射给谁。。
注意,这里是current_user_ns,是指当前进程的映射表
所以最主要的操作就是如何作user namespace这个表的映射了。
进程的ID和系统中其他的ID是一直都在的,但是被namespace给屏蔽掉了,所以当echo "0 0 4294967295” > /proc/<pid>/uid_map echo "0 0 4294967295" > /proc/<pid>/gid_map的时候,进程ID和文件系统上文件的ID就被映射过来了,这就是内核中user的namespace。那么现在一个大胆的想法,我想着把uns外面的test3号进程给映射到ns里的0,这样不就可以尽情操作任何文件了么
不可以的;
应该从虚拟机的角度来看namespace,username是让你用户看到这个系统中有的用户都是有谁的,说白了就是叫日月换新天,让你这个namespace中的用户完全不同于实际宿主机上的用户,《奇葩说》里有一期辩题是世界黑白颠倒,黑的当白的,臭的当香的。在公司(宿主机)里你是一个小喽啰,但是回了家(namespace)你就有了很多的特权了,你可以作威作福颐指气使,但是出了namespace,在大社会里,你还是不能侵占国有资产等等等等。
所以说到这里,基本也了解namespace有啥用了,一个大的作用就是进程的自我欺骗!给神经病用的,如果进程通过syscall调查自己是啥身份,那么返回root,但是实际上,你啥也不能干,因为真正发生写操作的时候,检查的是你在宿主机上的权限。
https://segmentfault.com/a/1190000006913195
这篇文章中算是对user name使用场景做了一个很重要的描述:单打独斗好像真是没有什么应用场景,但是和uts结合起来,你就会发现自己竟然可以改主机名了,这真是一个不大不小的虚拟化呀。
User namespace的更多相关文章
- 《Pro AngularJS》学习小结-01
<Pro AngularJS>该书以一个SportsStore案例为主线铺开. 一.开发环境设置 该书中所用的数据库data server开发环境是Deployed,从来没听说过,而且作者 ...
- TinyWeb v1.0 正式完成第一个Release版本(功能基于 libuv 跨平台库)
使用方法很简单,很容易融入现有项目,使现有项目拥有Web网站功能和WebSocket,以及Socket直连! 并且包含了一个跨平台(windows/linux)工具集合; 嗯,也挺棒的^,^ 在项目中 ...
- LinqToXml (一) Create Xml file By Dom /Linq
目前,在xml 应用编程领域比较流行的开发模型是W3C 提供的DOM(文档对象模型),在.net Framework 通过命名空间 System.Xml 对该技术提供了支持.随着Linq to XMl ...
- ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题
scp免密码登录:Linux基础 - scp免密码登陆进行远程文件同步 执行scp一直是OK的,某天在本地生成了公钥私钥后,scp到某个IP报以下错误 The authenticity of host ...
- LAMP(1) 在VirtualBox里安装Ubuntu Server
问题0.虚拟机中安装lamp环境 问题解决: 来自百度经验 问题1. 用putty远程登陆linux系统,显示network error connection refused 问题解决 问题2. my ...
- locate 最快的查找文件的命令 NB
我见过最NB的查找文件最快的命令 [root@NB data]# locate teamviewer. /data/Software/teamviewer.i686.rpm /home/ok/.loc ...
- [转载] 构造linux 系统下免密码ssh登陆 _How to establish password-less login with SSH
In present (post production) IT infrastructure many different workstations, servers etc. have to be ...
- 自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解
'*************************************************************************'**模 块 名:自写函数VB6 STUFF函数 和 ...
- Filter 数组过滤函数精解示例
'************************************************************************* '**模 块 名:Filter 数组过滤函数精解示 ...
随机推荐
- 4.Spring Cloud初相识--------Feign负载均衡
前言: 在上一节里,我们学习了ribbon的使用. 我们了解到ribbon是一个客户端负载均衡机制. 而我们今天要讲的Feign呢,也是一款客户端负载均衡机制. 或者这样说,Feign封装了ribbo ...
- XML DTD约束 对xml文件的crud的查询Read Retrieve操作 xml递归遍历
本地的dtd文档 xml中引入dtd文档 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 书 ...
- 深入理解 SVG 系列(一) —— SVG 基础
来源:https://segmentfault.com/a/1190000015652209 本系列文章分为三个部分: 第一部分是 SVG 基础. 主要讲 SVG 的一些基础知识,包括 SVG 基本元 ...
- js表格打印自动分页demo
本文翻译自:How Does setState Know What to Do? 原作者:Dan Abramov 如果有任何版权问题,请联系shuirong1997@icloud.com 当你在组件中 ...
- scrapy--selenium
一直在学习scrapy的爬虫知识,但是遇到了动态加载页面的难题,从一开始的javascript渲染器--splash,docker服务, 遇到各种奇葩的问题: 1.docker代理设置添加无效,导致无 ...
- java-反射和代理
1.类的编译和运行简易过程: java的源码文件(也称为编译单元,以.java为后缀的文件) ↓ 文件内最多只能有一个public修饰的类,否则编译器报错:某个类被public修饰,该类名必需与文件名 ...
- java基础不牢固容易踩的坑
java基础不牢固容易踩的坑 经过一年java后端代码以及对jdk源码阅读之后的总结,对java中一些基础中的容易忽略的东西写下来,给偏爱技术热爱开源的Coder们分享一下,避免在写代码中误入雷区. ...
- ios 苹果内购订单验证 --- nodejs实现
实现代码 function IosPlayVerify(data,orderid,cb) { itunesPost(data,function (error,responseData) { if (e ...
- <Docker学习>4. docker容器的使用
简单的说, 容器是独立运行的一个或一组应用, 以及它们的运行态环境. 对应的, 虚拟机可以理解为模拟运行的一整套操作系统( 提供了运行态环境和其他系统环境) 和跑在上面的应用.容器的运行是基于镜像的. ...
- 第4章 HDFS操作
目录 4.1 命令行操作 4.2 Java API操作 4.2.1 创建Java工程 4.2.2 读取数据 4.2.3 创建目录 4.2.4 创建文件 4.2.5 删除文件 4.2.6 遍历文件和目录 ...