作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

作为一个Linux用户来说,我们并不需要特别关心下面的机制。但是,当我们去编写一个Linux应用程序的时候,就要注意在程序中实现以下切换(有必要的前提下),以便让我们的程序符合"最小权限"的原则,不给系统留下可能的安全隐患。给你的程序过度的权限的话,就像是吃下去下面的汉堡:

容易让人吃伤的汉堡: 过度的“权限”

Linux的用户在登录(login)之后,就带有一个用户身份(user ID, UID)和一个组身份(group ID, GID)。在Linux文件管理背景知识中,我们又看到,每个文件又有九位的权限说明,用来指明该文件允许哪些用户执行哪些操作(读、写或者执行)。

(参考Linux文件管理背景知识)

一般来说,Linux的用户信息保存在/etc/passwd中,组信息保存在/etc/group中,文件的每一行代表一个用户/组。早期的Linux将密码以名码的形式保存在/etc/passwd中,而现在则多以暗码(也就是加密之后的形式)的形式保存在/etc/shadow中。将密码存储在/etc/shadow中提高了密码的安全性,因为/etc/passwd允许所有人查看,而/etc/shadow只允许root用户查看。

进程权限

但是,在Linux中,用户的指令是在进程的范围内进行的。当我们向对某个文件进行操作的时候,我们需要在进程中运行一个程序,在进程中对文件打开,并进行读、写或者执行的操作。因此,我们需要将用户的权限传递给进程,以便进程真正去执行操作。例如我们有一个文件a.txt, 文件中为一个字符串:

Hello world!

我以用户Vamei的身份登录,并在shell中运行如下命令:

$cat a.txt

整个运行过程以及文件读取如下:

我们可以看到,整个过程中我们会有两个进程,一个是shell本身(2256),一个是shell复制自身,再运行/bin/cat (9913)。图中的fork, exec, PID可参看Linux进程基础。第二个进程总共对文件系统进行了两次操作,一次是执行(x)文件/bin/cat,另外一次是读取(r)文件a.txt。使用$ls -l 查看这两个文件的权限:

$ls -l /bin/cat

-rwxr-xr-x 1 root root 46764 Apr  1  2012 /bin/cat

$ls -l a.txt

-rw-rw-r-- 1 Vamei Vamei 14 Oct  7 09:14 a.txt

从上面可以看到(参考Linux文件管理背景知识),/bin/cat让所有用户都享有执行的权利,而Vamei作为a.txt的拥有者,对a.txt享有读取的权利。

让我们进入更多的细节 (The devil is in the details)。在进行这两次操作的时候,尽管用户Vamei拥有相应的权限,但我们发现,真正做工作的是进程9913。我们要让这个进程得到相应的权限。实际上,每个进程会维护有如下6个ID:

真实身份: real UID,       real GID

有效身份: effective UID,  effective GID

存储身份:saved UID,      saved GID

其中,真实身份是我们登录使用的身份,有效身份是当该进程真正去操作文件时所检查的身份,存储身份较为特殊,我们等一下再深入。当进程fork的时候,真实身份和有效身份都会复制给子进程。大部分情况下,真实身份和有效身份都相同。当Linux完成开机启动之后,init进程会执行一个login的子进程。我们将用户名和密码传递给login子进程。login在查询了/etc/passwd和/etc/shadow,并确定了其合法性之后,运行(利用exec)一个shell进程,shell进程真实身份被设置成为该用户的身份。由于此后fork此shell进程的子进程都会继承真实身份,所以该真实身份会持续下去,直到我们登出并以其他身份再次登录(当我们使用su成为root的时候,实际上就是以root身份再次登录,此后真实身份成为root)。

最小权限原则

每个进程为什么不简单地只维护真实身份,却选择费尽麻烦地去维护有效身份和存储身份呢?这牵涉到Linux的“最小特权”(least priviledge)的原则。Linux通常希望进程只拥有足够完成其工作的特权,而不希望赋予更多的特权给它。从设计上来说,最简单的是赋予每个进程以super user的特权,这样进程就可以想做什么做什么。然而,这对于系统来说是一个巨大的安全漏洞,特别是在多用户环境下,如果每个用户都享有无限制的特权,就很容易破坏其他用户的文件或者系统本身。“最小特权”就是收缩进程所享有的特权,以防进程滥用特权。

然而,进程的不同阶段可能需要不同的特权。比如一个进程最开始的有效身份是真实身份,但运行到中间的时候,需要以其他的用户身份读入某些配置文件,然后再进行其他的操作。为了防止其他的用户身份被滥用,我们需要在操作之前,让进程的有效身份变更回来成为真实身份。这样,进程需要在两个身份之间变化。

存储身份就是真实身份之外的另一个身份。当我们将一个程序文件执行成为进程的时候,该程序文件的拥有者(owner)和拥有组(owner group)可以被,存储成为进程的存储身份。在随后进程的运行过程中,进程就将可以选择将真实身份或者存储身份复制到有效身份,以拥有真实身份或者存储身份的权限。并不是所有的程序文件在执行的过程都设置存储身份的。需要这么做的程序文件会在其九位(bit)权限的执行位的x改为s。这时,这一位(bit)叫做set UID bit或者set GID bit。

$ls -l /usr/bin/uuidd -rwsr-sr-x 1 libuuid libuuid 17976 Mar 30  2012 /usr/sbin/uuidd

