4.SUID、SGID、SBIT、chattr权限

    1.SetUID权限(SUID)

关于SetUID权限,我们通过一个例子来理解

         /etc/shadow文件保存着所有用户的密码,我们查看一下shadow文件的详细信息

         test@ubuntu:~$ll /etc/shadow
---------- 1root shadow 1181 May 15 20:13 /etc/shadow


         可以看到,普通用户对shadow文件没有任何操作权限,只有root用户才能查看和修改shadow。

         这里有个疑问:shadow保存着普通用户的密码,但是普通用户无法修改shadow文件,那么普通用户是怎么修改自己的密码,然后把新密码保存到shadow中的呢?

         我们知道普通用户执行passwd命令修改自己的密码,然后新密码会被写入到shadow文件中,passwd命令位于/usr/bin目录下,查看一下passwd命令的详细信息:

test@ubuntu:~$ ll /usr/bin/passwd
-rwsr-xr-x 1 root root 51224 Jul 20 2015 /usr/bin/passwd*


         我们注意到passwd的权限:

-rwsr-xr-x


普通用户拥有执行passwd的权限,注意,s就是SetUID权限的意思。

SetUID权限的具体作用是:普通用户执行passwd命令时,其身份会切换为passwd命令的所有者,也就是root身份,而root身份可以修改shadow文件,当passwd命令执行完毕时,普通用户从root身份又切换为普通身份,这样就完成了密码的修改。

有人就问了,普通用户执行passwd时身份切换为了root,变成root之后我们是否可以修改其他人的密码呢?比如执行如下命令:

test@ubuntu:~$passwd user1


答案是不可以的:

test@ubuntu:~$passwd user1
passwd: You maynot view or modify password information for user1.


 

总结设置SetUID的条件:

1.      只有可执行的二进制程序才能设定SUID权限(例如passwd便是一个可执行程序);

2.      命令执行者要对该程序拥有x(执行)权限(普通用户可以执行passwd命令);

3.      命令执行者在执行该程序时获得该程序所属主的身份(在执行程序的过程中灵魂附体为程序的属主,test用户执行passwd的过程中身份暂时变为root);

4.      SetUID权限只在该程序执行过程中有效,也即是说身份改变只在程序执行过程中有效;

设定SetUID的方法:

         4代表SUID

         chmod     4755 文件名
         chmod     u + s 文件名


取消SUID的方法

        chomd     u-s    文件名


2.SetGID权限(SGID)

         我们只能对(可执行)文件设置SUID权限,但是SGID权限既能针对文件,又能针对目录。

       SGID针对文件的作用:

1.      只有可执行的二进制程序才能设置SGID权限;

2.      命令执行者要对该程序拥有x(执行)权限;

3.      命令执行者在执行程序的时候,组身份升级为该程序文件的属组;

4.      SGID权限同样只在该程序执行过程中有效,也就是说组身份的改变只在程序执行过程中有效;

 

举个例子,Linux下的locate命令是按照文件名搜索文件,find直接在文件目录中搜索,而locate搜索的是数据库,与find相比locate占用的资源更少,所以执行速度更快。Locate搜索的数据库位置在:/var/lib/mlocate/mlocate.db,我们看看mlocate.db文件的详细信息:

test@ubuntu:~$ll /var/lib/mlocate/mlocate.db
-rw-r----- 1root mlocate 4540229 May 17 01:28 /var/lib/mlocate/mlocate.db


mlocate组对mlocate.db文件有读权限,但是普通用户在other组中,对于mlocate.db没有任何权限,但是在实际应用中,普通用户是可以使用locate命令查询mlocate.db中的内容。我们查看一下locate命令的详细信息:

test@ubuntu:~$ll /usr/bin/locate
lrwxrwxrwx 1root root 24 May 15 11:54 /usr/bin/locate -> /etc/alternatives/locate*


 
test@ubuntu:~$ll /etc/alternatives/locate
lrwxrwxrwx 1root root 16 May 15 11:54 /etc/alternatives/locate -> /usr/bin/mlocate*
 
test@ubuntu:~$ll /usr/bin/mlocate
-rwxr-sr-x 1root mlocate 39520 Nov 17  2014/usr/bin/mlocate*


注意,/usr/bin/locate指向/etc/alternatives/locate*,/etc/alternatives/locate*指向/usr/bin/mlocate*,所以locate命令最终执行的是/usr/bin/mlocate,我们发现mlocate的权限是:

         -rwxr-sr-x


其中的s就是SGID权限。

当任何一个普通用户执行locate命令(实际执行的是mlocate)时,用户的组身份临时切换为mlocate组,mlocate组对于mlocate.db拥有读权限,locate执行完毕,用户切换为原来的组身份。

SGID针对目录的作用:

1.      普通用户必须对此目录拥r和x权限,才能进入此目录;

2.      普通用户在此目录中的有效组会变成此目录的属组;

3.      若是普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组;

设定SGID

         2代表SGID

         chmod    2755        文件名
         chmod    g+s                    文件名


3.Sticky BIT权限(SBIT)

         SBIT称为粘着位权限

1.      SBIT只对目录有效;

2.      普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限;

3.      如果没有SBIT,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一旦赋予了SBIT,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。

对目录而言,最高的权限是w,可以新建和删除目录中的内容,SBIT权限的前提是要求普通用户对目录拥有w和x权限,普通用户属于目录的other组,也就是说,SBIT权限要求目录对other组开放x权限,这本身就是不安全的,在平时的使用中不建议使用SBIT。

多用户共享一个文件夹时可以给文件夹赋予SBIT。一个典型的例子是根目录下的tmp文件夹,/tmp,我看看tmp的详细信息:

test@ubuntu:/$ll | grep tmp/
drwxrwxrwt  11 root root 4096 May 18 23:45 tmp/


t表示SBIT

设定SBIT

         chmod      1755         目录名
         chmod      o+t            目录名


chattr权限

       chattr命令格式:

         chattr       [+ - =]        [options]           文件名或目录名

         +:增加权限

         -:删除权限

         =:等于某权限

         常用的options包括:i(insert)和a(append)

         i:如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。

         a:如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但是不能删除。

       举例如下:

root@ubuntu:/home/test# touch chattr_test                                    # 用root用户创建一个文件root@ubuntu:/home/test#chattr +i chattr_test                                  #给文件添加chattr的i权限
root@ubuntu:/home/test# lsattr chattr_test                                              # 查看文件的chattr权限
----i--------e-- chattr_test                                                                             #e表示ext*文件系统
root@ubuntu:/home/test# ll chattr_test                                             # 查看文件的普通权限
-rw-r--r-- 1 root root 0 May 19 00:00chattr_test
 
# root用户vi修改chattr_test,
root@ubuntu:/home/test# vi chattr_test
# 按i进入insert模式后提示
W10: Warning: Changing a readonly file
# 忽略警告,向chattr_test文件里写入数据,q!强制保存退出,然后再次打开,发现chattr_test没有被修改,说明root也拿chattr权限没办法。


你可能感兴趣的:(4.SUID、SGID、SBIT、chattr权限)