Linux 权限管理之二:setuid、setgid 和 sticky bit

Linux 下的文件和文件夹除了拥有 rwx 这三种基本权限以外,还可能有三种特殊的权限:setuid(SUID)、setgid(SGID)和sticky bit(SBIT),其具体描述如下:

setuid(SUID)

首先要强调,SUID 仅对二进制程序文件有效。

当一个二进制程序设有 SUID 时,其权限显示如下(以 /bin/passwd 为例):

[admin@localhost ~]$ ll /bin/passwd
-rwsr-xr-x. 1 root root 27864 Aug 18  2014 /bin/passwd

owner 的 x 权限位是一个小写字母 s,那么 SUID 能够起到什么作用呢?

简单点说就是:如果一个程序设有 SUID,当程序所有者以外的用户有这个程序的 x 权限时,他执行这个程序时就暂时的拥有这个程序所有者的权限。听不懂?我们来看一个测试程序:

//test.c
#include<stdio.h>

int main()
{
    FILE *fp;
    fp = fopen("tmp", "w"); //在当前目录建立名为 tmp 的文件,这需要对该文件夹的 w 权限
    fclose(fp);

    return 0;
}

这个程序执行时会在当前文件夹下建立一个名为“tmp“的文件,这当然需要对当前文件夹的 w 权限。我们将 test.c 编译连接,得到a.out二进制可执行文件,然后建立一个 test 用户,这个用户不属于 admin 用户组,因此没有对当前目录的 w 权限,先使用 admin 用户测试:

[admin@localhost test]$ ll -d
drwxrwxr-x. 2 admin admin 80 May 30 22:49 . #当前目录的权限设置
[admin@localhost test]$ ll
total 16
-rwxrwxr-x. 1 admin admin 8608 May 30 22:24 a.out
-rw-rw-r--. 1 admin admin  187 May 30 22:24 test.c
[admin@localhost test]$ ./a.out #执行a.out
[admin@localhost test]$ ll
total 16
-rwxrwxr-x. 1 admin admin 8608 May 30 22:24 a.out
-rw-rw-r--. 1 admin admin  187 May 30 22:24 test.c
-rw-rw-r--. 1 admin admin    0 May 30 22:50 tmp #生成了 tmp 文件

然后删除 tmp 文件,使用 test 用户运行该程序:

[admin@localhost test]$ rm -f tmp #删除 tmp 文件
[admin@localhost test]$ ll
total 16
-rwxrwxr-x. 1 admin admin 8608 May 30 22:24 a.out
-rw-rw-r--. 1 admin admin  187 May 30 22:24 test.c
[admin@localhost test]$ su -- test #登录 test 用户
Password:
[test@localhost test]$ ./a.out #运行 a.out
Segmentation fault (core dumped) #运行时出错
[test@localhost test]$ ll
total 16
-rwxrwxr-x. 1 admin admin 8608 May 30 22:24 a.out
-rw-rw-r--. 1 admin admin  187 May 30 22:24 test.c #并未生成 tmp 文件

test 用户虽然拥有对 a.out 的 x 权限,但要想执行成功这个程序,生成 tmp 文件是需要对当前文件夹的 w 权限的。由于 test 用户并没有对当前文件夹的 w 权限,所以运行程序时会出错。

如果对 a.out 设置了 SUID 呢?测试如下:

[test@localhost test]$ exit #登出 test 用户,使用 admin 用户
exit
[admin@localhost test]$ chmod u+s a.out #为 a.out 设置 SUID
[admin@localhost test]$ ll
total 16
-rwsrwxr-x. 1 admin admin 8608 May 30 22:24 a.out #设置成功
-rw-rw-r--. 1 admin admin  187 May 30 22:24 test.c
[admin@localhost test]$ su -- test #使用 test 用户登录
Password:
[test@localhost test]$ ./a.out #执行 a.out
#无出错信息
[test@localhost test]$ ll
total 16
-rwsrwxr-x. 1 admin admin 8608 May 30 22:24 a.out
-rw-rw-r--. 1 admin admin  187 May 30 22:24 test.c
-rw-rw-r--. 1 admin test     0 May 30 23:00 tmp #成功生成 tmp 文件

哈哈,这次成功了,因为 a.out 设置了SUID,当 test 执行这个程序时是拥有 admin 所拥有的权限的,也就是拥有对当前文件夹的 w 权限,所以才成功生成了 tmp 文件。不信你把 admin 对当前目录的 w 权限拿掉,试试还能不能生成 tmp 文件。

