查看一下文件和目录的权限:
# ls -ld /tmp ; ls -l /usr/bin/passwd
drwxrwxrwt. 24 root root 4096 5月 16 19:30 /tmp
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
我们可以看到 passwd 文件的权限是 -rwsr-xr-x ;当 s 这个标示出现在文件拥有者的 x 权限上时,就被成为 Set UID , 简称 SUID 的特殊权限. 它的限制与功能:
举例: passwd 命令拥有者是 root , passwd 命令会修改 /etc/shadow 这个文件,而这个文件的权限为 ----------. 1 root root 2560 5月 6 20:37 /etc/shadow
,虽然任何人没有读和修改的权限,但是 root 是可以修改,因为 root 是可以修改系统中任意的文件,不受权限控制;
普通用户可以使用 passwd 修改自己的密码,但是修改密码就必须要去修改 /etc/shadow 文件,但普通用户又没有修改这个文件的权限,那是不是代表用户就用不了 passwd 这个命令了吗? 当然不是. SUID 就是处理此问题创造的;当用户执行了带有 SUID 的二进制文件命令时, 就会临时具有该文件拥有者的权限,在程序执行的过程中,携带着文件拥有者的权限来执行命令,也就解决了上面所说的问题;
即普通用户使用 passwd 修改自己密码, passwd 修改 /etc/shadow 文件时,拥有的是 root 用户的权限,也就可以修改 /etc/shadow 文件了;
仅可用 在二进制程序上,不能够用在 shell 脚本上
当 s 标示在文件拥有者 x 项为 SUID, 那 s 在用户组的 x 时则称为 Set GID(SGID)
# ls -l /usr/bin/locate
-rwx--s--x. 1 root slocate 40520 4月 11 2018 /usr/bin/locate
与 SUID 不同的是, SGID 可以针对文件或目录来设置.如果对文件来说 SGID 有如下的功能:
举例: /usr/bin/locate
命令会去读 -rw-r-----. 1 root slocate 2875836 5月 16 03:32 /var/lib/mlocate/mlocate.db
这个文件,如果我们使用普通账号执行 locate 时,那普通用户将会取得 slocate 用户组的权限,因此就能够去读取 mlocate.db
当 SGID 作用在一个目录上,它将具有如下功能:
对于一个学习小组有一个共享目录的情况下,如果不设置 SGID, 那么每个人在该共享目录下创建的文件其他人都不能修改(除非修改了 umask), 使用起来很不方便,
Sticky Bit (SBIT) 目前只针对目录有效,对于文件已经没有效果了,SBIT 对于目录的作用是:
当一个目录设置了 SBIT 时, 一个普通用户创建的文件,哪怕权限是
-rw-rw-rw
,其他用户也无法删除 ,更名,移动等操作,仅可自己和 root 删除,更名,移动
chmod 是修改权限的命令,我们当然也是使用 chmod 来设置 SUID, SGID , SBIT 了
假设要将一个文件权限修改文
-rwsr-xr-x
时,由于 s 在用户权限中,所以是 SUID,因此在原先的 755 之前还要加上 4, 也就是chmod 4755 filename
来设置 ;和设置普通的权限一样,如果要设置 SUID 又要设置 SGID 则是chmod 6755 filename
;以此类推
参考自:
[鸟哥的 Liunx 私房菜(第四版)]