文件特殊权限:SUID,SGID和SBIT

文件特殊权限

这是很好玩的东西。

第一部分:SetUID

被赋予SUID权限的的可执行二进制程序文件,在被其他用户执行时,会按照文件所有者的权限来执行。

所以要赋予一个文件SUID权限需要这些前提条件:

  • 该文件是可执行的二进制文件
  • 当前用户需要有该文件有执行权限

那么这个权限有什么用呢?下面来举一个例子。

1.1 SUID权限实例

  
ll /etc/shadow

关于这个文件的介绍在这里:shadow保存用户经过加密后的密码,这个文件的权限是:

-rw-r----- 1 root shadow 1490 2月  15 19:30 shadow

表示其他人都无法对这个文件进行任何查看和修改,可是当我们运行passwd命令的时候就会修改里面的内容,那么不是矛盾了吗?我们以一个其他人的身份对这个文件执行了w权限的操作,这里运用的就是SUID,我们查看一下passwd命令所在的文件就可以看出来了。

whereis passwd #结果是:passwd /usr/bin/passwd
\#这里我们查看一下该文件的权限:
ll /usr/bin/passwd
\#结果是:
-rwsr-xr-x 1 root root 54256 3月  29  2016 passwd*

这里就表明passwd命令是有SUI权限的,而且对于其他人执行时是以root(该文件的所有者)的身份来修改 /etc/shadow 文件的,所以可以修改。


这里穿插一点关于passwd的额外介绍。像上面讲的,我们在运行passwd命令时是以root身份来执行的,那么我们是否可以修改别人的密码呢?如

passwd lw

如果你现在(没运行passwd命令以前)的身份是root,那么运行这条命令是没错的,可是如果你现在不是root,而是别人,比如另一个身份,则运行这条命令是会报错的:

passwd lw   #会报下面的错
passwd:您不能查看或更改 lw 的密码信息。

所以,即使在运行passwd命令时你的身份是root,也可以保证你不能修改别人的密码。

1.2 设置SUID权限:chmod u+s 文件名

chmod 4剩余权限 文件名 #如 chmod 4755 文件名,这里的4指的就是SUID权限
chmod u+s 文件名 # s 指的就是SUID

这里的4就是这一部分内容中的特殊权限之一:umask命令。

1.3 删除SUID权限:chmod u-s 文件名

或者也可以运行下面的这条命令:

chmod 0剩余命令 文件名 # 0表示原始默认的权限

1.4 超级作死实例:chmod u+s /usr/bin/vim

为什么说这条命令在超级作死?因为我们先查看一下 /usr/bin/vim 这个命令的权限:

lrwxrwxrwx 1 root root 21 9月  16 22:27 /usr/bin/vim -> /etc/alternatives/vim*

注意哦!!!这个文件的所有者是root,而且这个命令对其他人是rwx,如果vim添加了SUID权限后,每次运行vim命令都可以以root用户的身份来查看,修改任何你可以访问到的目录内的文件!!!简直是勇敢!!!

第二部分:SetGID

SGID的命令作用和SUID类似,只是SUID是会以文件的所有者身份来运行,而SGID则是以文件的所属组的身份来运行。还有一点不同的是SUID仅针对可执行二进制程序文件,而SGID不仅可以针对二进制程序文件,也可以针对目录来设置SGID程序。

这里拿locate命令来举例子,locate命令实际上是搜索

/var/lib/mlocate/mlocate.db

这个文件,而查看这个文件的权限,我们可以看到:

-rw-r----- 1 root mlocate 7190360 2月  15 08:12 /var/lib/mlocate/mlocate.db

其他人对与该文件又TM没有任何权限,感觉Linux超级种族歧视啊。可是看locate命令的权限:

lrwxrwxrwx 1 root root 24 8月  12  2016 /usr/bin/locate -> /etc/alternatives/locate*

ll /etc/alternatives/locate*

lrwxrwxrwx 1 root root 16 8月  12  2016 /etc/alternatives/locate -> /usr/bin/mlocate*

ll /usr/bin/mlocate

-rwxr-sr-x 1 root mlocate 39520 11月 18  2014 /usr/bin/mlocate*

这里我们看见了SGID的表示,在所属组的权限栏里标有S,表示这个文件有SGID权限。所以用户在执行locate命令的时候,是以locate的所属组的身份,也就是mlocate组的身份来运行locate命令的,而mlocate组对mlocate.db文件又有r权限,所以可以查看内容。

2.1 添加SGID权限:chmod g+s 文件名/目录

也可以运行:

chmod 2剩余权限 文件/目录

2.2 SGID权限和目录的关系简介

我们上面讲过SGID权限也可以赋予给目录,那么赋予给目录有什么作用吗?那就是被赋予SGID权限的目录,在该目录下创建的文件,如果你是该目录的所属组的成员,则你在该目录下创建的文件的所属组都会变成该目录的所属组。看下面这个例子:


gpasswd -a lw friends

mkdir SGID_test

chgrp frinds SGID_test

chmod g+s SGID_test


su lw
touch SGID_test/同船爱歌无删减版.avi

-rw-r--r-- 1 lw friends    0 2月  15 22:16 同船爱歌无删减版.avi

这个文件的所有者是lw,而所属组则是继承了拥有SGID权限的目录的所属组,下面把SGID_test目录的SGID权限删掉,再来创建文件,就会发现不同了。


sudo chmod g-s SGID_test
su lw
touch SGID_test/漂亮男孩.avi
ll SGID_test/漂亮男孩.avi
-rw-rw-r-- 1 lw lw       0 2月  15 22:13 漂亮男孩.avi

这个时候创建的新文件,漂亮男孩.avi的所属组就是lw自己的主要组了。

2.3 删除SGID权限:chmod g-s 文件名/目录名

第三部分:Sticky BIT

这个权限也叫粘着位,只对目录有效。这个命令可以限制用户对目录下文件的操作,即使用户对该目录有w权限和x权限。而且还要求该目录对其他人拥有r,w和x权限。

具体一点的作用就是如果该目录设有粘着位,则只有root用户可以删除,修改文件,别的用户只能删除,修改自己创建的文件,即使该用户拥有w权限。

3.1 赋予SBIT:chmod o+t 目录名

或者也可以这么赋予:

chmod 1剩余权限 目录名

3.2 删除SBIT:chmod o-t 目录名

或者也可以这么删除:

chmod 0剩余权限 目录名

3.3 SBIT实例


mkdir sbit-test

chmod 1777 sbit-test

touch sbit-test/三生三世十里桃花.avi

su lw

rm -rf sbit-test/三生三世十里桃花.avi

rm: 无法删除'三生三世十里桃花.avi': 不允许的操作

3.4 系统SBIT实例

cd /
ll tmp/ 
drwxrwxrwt  11 root root  4096 2月  16 08:43 tmp/

tmp目录的权限是1777,是任何人暂存文件的地方,但是为了防止别人误删出别人的文件,所以添加了SBIT。

你可能感兴趣的:(linux,linux)