Linux用户与“最小权限”原则

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

 

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位。

 

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

 

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

 

总结

real/effective/saved UID/GID

saved UID/GID bit

“最小权限”原则

 

欢迎阅读“骑着企鹅采树莓”系列文章

时间: 2024-11-05 14:55:58

Linux用户与“最小权限”原则的相关文章

服务器-linux samba对没有权限的用户隐藏该共享文件

问题描述 linux samba对没有权限的用户隐藏该共享文件 能否让客户端(XP)在访问samba服务器的时候看不到没有权限的文件夹:只有有权限的用户才能看到. 不是这个browseable = No 的效果哟 ,它是全部人都看不到,我要的效果是有权限的人看的到,没权限的人看不到 解决方案 可以用chmod 740 你的文件名 , root可读可写可执行,和你一个用户组的可以读,其他人不可读不可写也不可执行 解决方案二: 不能用root用户,只能是创建的普通用户

【Linux】Linux用户、用户组、文件权限学习笔记

原文地址:http://www.sourcejoy.com/other_dev_tech/linux-user-and-file-manage.html 作者:HaiHai 发布时间:August 12, 2010 分类:综合技术 最近打算更仔细学习一下linux操作系统.先是恶补了一下用户.用户组.文件权限这三样比较重要的知识. 学习这几样东西,得先掌握linux的权限系统相关知识. linux的权限系统主要是由用户.用户组和权限组成. 用户就是一个个的登录并使用linux的用户.linux内

用户-linux 属主的权限不能被回收 是怎么回事

问题描述 linux 属主的权限不能被回收 是怎么回事 我做数据库还原 ,但是备份完毕,我用备份的文件进行还原是提示属主的权限不能被回收,我当前文件的主用户是我新建的,为什么还原不了了,权限我都给了. 解决方案 直接chmod等来修改文件权限属性吧 解决方案二: 下次要注意这个问题,在备份文件的时候注意属主的变化,cp -p 命令可以保证属主不变.

Linux下的高级权限文件控制

在企业内网的开发环境方面,文件服务器是一个非常重要的环节.其中,Samba服务器由于其权限控制的高度灵活性,最初学习时确实会让大家感到很迷惑,但我们可以先搭建一些简单的案例来掌握其语法.本节主要是介绍Linux下的高级权限suid.sgid.sticky三种权限的特点. 很多人都很奇怪,为什么我们需要学习这三种权限呢?因为在实际工作中我们发现,如果不了解这些特殊权限会让我们对Linux权限的理解(尤其是加上Samba权限后)尤为困难,所以我们必须要学习并了解它们.下面试图用浅显的讲解,让大家能充

ubuntu下如何为普通用户赋予sudo权限

ununtu系统安装过程中,系统会提示建立一个默认用户,比如用户名为:zhuhui.这个默认用户具有一定的管理功能,即可以通过sudo命令执行root权限的操作.由于Ubuntu系统默认不允许通过root用户登录系所以这个默认用户即是实际意义上的管理员.但是要给新建的一个普通用户赋予sudo权限怎么操作呢? 1 修改/etc/sudoers文件,进入超级用户,因为没有写权限,所以要先把写权限加上chmod u+w /etc/sudoers. 2 编辑/etc/sudoers文件,找到这一 行:"

Linux用户与组的概念

一.用户与组的概念 1.理解linux多用户,多任务的特性 Linux是一个真实的.完整的多用户多任务操作系统,多用户多任务就是可以在系统上建立多个用户,而多个用户可以在同一时间内登录同一个系统执行各自不同的任务,而互不影响,例如某台linux服务器上有4个用户,分别是root.www.ftp和mysql,在同一时间内,root用户可能在查看系统日志,管理维护系统,www用户可能在修改自己的网页程序,ftp用户可能在上传软件到服务器,mysql用户可能在执行自己的SQL查询,每个用户互不干扰,有

一些Linux Shell中的权限相关知识总结

  这篇文章主要介绍了一些Linux Shell中的权限相关知识总结,使Linux入门学习中的基础知识,需要的朋友可以参考下 一个文件一经创建,就具有三种访问方式: 1) 读,可以显示该文件的内容. 2) 写,可以编辑或删除它. 3) 执行,如果该文件是一个s h e l l脚本或程序. 按照所针对的用户,文件的权限可分为三类: 1) 文件属主,创建该文件的用户. 2) 同组用户,拥有该文件的用户组中的任何用户. 3) 其他用户,即不属于拥有该文件的用户组的某一用户 文件的全部信息包括以下: 文

linux中使用root权限都删除不了的文件该怎办?

  在linux系统中,root用户拥有最高权限,可以干任何事情,但是有些时候,root用户却不能删除一个小小的一般文件.其实只要root用户更改下这个文件的属性,还是可以删除的. 1.首先删除一个文件,提示'Operation not permitter',普通用户不能删除; 2.把用户升级到root用户,然后在删除,然后提示'Operation not permitter',居然root用户都无法删除,这个不太科学啊; 3.原来是文件的属性在里面作怪,只要登录超级用户,查看下文件的属性都有哪

Linux用户空间与内核空间数据传递

转载 - Linux用户空间与内核空间数据传递 作者 digoal 日期 2016-11-20 标签 Linux , 用户空间 , 内核空间 , 用户态 , 内核态 , 进程上下文 , 中断上下文 背景 原文 http://wdqfirst.blog.163.com/blog/static/113347411201182222252954/ 原文 Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据