简介:
linux文件系统中的文件或者目录有基本权限,读,写,执行。除此之外还有不可见属性(隐藏属性),通过chattr设置,lsattr查看。此外还有一组特殊的权限属性SUID,SGID,SBIT,此处主要说这一组特殊权限。其他基本权限细节查看其他博客理解。
SUID:当文件由此属性的时候在基本权限的用户为的X处会变成s,作用是当其他用户执行此文件的时候临时拥有此文件拥有者的权限,仅仅限于执行的过程中。
SUID的限制:
1、SUID权限仅对二进制程序(binary program)有效
(脚本无效,因为脚本本质上还是调用的更底层的二进制命令);
2、执行者对于该程序需要具有x的可执行权限;
3、本权限仅在执行该程序的过程中有效(run-time);
4、执行者将临时具有该程序拥有者(owner)的权限。
个人理解:可执行文件的内部逻辑一般都会调用其他可执行文件或者脚本,而这些脚本会牵扯到用户权限的限制,当当前文件设置SUID权限的时候,当前用户就会在这个可执行文件执行的过程中临时拥有文件拥有者的权限,这样文件内部逻辑部分就不会因为权限问题导致执行失败等问题。一般情况下,当一个用户的权限低于当前文件的用户的权限的时候是不能修改和执行这个文件的,除非这个文件的其他用户权限位设置了相应的权限,但是如果设置了这个权限,其他用户就可以随意修改和执行当前的文件,此时SUID就解决了这个问题,使得当前用户临时拥有当前文件拥有者的权限。
换一种思维:假如有一组只要root用户才可以执行的文件,现在非root用户想要根据自己的逻辑调用这一组文件并形成一个脚本,很明显这无法执行成功,此时就可以讲这个脚本文件的用户和用户组设置成root,然后给这个脚本文件加上SUID或者SGID权限,这个时候非root用户就可以直接调用这个脚本文件并且成功执行,因为这些特殊权限使得非root用户临时拥有了root用户或者用户组的权限,因此脚本文件中的root权限的可执行程序可以成功调用。(SUID只作用于二进制,所以这里的脚本可以当做编译后的二进制可执行文件)
SGID:当前用户临时拥有该文件所属用户组的权限,具体理解和SUID中的个人理解类似,此处不详解。
SBIT:SBIT(Sticky Bit)目前只针对目录有效,对于目录的作用是:当用户在该目录下建立文件或目录时,仅有自己与 root才有权力删除。
不同权限的设置方式:
字符方式
4 为 SUID = u+s
2 为 SGID = g+s
1 为 SBIT = o+t
数字方式
chmod 777 file