Linux 文件权限

        一个文件都有一个所有者, 表示该文件是谁创建的. 同时, 该文件还有一个组编号, 表示该文件所属的组, 一般为文件所有者所属的组. 如果是一个可执行文件, 那么在执行时, 一般该文件只拥有调用该文件的用户具有的权限. 而setuid, setgid 可以来改变这种设置.

setuid、setgid、sticky bit 说明

        setuid:用于二进制可执行文件,设置使文件在执行阶段具有文件所有者的权限。典型的文件是 /usr/bin/passwd ,它更改用户的密码时是会更改 /etc/passwd/etc/shadow 等文件的,这些文件默认普通用户没有写权限。如果一般用户执行该文件,则在执行过程中,该文件可以获得 root 权限,从而可以更改用户的密码。

        setgid:用于目录,用户在该目录下创建的文件都拥有与该目录相同的属组。当作用在文件上时,作用和 suid 类似,让执行该文件的用户临时拥有属组的权限,目录被设置该位后,任何用户在此目录下创建的文件都具有和该目录所属的组相同的组。

        sticky bit:该位可以理解为防删除位。一个文件是否可以被某用户删除,主要取决于该文件所属的组是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能被删除,同时也不能添加新的文件。如果希望用户能够添加文件但同时不能删除文件,则可以对文件使用 sticky bit 位。设置该位后,就算用户对目录具有写权限,也不能删除该文件。

权限修改操作

        操作这些标志与操作文件权限的命令是一样的,都是 chmod 。有两种方法来操作:

        1. 如下

1
2
3
chmod u+s temp -- 为temp文件加上setuid标志. (setuid 只对文件有效)
chmod g+s tempdir -- 为tempdir目录加上setgid标志(可以作用在文件上,效果和suid类似,也可以作用在目录)
chmod o+t tempdir -- 为tempdir目录加上sticky标志 (sticky只对目录有效)

        2. 用八进制方式。对一般文件通过三组八进制数字来设置标志,如 666 ,777 ,644 等。如果设置这些特殊标志,则在这组数字之外外加一组八进制数字。如 4666 , 2777 等。这一组八进制数字三围的意义如下:

  • a - setuid 位,如果该位为 1,则表示设置 setuid
  • b - setgid 位,如果该位为 1,则表示设置 setgid
  • c - sticky 位,如果该位为 1,则表示设置 sticky

        也就是说,如果有特殊权限是,第一位数字可以是 0,1(–t),2(-s-),3(-st),4(s–),5(s-t),6(ss-),7(sst)

        设置完这些标志后,可以用 ls l 来查看。如果有这些标志,则会在原来的执行标志位置上显示。如:

1
2
3
rwsrw-r-- 表示有setuid标志
rwxrwsrw- 表示有setgid标志
rwxrw-rwt 表示有sticky标志

        那么原来的执行标志 x ,系统是这样规定的。如果本来该为上有 x ,则这些特殊表示显示为小写字母(s ,s ,t)。否则,显示为大写字母(S , S ,T)