Linux笔记17-权限管理[文件特殊权限]

【权限管理-文件特殊权限 】

8.2.1 SetUID

8.2.2 SetGID

8.3.3 Sticky BIT

 

◆ SUID

◇ SetUID的功能与条件

① 只有可以执行的二进制程序才能设定SUID权限

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

③ 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)

④ SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

Linux笔记17-权限管理[文件特殊权限]

passwd命令拥有SetUID权限,所以普通可以修改自己的密码

[[email protected] ~]# ll /usr/bin/passwd

-rwsr-xr-x. 1 root root 25980 2月 22 2012 /usr/bin/passwd

Linux笔记17-权限管理[文件特殊权限]

cat命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容

[[email protected] ~]# ll /bin/cat

-rwxr-xr-x 1 root root 47976 6月 22 2012 /bin/cat

Linux笔记17-权限管理[文件特殊权限]

◇ 设定SetUID的方法

数字4代表SUID

扩展:之前说的表示权限的3个数字(例如 755,777)其实是不完整的,其实前面还有一个数字。

有三种情况:4755(SUID),2755(SGID),1755(SBIT),7755(同时拥有前面三个,一般不这么用) 。

chmod 4755 文件名

chmod u+s 文件名

案例:创建一个空文件并查看其默认权限,结果是644

Linux笔记17-权限管理[文件特殊权限]

现在要给这个文件设定SUID,使用 chmod 4755 abc即可

Linux笔记17-权限管理[文件特殊权限]

上面的abc不是可执行程序,如果是的话,任何一个用户在操作的时候就可以获得root权限。

◇ 取消SetUID的方法

chmod 755 文件名

chmod u-s 文件名

Linux笔记17-权限管理[文件特殊权限]

◇ 危险的SetUID

① 关键目录应严格控制写权限。比如“/”、“/usr”等

② 用户的密码设置要严格遵守密码三原则

③ 对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限

视频中演示的是给vim文件 (/usr/bin/vim)设置了SUID权限,于是乎,任意用户使用vim都可以编辑打开任意的文件,

例如/etc/shadow等等所有的重要文件,或者系统的配置文件。这样会很危险!!

 

◆ SGID

◇ SetGID针对文件的作用

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

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

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

④ SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效

为什么普通用户可以使用 locate 命令呢?

[[email protected] ~]# ll /usr/bin/locate

-rwx--s--x 1 root slocate 35612 8月 24 2010 /usr/bin/locate

Linux笔记17-权限管理[文件特殊权限]

[[email protected] ~]# ll /var/lib/mlocate/mlocate.db

-rw-r----- 1 root slocate 1838850 1月 20 04:29 /var/lib/mlocate/mlocate.db

Linux笔记17-权限管理[文件特殊权限]

过程分析:

* /usr/bin/locate是可执行二进制程序,可以赋予SGID

* 执行用户lamp对/usr/bin/locate命令拥有执行权限

* 执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对/var/lib/mlocate/mlocate.db数据库拥有r权限,所以普通用户可以使用locate命令查询mlocate.db数据库

* 命令结束,lamp用户的组身份返回为lamp组

 

◇ SetGID针对目录的作用和条件(实际操作中的意义不大)

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

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

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

案例解说:

在/tmp 目录下创建一个目录,并且赋予2777权限(SGID,同时777)

Linux笔记17-权限管理[文件特殊权限]

切换到用户rx,然后先在家目录新建一个文件,查看该文件的所属组是默认的rx

Linux笔记17-权限管理[文件特殊权限]

但是,现在到刚才设置了SGID的目录 /tmp/test 目录下新建一个文件,再查看所属组:

Linux笔记17-权限管理[文件特殊权限]

结果显示,在这个目录新建的文件的所属组不是rx,而是这个目录的所属组root.

 

设定SetGID (2代表SGID )

chmod 2755 文件名

chmod g+s 文件名

取消SetGID

chmod 755 文件名

chmod g-s 文件名

◆ Sticky+BIT

◇ SBIT粘着位作用

* 粘着位目前只对目录有效

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

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

◇ 一般最多设置的就是 /tmp 目录。

[[email protected] ~]# ll -d /tmp/

drwxrwxrwt. 3 root root 4096 12月 13 11:22 /tmp/

Linux笔记17-权限管理[文件特殊权限]

测试一下:

使用用户rx 在/tmp 下创建一个文件,然后切换到另一个用户尝试删除这个文件就会出错。

但是明显这个用户对/tmp 目录是有执行权限的。

Linux笔记17-权限管理[文件特殊权限]

◇ 设置与取消粘着位

设置粘着位

chmod 1755 目录名

chmod o+t 目录名

取消粘着位

chmod 777 目录名

chmod o-t 目录名