一天一点学习Linux之特殊权限(SUID/SGID/SBIT)

2011年01月21日 Linux基础 评论 10 条 阅读 31,446 views 次

我们前面学习了Linux上最基本的权限rwx。如果细心的朋友,一定会发现,根目录下面的tmp这个目录的权限有点不同,他后面多了一个t,那么这个t是什么意思呢?这就是我们今天要讲的内容:特殊权限(SUID/SGID/SBIT)。
先来看看两个特殊的文件与目录
[root@yufei ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 26968 Jan 29  2010 /usr/bin/passwd
[root@yufei ~]# ls -l /usr/bin/wall
-r-xr-sr-x. 1 root tty 10932 Apr 27  2010 /usr/bin/wall
[root@yufei ~]# ls -ld /tmp/
drwxrwxrwt. 7 root root 4096 Jan 20 11:00 /tmp/

这一个passwd命令在所有者的地方多了一个s,第二个wall命令在用户组的位置多了一个s,第三个tmp目录,多了一个t。这是为什么呢?下面我们就来具体看看,这些特殊的权限是什么意思?如何设置?

特殊权限的介绍

Set UID

当s这个标志出现在文件所有者的x权限上时,如/usr/bin/passwd这个文件的权限状态:“-rwsr-xr-x.”,此时就被称为Set UID,简称为SUID。那么这个特殊权限的特殊性的作用是什么呢?
1、SUID权限仅对二进制程序(binary program)有效;
2、执行者对于该程序需要具有x的可执行权限;
3、本权限仅在执行该程序的过程中有效(run-time);
4、执行者将具有该程序拥有者(owner)的权限。
SUID的目的就是:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子,下面我们就来了解一下这相passwd执行的过程。
我们知道,系统中的用户密码是保存在/etc/shadow中的,而这个文件的权限是----------. (这个权限和以前版本的RHEL也有差别,以前的是-r--------)。其实有没有r权限不重要,因为我们的root用户是拥有最高的权限,什么都能干了。关键是要把密码写入到/etc/shadow中。我们知道,除了root用户能修改密码外,用户自己同样也能修改密码,为什么没有写入权限,还能修改密码,就是因为这个SUID功能。

下面就是passwd这个命令的执行过程
1、因为/usr/bin/passwd的权限对任何的用户都是可以执行的,所以系统中每个用户都可以执行此命令。
2、而/usr/bin/passwd这个文件的权限是属于root的。
3、当某个用户执行/usr/bin/passwd命令的时候,就拥有了root的权限了。
4、于是某个用户就可以借助root用户的权力,来修改了/etc/shadow文件了。
5、最后,把密码修改成功。

注:这个SUID只能运行在二进制的程序上(系统中的一些命令),不能用在脚本上(script),因为脚本还是把很多的程序集合到一起来执行,而不是脚本自身在执行。同样,这个SUID也不能放到目录上,放上也是无效的。

Set GID

我们前面讲过,当s这个标志出现在文件所有者的x权限上时,则就被称为Set UID。那么把这个s放到文件的所属用户组x位置上的话,就是SGID。如开头的/usr/bin/wall命令。
那么SGID的功能是什么呢?和SUID一样,只是SGID是获得该程序所属用户组的权限。
这相SGID有几点需要我们注意:
1、SGID对二进制程序有用;
2、程序执行者对于该程序来说,需具备x的权限;
3、SGID主要用在目录上;
理解了SUID,我想SGID也很容易理解。如果用户在此目录下具有w权限的话,若使用者在此目录下建立新文件,则新文件的群组与此目录的群组相同。

Sticky Bit

这个就是针对others来设置的了,和上面两个一样,只是功能不同而已。
SBIT(Sticky Bit)目前只针对目录有效,对于目录的作用是:当用户在该目录下建立文件或目录时,仅有自己与 root才有权力删除。
最具有代表的就是/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录建立者与 root能够删除自己的目录或文件。

注:这个SBIT对文件不起作用。

SUID/SGID/SBIT权限设置

和我们前面说的rwx差不多,也有两种方式,一种是以字符,一种是以数字。
4 为 SUID = u+s
2 为 SGID = g+s
1 为 SBIT = o+t
下面我们就来看看如何设置,并看看达到的效果。

先看SUID的作用及设置

[root@yufei ~]# cd /tmp/
[root@yufei tmp]# cp /usr/bin/passwd ./
[root@yufei tmp]# mkdir testdir

上面两步是在/tmp目录下创建passwd文件和testdir目录
下面看看这两个的权限
[root@yufei tmp]# ls -l passwd ; ls -ld testdir/
-rwxr-xr-x. 1 root root 26968 Jan 20 23:27 passwd
drwxr-xr-x. 2 root root 4096 Jan 20 19:25 testdir/

我们切换到yufei用户,然后修改自己的密码
[root@yufei tmp]# su yufei
[yufei@yufei tmp]$ ./passwd
Changing password for user yufei.
Changing password for yufei.
(current) UNIX password:
New password:            
Retype new password:
passwd: Authentication token manipulation error

发现上面的yufei改不了自己的密码,为什么呢?就是因为没有权限把密码写入到/etc/shadow中。想让普通用户能修改/etc/shadow的话,那就需要用到SUID了。
[yufei@yufei tmp]$ su root
Password:
[root@yufei tmp]# chmod u+s passwd
[root@yufei tmp]# ls -l passwd
-rwsr-xr-x. 1 root root 26968 Jan 20 23:27 passwd

看到有SUID权限了,下面再来修改yufei自己的密码
[yufei@yufei tmp]$ ./passwd
Changing password for user yufei.
Changing password for yufei.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

我们发现已经成功了。
我想这一下,你对SUID的作用已经了解了吧。
如果想把这个改回来(就是把SUID的权限去掉),我们用数字方式来设置
[root@yufei tmp]# chmod 0755 passwd
[root@yufei tmp]# ls -l passwd
-rwxr-xr-x. 1 root root 26968 Jan 20 23:27 passwd

OK这样就改过来了,这个数字的原理和我们前面讲的rwx是一样的,只是在最前面设置相应的数字而已。

注:在普通用户修改自己的密码是,密码要设置的复杂点,否则的话,通过不了认证,普通用户和root用户的权限是不同的。

再看SGID的作用及设置

我们以前面建立的/tmp/testdir为例子
[root@yufei tmp]# ls -ld testdir/
[root@yufei tmp]# chmod 757 testdir/
[root@yufei tmp]# ls -ld testdir/
drwxr-xrwx. 2 root root 4096 Jan 20 19:25 testdir/

这时候,任何用户对此目录都有写入权限,那么我们就在这个目录里面创建文件与目录,并看看他们的权限如何
[root@yufei tmp]# su yufei
[yufei@yufei tmp]$ touch testdir/file1
[yufei@yufei tmp]$ mkdir testdir/dir1
[yufei@yufei tmp]$ ls -l testdir
total 0
drw-rw-r--. 1 yufei yufei 0 Jan 21 10:33 dir1
-rw-rw-r--. 1 yufei yufei 0 Jan 21 10:33 file1

这时候的文件与目录权限都是创建者的本身
下面我们就来看看,把这个目录加上SGID权限后,再创建文件与目录,会是什么样的效果
[yufei@yufei tmp]$ su root
Password:
[root@yufei tmp]# chmod g+s testdir/
[root@yufei tmp]# ls -ld testdir/
drwxr-srwx. 2 root root 4096 Jan 21 10:33 testdir/
[root@yufei tmp]# su yufei
[yufei@yufei tmp]$ touch testdir/file2
[yufei@yufei tmp]$ mkdir testdir/dir2