Linux中setuid、setgid及sticky bit的区别

Linux File System Access Control

Linux中除了常见的读(r)、写(w)、执行(x)权限以外,还有3个特殊的权限,分别是setuidsetgidstick bit

这些特殊的权限,在被执行时都会有特殊的用处。如果不了解,很容易被黑客利用这些权限的特性来获得系统更高级的权限,甚至对系统造成无法挽回的伤害。

了解

  • setuid: 在执行时具有文件所有者的权限.
  • setgid: 设置目录. 一个目录被标上setgid位,此目录下创建的文件继承该目录的属性.
  • sticky bit: 该位可以理解为防删除位. 设置sticky bit位后,就算用户对目录具有写权限,但也只能添加文件而不能删除文件。

系统已有的特殊权限相关文件

setuid

$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2006 /usr/bin/passwd
$ ls -l /usr/bin/chsh
-rws--x--x 1 root root 23872 8月 4 2006 /usr/bin/chsh

setgid

$ ls -l /usr/bin/write
-rwxr-sr-x 1 root tty 19536 84 2006 /usr/bin/write

sticky bit

$ ls -l -d /tmp
drwxrwxrwt. 9 root root 198 3月 6 03:44 /tmp

如何设置:

操作这些标志与操作文件权限的命令是一样的, 都是使用chmod

有两种方法对这些标志来操作

  1. chmod u+s temp – 为temp文件加上setuid标志. (setuid 只对文件有效,u=用户)
    chmod g+s tempdir – 为tempdir目录加上setgid标志 (setgid 只对目录有效,g=组名)
    chmod o+t temp – 为temp文件加上sticky标志 (sticky只对文件有效)

  2. 采用八进制方式. 这一组八进制数字三位的意义如下,
    abc
    a - setuid位, 如果该位为1, 则表示设置setuid
    b - setgid位, 如果该位为1, 则表示设置setgid
    c - sticky位, 如果该位为1, 则表示设置sticky

设置后, 可以用 ls -l 来查看. 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)
如:

rwsrw-r-- 表示有setuid标志 (rwxrw-r--:rwsrw-r--)
rwxrwsrw- 表示有setgid标志 (rwxrwxrw-:rwxrwsrw-)
rwxrw-rwt 表示有sticky标志 (rwxrw-rwx:rwxrw-rwt)

扩展阅读

CORE TECHNOLOGY: ACCESS CONTROL
SADS: SetUid and SetGUID and sticky bit (Linux File Permissions)