UNIX/Linux下关于文件执行权限的表示和查看想必是最熟悉不过的,然而你是否真正了解用户文件的权限标识和用户的权限呢?

  实际上文件权限标识不仅仅只有U, G, O

11 10 9 8 7 6 5 4 3 2 1 0
SUID GUID SBIT R W X(S/s) R W X(S/s) R W X(S/s)

  如上所示,linux中除了常见的读(r)、写(w)、执行(x)权限以外,还有3个特殊的权限,分别是setuid、setgid和stick bit

1、setuid、setgid

  先看个实例,查看你的/usr/bin/passwd 与/etc/passwd文件的权限

[root@MyLinux ~]# ls -l /usr/bin/passwd /etc/passwd
-rw-r--r-- root root - : /etc/passwd
-rwsr-xr-x root root -- /usr/bin/passwd

  众所周知,/etc/passwd文件存放的各个用户的账号与密码信息,/usr/bin/passwd是执行修改和查看此文件的程序,但从权限上看,/etc/passwd仅有root权限的写(w)权,可实际上每个用户都可以通过/usr/bin/passwd命令去修改这个文件,于是这里就涉及了linux里的特殊权限setuid,正如-rwsr-xr-x中的s

  setuid就是:让普通用户拥有可以执行“只有root权限才能执行”的特殊权限,

  setgid同理指”组“

  作为普通用户是没有权限修改/etc/passwd文件的,但给/usr/bin/passwd以setuid权限后,普通用户就可以通过执行passwd命令,临时的拥有root权限,去修改/etc/passwd文件了

2、stick bit (粘贴位)

  再看个实例,查看你的/tmp目录的权限

[root@MyLinux ~]# ls -dl /tmp
drwxrwxrwt root root - : /tmp

  tmp目录是所有用户共有的临时文件夹,所有用户都拥有读写权限,这就必然出现一个问题,A用户在/tmp里创建了文件a.file,此时B用户看了不爽,在/tmp里把它给删了(因为拥有读写权限),那肯定是不行的。实际上是不会发生这种情况,因为有特殊权限stick bit(粘贴位)权限,正如drwxrwxrwt中的最后一个t

  stick bit (粘贴位)就是:除非目录的属主和root用户有权限删除它,除此之外其它用户不能删除和修改这个目录。

  也就是说,在/tmp目录中,只有文件的拥有者和root才能对其进行修改和删除,其他用户则不行,避免了上面所说的问题产生。用途一般是把一个文件夹的的权限都打开,然后来共享文件,象/tmp目录一样。

