关于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.
1. 只有可执行的二进制程序才能设定SUID权限(例如passwd便是一个可执行程序);
2. 命令执行者要对该程序拥有x(执行)权限(普通用户可以执行passwd命令);
3. 命令执行者在执行该程序时获得该程序所属主的身份(在执行程序的过程中灵魂附体为程序的属主,test用户执行passwd的过程中身份暂时变为root);
4. SetUID权限只在该程序执行过程中有效,也即是说身份改变只在程序执行过程中有效;
4代表SUID
chmod 4755 文件名 chmod u + s 文件名
chomd u-s 文件名
我们只能对(可执行)文件设置SUID权限,但是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执行完毕,用户切换为原来的组身份。
1. 普通用户必须对此目录拥r和x权限,才能进入此目录;
2. 普通用户在此目录中的有效组会变成此目录的属组;
3. 若是普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组;
2代表SGID
chmod 2755 文件名 chmod g+s 文件名
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
chmod 1755 目录名 chmod o+t 目录名
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权限没办法。