SUID, SGID, SBIT

 

基本上SUID有这样的限制与功能shell

    SUID权限仅对二进位程序(binaryprogram)有效,不能用在shellscript上面;api

    运行者对於该程序须要具备x的可运行权限;安全

    本权限仅在运行该程序的过程当中有效(run-time);测试

    运行者将具备该程序拥有者(owner)的权限。ui

    这里举个栗子。Linux系统中默认的被赋予suid权限的文件是passwd。spa

    root@VMS001:~#ll/usr/bin/passwdcode

    -rwsr-xr-x1rootroot42824Sep132012/usr/bin/passwd*token

    passwd的拥有者是root用户。假定有某个用户叫hackstoic,他要修改本身的密码,即执行passwd命令,这时候hackstoic就会被临时赋予root的权限来执行passwd命令文件,passwd就会去修改/etc/shadow文件中对应的记录,从而修改用户本身的密码。这就解释了为何能够执行passwd命令的原因。ip

    可是你能够会问,既然我能够临时得到root的权限,我为何不能使用passwd命令来修改别人的密码呢?开发

    这是由于passwd在修改密码以前会查看当前用户是否匹配要修改的用户,不然就不会往下执行。

    会显示“您不能查看或更改xxx的密码信息。”之类的提示。这个提示是passwd修改密码以前的判断,而不是在修改shadow的时候系统提示的权限不足。这就解释了为何普通用户不能修改他人的密码的缘由。

 

 

 

 

 

 

 

 

SUID/SGID/SBIT权限设置

 

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

先看SUID的做用及设置

[root@japie ~]# cd /tmp/
[root@ japie tmp]# cp /usr/bin/passwd ./
[root@ japie tmp]# mkdir testdir 
上面两步是在/tmp目录下建立passwd文件和testdir目录
下面看看这两个的权限
[root@ japie 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@ japie tmp]# su yufei
[yufei@ japie i tmp]$ ./passwd
Changing password for user japie .
Changing password for yufei.
(current) UNIX password:
New password:            
Retype new password:
passwd: Authentication token manipulation error 
发现上面的yufei改不了本身的密码,为何呢?就是由于没有权限把密码写入到/etc/shadow中。想让普通用户能修改/etc/shadow的话,那就须要用到SUID了。

 

 

 [yufei@ japie tmp]$ su root

Password:
[root@  japie  tmp]# chmod u+s passwd
[root@  japie  tmp]# ls -l passwd
-rwsr-xr-x. 1 root root 26968 Jan 20 23:27 passwd 
看到有SUID权限了,下面再来修改yufei本身的密码
[yufei@  japie  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的权限去掉),咱们用数字方式来设置
[root@ japie tmp]# chmod 0755 passwd
[root@ japie tmp]# ls -l passwd
-rwxr-xr-x. 1 root root 26968 Jan 20 23:27 passwd 
OK这样就改过来了,这个数字的原理和咱们前面讲的rwx是同样的,只是在最前面设置相应的数字而已。

 

注:在普通用户修改本身的密码是,密码要设置的复杂点,不然的话,经过不了认证,普通用户和root用户的权限是不一样的。

 

 

再看SGID的做用及设置

咱们之前面创建的/tmp/testdir为例子
[root@ japie tmp]# ls -ld testdir/
[root@ japie tmp]# chmod 757 testdir/
[root@ japie tmp]# ls -ld testdir/
drwxr-xrwx. 2 root root 4096 Jan 20 19:25 testdir/ 
这时候,任何用户对此目录都有写入权限,那么咱们就在这个目录里面建立文件与目录,并看看他们的权限如何
[root@ japie tmp]# su japie 
[yufei@ japie tmp]$ touch testdir/file1
[yufei@ japie tmp]$ mkdir testdir/dir1
[yufei@ japie tmp]$ ls -l testdir
total 0
drw-rw-r--. 1 japie japie 0 Jan 21 10:33 dir1
-rw-rw-r--. 1 japie japie 0 Jan 21 10:33 file1 
这时候的文件与目录权限都是建立者的自己
下面咱们就来看看,把这个目录加上SGID权限后,再建立文件与目录,会是什么样的效果
[ japie @ japie tmp]$ su root
Password:
[root@ japie tmp]# chmod g+s testdir/
[root@ japie tmp]# ls -ld testdir/
drwxr-srwx. 2 root root 4096 Jan 21 10:33 testdir/
[root@ japie tmp]# su yufei
[yufei@ japie tmp]$ touch testdir/file2
[yufei@ japie tmp]$ mkdir testdir/dir2
[yufei@ japie tmp]$ ls -l testdir/
total 0
drw-rw-r--. 1 japie japie 0 Jan 21 10:33 dir1
drw-rw-r--. 1 japie root  0 Jan 21 10:36 dir2
-rw-rw-r--. 1 japie i japie 0 Jan 21 10:33 file1
-rw-rw-r--. 1 japie root  0 Jan 21 10:35 file2
[yufei@ japie tmp]$ ls -ld testdir/
drwxr-srwx. 2 root root 4096 Jan 21 10:36 testdir/ 
这时候咱们就发现,file2和dir2的用户组变成了root了,也就是他们上层目录testdir这个目录的所属用户组。
这个应用,应用在一个项目的共同开发上,是很方便的。
[yufei@ japie tmp]$ su root
Password:
[root@ japie tmp]# chmod g-s testdir/
[yufei@ japie tmp]$ ls -ld testdir/
drwxr-xrwx. 2 root root 4096 Jan 21 10:36 testdir/ 
这样就还原了

 

 

 

 