你每次修改你密码时,都和这个 SUID 有很大关系,因为普通用户是没有权限修改 shadow 文件的,但是由于 passwd 设置有 SUID,所以普通用户都能执行 passwd 间接修改 shadow 文件,进而达到修改密码的目的。

setgid(SGID)

二进制文件或文件夹设有 SGID 时,权限如下(以我自己创建的 test 文件夹为例):

[admin@localhost test]$ ll -d
drwxrwsr-x. 2 admin admin 40 May 30 23:41 .

group 的 x 权限位是一个小写字母 s。

SGID 对二进制程序和文件夹有效,当二进制程序设有 SGID 时,和设有 SUID 相似,只是普通用户执行程序时,临时地获得了程序所属用户组的权限,而不是所属用户的权限,在此不再验证。

当文件夹设有 SGID 权限时,那么如果文件夹所有组以外的用户拥有对该文件夹的 w 权限时,如果用户在该文件夹建立一个新文件,这个新文件的所有组为文件夹所有组:

[admin@localhost test]$ ll -d
drwxrwxrwx. 2 admin admin 40 May 30 23:41 . #初始无 SGID
[admin@localhost test]$ su -- test
Password:
[test@localhost test]$ touch testdoc #test用户建立一个新文件
[test@localhost test]$ ll
total 0
-rw-rw-r--. 1 test test 0 May 30 23:47 testdoc #新文件所有组为 test 所属组
[test@localhost test]$ exit
exit
[admin@localhost test]$ chmod g+s . #设置 SGID
[admin@localhost test]$ ll -d
drwxrwsrwx. 2 admin admin 60 May 30 23:47 .
[admin@localhost test]$ su -- test
Password:
[test@localhost test]$ touch newtestdoc # test 用户建立一个新文件
[test@localhost test]$ ll
total 0
-rw-rw-r--. 1 test admin 0 May 30 23:48 newtestdoc #新文件所有组为 admin
-rw-rw-r--. 1 test test  0 May 30 23:47 testdoc

SGID 在小组协作时起到了重要的作用。

sticky bit(SBIT)

SBIT 只对文件夹有效。

/tmp文件夹就是一个设有 SBIT 的例子:

drwxrwxrwt.  16 root root   400 May 30 23:59 tmp

others 的 x 位是一个小写字母t,SBIT 又能起到什么作用呢?

当一个文件夹设有 SBIT 时,如果一个用户有权限在该文件夹下新建文件(夹),那么新建的文件(夹)只有该用户和 root 能够进行删除、重命名、移动操作,而其他用户不能进行该操作,即使其他用户拥有对该目录的 w 权限:

[admin@localhost tmp]$ touch admindoc # admin 用户创建一个新文件
[admin@localhost tmp]$ chmod 777 admindoc #设置新文件权限
[admin@localhost tmp]$ su -- test #使用 test 用户登录
Password:
[test@localhost tmp]$ ll -d
drwxrwxrwt. 16 root root 400 May 31 00:09 . #当前目录的权限设置,test 用户拥有 w 权限
[test@localhost tmp]$ ll admindoc #文件的权限设置
-rwxrwxrwx. 1 admin admin 0 May 31 00:09 admindoc
[test@localhost tmp]$ mv admindoc testdoc
mv: cannot move ‘admindoc’ to ‘testdoc’: Operation not permitted #无权限
[test@localhost tmp]$ rm admindoc
rm: cannot remove ‘admindoc’: Operation not permitted #无权限

以上即为我对 setuid(SUID)、setgid(SGID)和sticky bit(SBIT)的理解。

(setuid 和 setgid 实际上可以从进程权限的角度分析)

时间: 2024-10-08 10:34:31

Linux 权限管理之二:setuid、setgid 和 sticky bit的相关文章

[Linux 004]——用户和用户组以及 Linux 权限管理(二)

到权限了.前面讲到了 Linux 中的用户和用户主管理,其实它们的本质(或者用户和用户组出现的初衷)都是方便权限管理.权限管理对于计算机的重要性不言而喻,权限让每个用户能够安安心心的使用计算机,而不用担心别的用户破坏到自己的资源.如果老王手里有一把你家的钥匙,你是不是很蛋疼呢,如果邻居除了老王,还有老赵,老李,老张...都有你家的钥匙,你是不是更加蛋疼呢.作为多用户的 Linux 而言,权限管理至关重要. 1.Linux 文件权限的规定 前文提到,Linux 规定一个文件必须要有三种权限:文件所

Linux权限管理及用户与用户组