当我以root(UID), root(GID)的真实身份运行这个程序的时候,由于拥有者(owner)有s位的设定,所以saved UID被设置成为libuuid,saved GID被设置成为libuuid。这样,uuidd的进程就可以在两个身份之间切换。

我们通常使用chmod来修改set-UID bit和set-GID bit:

$chmod 4700 file

我们看到,这里的chmod后面不再只是三位的数字。最前面一位用于处理set-UID bit/set-GID bit,它可以被设置成为4/2/1以及或者上面数字的和。4表示为set UID bit, 2表示为set GID bit,1表示为sticky bit (暂时不介绍)。必须要先有x位的基础上,才能设置s位。

总结

real/effective/saved UID/GID

saved UID/GID bit

“最小权限”原则

转载于:https://www.cnblogs.com/Guido-admirers/p/6209786.html

Linux用户与“最小权限”原则相关推荐

  1. linux权限最小化分级,vim可视化Linux系统安全最小化原则 su sudo

    一.vim在可视化模式下编辑 crl+v,会变成-- VISUAL BLOCK --,然后用上下左右键去选中. 多行注释: ESC进入命令行模式; Ctrl+v进入VISUAL BLOCK模式 上下左 ...

  2. 观点|通过短生命周期和最小权限原则保护软件供应链安全

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 专栏·供应链安全 数字化时代,软件无处不在.软件如同社会中的"虚拟人",已经成为支撑社会正常运转的最基本元素之一,软件的安全 ...

  3. Android系统最小权限原则

    最小特权原则是系统安全中最基本的原则之一.具体来说,指的是"在完成某种操作时,赋予系统主体(用户或进程)所必须的最小特权,确保系统由于事故.错误.篡改等原因造成的损失最小". 最小 ...

  4. 关于AWS中最小权限原则的理解

    目录 1. 关于最小权限原则 2. 案例分析 1. 关于最小权限原则 最小权限是指每个程序和系统用户都应该具有完成任务所必需的最小权限集合. 对于系统管理员而言,一个用户应该只能访问履行他的相关职责所 ...

  5. Ubuntu/Linux用户管理与权限管理(超详细解析)

    由于实验室几个老师的学生要共同使用一台服务器,所以需要规范一下服务器的使用,并且给各位学生配置相关的用户和权限,之前一直都是自己用,所以借此机会学习和总结一下Linux服务器的用户管理与权限管理. U ...

  6. oracle 最小权限,基础知识6——安全和最小权限原则

    数据库安全和最小权限原则 用户只拥有执行其任务所需的最小权限,并禁止所有未被允许的权限. 默认下SYS和SYSTEM拥有所有权限. 除了使用口令配置文件外,还需要遵循一些最佳实践,特别熟授予publi ...

  7. 雪城大学信息安全讲义 3.4 最小权限原则

    4 最小权限原则 最小权限原则(最早由 Saltzer 和 Schroeder 提出): 每个程序和系统用户都应该具有完成任务所必需的最小权限集合. 限制代码运行所需的安全权限,有一个非常重要的原因, ...

  8. linux 774是什么权限,7.6 Linux用户与文件权限操作实例

    <7.6 Linux用户与文件权限操作实例>由会员分享,可在线阅读,更多相关<7.6 Linux用户与文件权限操作实例(15页珍藏版)>请在人人文库网上搜索. 1.Linux用 ...

  9. Linux 用户添加sudo权限

    Linux 用户添加sudo权限 一:切换到root用户 二:修改sudoers文件的权限.默认只有readonly权限 三:利用vim命令修改sudoers文件 一:切换到root用户 su roo ...

最新文章

  1. 浏览器事件监听的方法
  2. 力软 框架 转 mysql_快速web开发框架——learun framework
  3. QT多媒体 播放视频并显示字幕
  4. 汇编: dosbox命令
  5. java动态代理_Java 动态代理和依赖注入
  6. 七十五、栈+双指针,头条当年接雨水问题
  7. 计算机考研:计算机组成原理考点分析
  8. 均值滤波 中值滤波 高斯平滑滤波
  9. 给所有开发人员的 11 条忠告(第 4 条亮了)
  10. 抢那么多封面,有那么多钱发红包吗?
  11. html游戏代码_新手使用的Mac系统的简易代码编辑器推荐
  12. dsoframer.ocx java_dsoframer.ocx(java web 操作word) 总结一下
  13. 软件工程造价师和软件造价评估师有什么区别?
  14. BlockChain学习——Hash函数碰撞概率公式及其推导
  15. matlab求松弛迭代发,[求助]Matlab超松弛迭代法 高手帮忙看看
  16. 基于dotNET 5 MVC经典模式引入Swagger进行web api开发和管理发布OAS3标准接口文档全过程
  17. 用C++实现渊子赛马程序
  18. 海外自媒体多账号运营注意事项看这里!
  19. 分析谁是2020欧洲杯的最佳球员
  20. sinx/x的极限为什么是1_在sinx/x中当x→0时极限为什么为1?

热门文章

  1. 计算机专业自然辩证法期末论文,清华大学自然辩证法-期末论文.docx
  2. 笔记本电脑摄像头不能用_聊一款想代替笔记本电脑的产品
  3. Linux Shell中有三种引号的用法
  4. JS中的this好神奇,都把我弄晕了
  5. mysql自增id获取失败
  6. PHP扩展开发(3)-config.m4
  7. Ubuntu 查看默认软件安装位置
  8. android Activity 之间传递复杂对象
  9. Java程序练习-螺旋矩阵
  10. 如何在数据表中存取图片 - 回复 三足乌 的问题