3、如何设置以上特殊权限
  setuid:chmod u+s xxx      chmod 4***  xxx

  setgid: chmod g+s xxx      chmod 2***  xxx

  stick bit : chmod o+t xxx          chmod 1***  xxx

  或者使用八进制方式,在原先的数字前加一个数字,三个权限所代表的进制数与一般权限的方式类似,如下:

  suid   guid   stick bit

  1     1     1

  最后,在一些文件设置了特殊权限后,字母不是小写的s或者t,而是大写的S和T,那代表此文件的特殊权限没有生效,是因为你尚未给它对应用户的x权限


  以上介绍了文件的权限和uid gid等概念,也许又会有疑问,用户的uid,gid 和上述uid ,gid是同一概念吗? 他们之间有什么联系吗?

  1、当我们创建用户时,由我们为新建用户命名和设置密码,同时系统会为我们所创建的用户名关联一个ID,就是所谓的用户uid。同时我们还可以把这个用户放到某个用户群里,类似的,用户群也可以我们手工建立。如果建立用户时,不指明所建的用户属于哪个用户群,则系统会自动建立一个跟用户名同名的用户群。不管手工建立还是自动建立,系统都会为用户群关联一个号,这个号称之为gid。用户uid所属的群的gid就是用户的gid。

  2、系统在运行每个进程时都会关联几个ID,分别为pid、ppid、uid、euid。

  进程的pid为运行进程时,系统自动分配的,用于唯一标识此进程的一个整数。

  进程的ppid就是进程的父进程的pid。

  同时,系统还会为运行的进程分配一个进程uid和进程euid,用于判断文件的执行权限。

  一般情况下,进程uid和进程euid等于运行这个进程的用户uid。

  对于某文件,它的执行权限分成三组: 文件拥有者权限、文件拥有者同组权限、其他用户权限。

  当在某个用户A下执行该文件,该文件所在的进程 uid 就是A用户的uid;而euid则需要根据该文件的suid标识位和文件拥有者用户来决定。也就是说,如果suid设置为 "s",那么euid就是文件拥有者用户的uid;这样euid可以设置进程拥有拥有什么级别的执行权限。

  简单来讲,如果可执行文件的setuid位无效,则运行这个可执行文件时,进程uid和euid都是用户的uid; 

  如果可执行文件的setuid位有效,则运行这个可执行文件时,进程uid还是用户的uid,而进程euid则会暂时被修改成该可执行文件的所有者用户uid,直到该进程结束。

  一句话,在某个进程中,进程pid和ppid是唯一标识该进程的,它不会改变,而进程uid与运行该进程的用户uid相同,进程euid则与uid相同,只有运行设置了setuid位的文件时才会把euid改为这个文件的所有者用户uid。

  同理,进程gid和进程egid则类似。

 在shell中执行ls -l命令,则会显示如下:

  drwxr-xr-x 2 root root 652 Jul 31 2006 /root/hello
  d表示文件,后面几个表示文件所有者、同组用户、其他用户的执行权限,文件数量,文件所有者,文件创建者(注意,RHEL这项是文件所有群),文件大小,日期,文件所在路径
  du -sh xxx可以测量xxx文件或目录所占内存大小。


  内核会给每个进程关联两个和进程ID无关的用户ID,一个是真实用户ID(RUID real uid){用户区},还有一个是有效用户ID(EUID effetive uid) --{ 内核进程表中(SUID), 用户区(EUID) }。

  真实用户ID用于标识由谁为正在运行的进程负责。

  有效用户ID用于为新创建的文件分配所有权、检查文件访问许可,还用于通过kill系统调用向其 它进程发送信号时的许可检查。

  内核允许一个进程以exec调用一个setuid程序或者显式执行setuid系统调用的方式改变它的有效用户ID。 所谓setuid程序是指一个设置了许可模式字段中的setuid bit的可执行文件。当一个进程exec一个setuid程序的时候,内核会把进程表以及用户区中的有效用户ID设置成该文件所有者的ID。为了区分这两个字段,我们把进程表中的那个字段称作保存用户ID(SUID saved uid)。可以通过一个例子来演示这两个字段的区别。

  setuid系统调用的语法是 setuid(uid) ,其中,uid是新的用户ID,该系统调用的结果取决于有效用户ID的当前值。

  如果调用进程的有效用户ID是超级用户,内核会把进程表以及用户区中的真实和有效用户ID都设置成uid。

  如果调用进程的有效用户ID不是超级用户,仅当uid等于真实用户ID或保存用户ID时,内核才会把u区中的有效用户ID设置成uid。

  否则,该系统调用将返回错误。

  一般来说,一个进程会在fork系统调用期间从父进程那儿继承它的真实和有效用户ID,这些数值即使经过 exec系统调用也会保持不变。 存储在用户区中的有效用户ID是最近一次setuid系统调用或是exec一个setuid程序的结果;只有它会被用于文件访问许可(euid)。进程表中的保存用户 ID使得一个进程可以通过执行setuid系统调用把有效用户ID设置成它的值,以此来恢复最初的有效用户ID。

  非root用户是不可能通过setuid或者seteuid取得其他权限(包括root权限)的,它只能恢复原来的权限。允许通过setuid或者seteuid取得root权限是非常危险的,这样他就可以在程序的后边做任何想做的事了(包括kill掉你的系统)。只能通过exec一个设置了setuid位的可执行程序,来取得其他(程序文件所有者)权限(包括root权限)

例如用户执行su即可获得root权限(su的属主为root)。

  -rwsr-xr-x 1 root root 27108 2008-11-23 /bin/su

  注意其中的s,该标志即为setuid标志(文件除基本的r、w、x权限外,还有s)。出于安全,防止普通用户取得root权限后威胁系统安全,该权限只针对不可更改的可执行文件(不能执行自定义程序)。

  要想取得root权限就必须exec一个root所有的可执行文件(当然首先得有执行权限),而该程序由root所有,其安全就由root负责。所以非root用户就不可能以root身份运行属于root以外的程序。至于sudo之类的,是因为sudo本身里有setuid和exec调用(root用户允许的,给非root用户开了一个后门),通过sudo取得root权限,作为中介来exec所有程序。但也有限制,就是该用户是sudoers(后门的钥匙,root的亲戚才有,又是安全)!(现在流行靠关系、开后门,到时如果出问题,就该抱怨了:都是开后门惹的祸!)

  su=super user
  sudo是什么的缩写?super user ? ?(应为swicth user)

  还有非root权限用户,不能改变实际用户ID,而只能改变有效用户ID,包括通过exec一个setuid程序。
  只有root用户进程才能更改实际用户ID。这样普通用户进程就不能通过改变实际用户ID,然后再通过setuid,设置有效用户ID为实际用户ID,进而取得与该实际用户ID对应的权限了(包括root)。正如上面说过的:允许通过setuid或者seteuid取得root权限是非常危险的。

  对于文件访问权限的验证是根据有效用户ID。有些文件只有root用户才有读写或者执行的权力,对于这些文件,普通用户程序就需要以root权限(进程的有效用户ID为0)来访问。

参考:

[1]. Linux中的文件特殊权限    http://www.cnblogs.com/huangzhen/archive/2011/08/22/2149300.html