第一部分:Linux权限管理 一.基本权限 linux权限机制采用UGO模式.其中 u(user)表示所属用户.g(group)表示所属组.o(other)表示除了所属用户.所属组之外的情况. u.g.o 都有读(read).写(write).执行(excute) 三个权限,所以UGO模式是三类九种基本权限. 用命令 ls -l 可列出文件的权限,第一列输出明确了后面的输出(后面一列代表 ugo权限).第一个字母对应的关系: "-"    普通文件 "d"   目录

Linux权限管理---特殊权限

目录 Linux权限管理---特殊权限 一.Linux系统特殊权限概述 二.特殊权限suid介绍 三.特殊权限sgid介绍 四.特殊权限sbit介绍 五.特殊权限总结: 六.linux权限属性chattr概述 七.Linux进程掩码umask Linux权限管理---特殊权限 一.Linux系统特殊权限概述 除了r(读). w(写). x(执行)这三种普通权限外,在查询系统文件权限时会发现还有其他的权限字母. 例如: [[email protected] ~]# ll /usr/bin/pass

linux权限管理总结

文件或目录的权限 目录和文件拥有:读r.写w.执行x权限. // 使用 ls -l命令查看当前目录的文件权限信息 #ll -rw-r--r-- 1 root root 161 Mar 20 20:39 test.txt // test文件所有者拥有读写权限.所属组和其他用户拥有读权限 drw-r--r-- 1 root root 248 Mar 23 21:03 download 权限对文件的作用 r :读取文件内容(cat.more.head.tail) w:编辑.新增.修改文件内容(vi.e

Linux权限管理(用户、组、文件管理)

一. Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. 1. 文件查看类命令cat,tac, head, tail, more, less, ls ,file: -ls : list,列出指定目录下的内容 使用语法:ls [option]- [file]- 参数:-a 显示所有文件,包括隐藏文件: -A 显示除.和..之外的所有文件: -l –long,长葛市列表,即显示文件的详细属性信息: 例:-rw-r--r--. 1 root   root     8957 10月

【Linux】 Linux权限管理与特殊权限

Linux权限管理 权限管理这方面,非常清楚地记得刚开始实习那会儿是仔细研究过的,不知道为什么没有笔记留痕..除了一些基本的知识点早就忘光了,无奈只好从头开始学习一遍.. ■ 基本权限知识 这部分实在是比较基础,不想多讲了.主要就是9格权限的理解.搞清楚读权限.写权限和执行权限对于文件和目录来说分别以为着什么,就可以了.下面是一些以前没怎么注意,今天听完培训之后觉得有些意思的点: ●  管理权限的权限 文件权限信息和其他文件信息一样,并不属于文件内容的一部分,而基本的权限是针对文件内容而言的.比

Linux基础知识之用户和用户组以及 Linux 权限管理

已经开始接触Linux用户管理,用户组管理,以及权限管理这几个逼格满满的关键字.这几个关键字对于前端程序猿的我来说真的是很高大上有木有,以前尝试学 Linux 的时候看到这些名词总是下意识的跳过不敢看有木有,一提起这几个名词马上脑海中总是升腾起无限的崇拜有木有!今天就硬着头皮捯饬捯饬这几个概念,希望能有所收获. 1.从 /etc/passwd 说起 前面的基本命令学习中,我们介绍了使用 passwd 命令可以修改用户密码.对于操作系统来说,用户名和密码是存放在哪里的呢?我们都知道一个站点的用户名

Linux用户权限管理(二)

今天继续讲下用户权限管理,上一章节讲述了用户和组的创建.修改和删除.这篇文章延续上篇文章,来讲述用户具体的权限管理. 首先我们来讲下权限的相关说明:权限分为读(r).写(w).执行(x).对于文件和目录,其权限对应的功能不尽相同. 文件权限: 读(r):查看文件类似cat的权限 写(w):对文件有编辑和删除权限. 执行(x):具有文件执行权限,可以将文件当作命令提交给内核运行 目录权限: 读(r):对目录下的文件只有ls查看权限(不能使用ls -l) 写(w):可以在目录下创建文件 执行(x):

Linux用户、组和权限管理(二)

上一篇将一些用户和组管理命令写完,接下来是权限管理 权限管理: 每一个目录或文件都有相应的权限位来限制用户是否有权限可以"使用" 进程安全上下文: 进程对文件的访问权限应用模型: 进程的属主与文件的属主是否相同:如果相同,则应用属主权限: 否则,则检查进程的属主是否属于文件的属组:如果是,则应用属组权限: 否则,就只能应用other的权限: 解:当某一个用户访问文件时,会判断用户是否属于文件属主.属组.其它人:依次进行判断,对应某个权限位时,则使用其权限. 首先看一下文件权限位对应的意