最后咱们来看SBIT的做用及设置

[root@ japie tmp]# rm -fr testdir/*
[root@ japie tmp]# ls -ld testdir/
drwxr-xrwx. 2 root root 4096 Jan 21 11:42 testdir/ 
清空/tmp/testdir/目录里面的所有内容。
咱们切换成普通用户,而后再里面建立文件,至少须要两个普通用户来测试这个,若是没有的话,就本身创建。
[root@ japie tmp]# su japie 
[yufei@ japie tmp]$ touch testdir/ japie _file
[yufei@ japie i tmp]$ ls -l testdir/
total 0
-rw-rw-r-- 1 japie japie 0 Jan 21 11:45 japie _file 
这时候咱们创建了一个文件,咱们换成另一个用户
[yufei@ japie tmp]$ su opsers
Password:
[opsers@ japie tmp]$ ls -ld testdir/
drwxr-xrwx. 2 root root 4096 Jan 21 11:45 testdir/ 
咱们看到,虽然其余用户对yufei_file只有只读权限,但因为japie _file所在的目录,对其余人是所有的权限,因此,咱们换其余用户仍是能够删除这个文件的,看操做
[opsers@ japie tmp]$ rm -f testdir/ japie _file
[opsers@ japie tmp]$ ls testdir/ 
发现咱们已经删除了这个不属于咱们的权限。
下面咱们就给这个目录加上SBIT权限,再来看看效果
[opsers@ japie tmp]$ su root
Password:
[root@ japie tmp]# chmod o+t testdir
[root@ japie tmp]# ls -ld testdir/
drwxr-xrwt. 2 root root 4096 Jan 21 11:49 testdir/ 
再一次切换普通用户,建立文件
[root@ japie tmp]# su japie 
[yufei@ japie tmp]$ touch testdir/ japie _file
[yufei@ japie tmp]$ ls -l testdir/ japie _file
-rw-rw-r-- 1 japie japie 0 Jan 21 11:51 testdir/ japie _file 
这个文件的权限仍是和第一次建立的时候是同样的,咱们再换成其余的用户,看看能不能再次删除这个文件
[yufei@ japie tmp]$ su opsers
Password:
[opsers@ japie tmp]$ rm -f testdir/ japie _file
rm: cannot remove `testdir/ japie _file': Operation not permitted 
看到提示,说权限不够了,只能由这个文件的建立者或root用户才能删除。这个咱们就不演示了。
若是要还原权限的话,
[opsers@ japie tmp]$ su root
Password:
[root@ japie tmp]# chmod o-t testdir
[root@ japie tmp]# ls -ld testdir/
drwxr-xrwx. 2 root root 4096 Jan 21 11:51 testdir/

两个须要注意的问题

OK,关于SUID/SGID/SBIT这些特殊权限的应用和做用咱们已经讲完了。但若是你仔细一点的话,会发现,我并无用数字方式来更改这个特殊的权限,为何呢?且看下面的分析。

问题1:用数字改变目录的特殊权限,不起做用。

咱们把/tmp/下面,咱们本身创建的实验文件删除
[root@ japie tmp]# rm -fr testdir/
[root@ japie tmp]# rm -fr passwd 
而后再从新建立一个文件和目录,
[root@ japie tmp]# cp /usr/bin/passwd ./
[root@ japie tmp]# mkdir testdir
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rwxr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-xr-x 2 root root 4096 Jan 21 12:00 testdir/ 
下面咱们就来用数字方式来更改这三个特殊的权限,看看会有什么样的结果
[root@yufei tmp]# chmod 4755 passwd
[root@yufei tmp]# chmod 3755 testdir/
[root@yufei tmp]# ls -l passwd ;ls -ld testdir/
-rwsr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-x 2 root root 4096 Jan 21 12:00 testdir/ 
发现用这种方式增长这三个特殊权限没有问题,那么咱们再把权限改回去看看
[root@ japie tmp]# chmod 0755 passwd
[root@ japie tmp]# chmod 0755 testdir/
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rwxr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-x 2 root root 4096 Jan 21 12:00 testdir/ 
咱们发现,对文件,权限是改回去了,而对于目录,只改回去了SBIT的权限,对SUID和SGID改不回去。这是RHEL6上的实验结果,多是出于安全性的考虑吗?这个我就不清楚了,也找不到相关的资料。若是各位网友,有知道什么缘由的,欢迎与我联系。在此先谢过了。
因此说,建议你们仍是用最明了的方式,直接用+-来更改,不管方法如何,最终能获得结果就OK了。哈哈……

问题2:为何会有大写的S和T。

仍是用上面的文件和目录
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rwxr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-x 2 root root 4096 Jan 21 12:00 testdir/ 
咱们把passwd和testdir的x权限去掉
[root@ japie tmp]# chmod u-x passwd
[root@ japie tmp]# chmod o-x testdir/
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rw-r-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-- 2 root root 4096 Jan 21 12:00 testdir/ 
再给他们加上SUID和SBIT权限
[root@ japie tmp]# chmod u+s passwd
[root@ japie tmp]# chmod o+t testdir/
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rwSr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-T 2 root root 4096 Jan 21 12:00 testdir/ 
咱们看到,这时候的小s和小t已经变成了大S和大T了,为何呢?由于他们这个位置没有了x权限,若是没有了x权限,根据咱们上面讲的内容,其实,这个特 殊的权限就至关于一个空的权限,没有意义。也就是说,若是你看到特殊权限位置上变成了大写的了,那么,就说明,这里有问题,须要排除。

相关文章
相关标签/搜索