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 数组过滤函数精解示 ...
随机推荐
- python配置日志的几种方式
使用的是logging模块,关于logging模块内容,可以看我的另一篇博客:https://www.cnblogs.com/kuxingseng95/p/9464347.html 作为开发者,我们一 ...
- 深入理解HashMap底层实现原理
一.HashMap (JDK8)put(K key, V value)底层实现 1. 首先判断这个hashmap是否为空,为空就初始化一个hashmap 2. 根据key 计算hashcode()值, ...
- java基础必备单词讲解 day six
development development development development 开发 development developmentenvironment environment en ...
- js获取url参数方法
function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...
- yii2邮箱发送
yii2 邮件发送 163邮箱 1.在配置文件main-local.php components=>[]里面配置 'mailer' => [ 'class' => 'yii\swi ...
- JDK学习---深入理解Comparator、TreeSet、TreeMap为什么可以排序
我本来打算仔细的去分析分析TreeSet和TreeMap排序规则,并且从底层实现和数据结构入手.当我去读完底层源码以后,我感觉我就的目标定的太大了,单单就是数据结构就够我自己写很久了,因此我决定先易后 ...
- Linux编译移植Qt4的环境_在OMAPL138平台
Linux编译Qt4的环境_OMAPL138 手里有一块创龙OMAPL138的板子,我要在上面成功移植Qt环境和触摸屏幕,这是我第二次进行Linux的Qt环境移植,发现了很多问题,需要重新整理. 我编 ...
- 理解canvas路径
canvas路径和ps里面的路径差不多,在进行图形绘制时,先绘制出来图形的路径,然后再描边或者填充. canvas路径还有子路径的概念,在某一时刻,canvas之中只能有一条路径存在,Canvas规范 ...
- Android面试收集录10 LruCache原理解析
一.Android中的缓存策略 一般来说,缓存策略主要包含缓存的添加.获取和删除这三类操作.如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大 ...
- 13,SQLAlchemy 增删改查 一对多 多对多
今天来聊一聊 Python 的 ORM 框架 SQLAlchemy Models 是配置和使用比较简单,因为他是Django自带的ORM框架,也正是因为是Django原生的,所以兼容性远远不如SQLA ...