[2]. 进程pid和ppid、进程的uid和euid、用户的uid和gid、文件的创建者和所有者的关系辨析. http://blog.csdn.net/tianyahaijiaozd/article/details/6275006

[3].  setuid函数. http://blog.csdn.net/todd911/article/details/7738069

linux文件权限表示及用户权限管理的更多相关文章

  1. Linux命令(19)用户权限管理:chown

    linux用户权限: Linux/Unix 是多人多工作业系统,所有的档案皆有拥有者.利用 chown 可以将档案的拥有者加以改变. 一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者 ...

  2. 如何更改linux文件的拥有者及用户…

    本文整理自: http://blog.163.com/yanenshun@126/blog/static/128388169201203011157308/ http://ydlmlh.iteye.c ...

  3. 阶段5 3.微服务项目【学成在线】_day18 用户授权_09-动态查询用户的权限-认证服务查询用户权限

    认证服务查询用户权限 如果权限为空就New一个对象出来. 因为如果为空的话 下面 forEach就会报空指针的异常 启动服务测试 重新登陆 看到userExt已经获取到了用户的权限 权限的字符串 复制 ...

  4. linux 使用sudo开放普通用户权限

    整理一下以前写的东东,刚才又忘了- ---------------------------------------------------------------------------------- ...

  5. Linux文件与目录的默认权限与隐藏权限 - umask, chattr, lsattr, SUID, SGID, SBIT, file

    文件默认权限:umask [root@www ~]# umask 0022 <==与一般权限有关的是后面三个数字! [root@www ~]# umask -S u=rwx,g=rx,o=rx ...

  6. 【用户权限】MongoDB用户权限

    一.数据库用户角色: read:允许用户读取指定数据库readWrite:允许用户读写指定数据库 二.数据库管理角色:dbAdmin.dbOwner.userAdmin: dbAdmin:允许用户在指 ...

  7. linux 文件夹说明,用户添加删除,不熟悉的命令

    一.Linux 根目录下的文件夹说明 usr 程序默认安装路径,相当于windows的 program 附显示当前所处位置:pwd 二.用户 用户添加:useradd 用户名 passwd 用户名 u ...

  8. 『学了就忘』Linux文件系统管理 — 58、常用硬盘管理相关命令

    目录 1.df命令 2.du命令 3.fsck文件系统修复命令 4.显示磁盘状态dumpe2fs 5.查看文件的详细时间 6.判断文件类型 1.df命令 df命令用于统计分区的占用状况. [root@ ...

  9. 【linux之文件查看,操作,权限管理】

    一.shell如何处理命令 1.shell会根据在命令中出现的空格字符,将命令划分为多个部分 2.判断第一个字段是内部命令还是外部命令 内部命令:内置于shell的命令(shell builtin) ...

随机推荐

  1. SharePoint 2016 Beta 2 使用体验

    博客地址:http://blog.csdn.net/FoxDave 上一篇主要描述了安装SharePoint 2016的过程,本篇写一些概览性的东西. 首先打开管理中心(依然是在安装完会有Issue ...

  2. hive的Query和Insert,Group by,Aggregations(聚合)操作

    1.Query (1)分区查询 在查询的过程中,采用那个分区来查询是通过系统自动的决定,但是必须是在分区列上基于where子查询. SELECT page_views.* FROM page_view ...

  3. 团队开发——冲刺2.c

    冲刺阶段二(第三天) 1.昨天做了什么? 把“开始游戏”.“退出游戏”.“取消”等文字按钮加工成游戏图标,美化游戏界面背景. 2.今天准备做什么? 因为收集的图标时比较杂乱,没有针对性,把游戏图标进行 ...

  4. OD调试篇7--笔记及解题报告

    MFC:微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows AP ...

  5. Oracle数据库3

    在前两章,我们学习了SQL语言中基本的一些查询语句,也就是数据库查询语言DQL,今天我们要介绍的数据库操作语言DML 数据库中,我们除了查询之外,最主要的就是日常的增.删.改.查了. 数据库操作语言 ...

  6. js 实现继承相关

    ☊ [要求]:实现一个Animal类, 和一个继承它的Dog类 ☛ [实现]: function Animal(name) { this.name = name; } Animal.prototype ...

  7. jq 一些小方法

    js 控制a标签的onclick方法 document.getElementById("a3").onclick = ""; window.document.g ...

  8. uget和aria2

    http://blog.csdn.net/luojiming1990/article/details/9078447 其中的aria2 -v要改成aria2c -v

  9. 认识web前端

    对于一个只是浅尝辄止c语言.学过汇编语言的我,思考了半年终于在这一天入了坑,学习web前端. web前端,看着这个名字好高大上,其实我目前的理解就是写页面,是各种图片动画文字在一个页面上呈现,再一点能 ...

  10. C#的输入、输出与运算符、数据类型

    (1)Visual Studio.NET起始页 启动Visual Studio.NET后,首先看到一个如下图所示的起始页.在起始页可以打开已有的项目或建立新的项目. (2)新建Visual1C# .n ...