概述:

Linux下创建新文件时,默认UID和GID来分配文件权限。想让其他人也能访问文件 ,要么改变其他用户所在安全组的访问权限,要么给文件分配一个新的包含其他用户的默认属组。在一台拥有多人权限的Linux上,创建文档并共享 ,这很烦琐,幸好Linux为我们提供解决的简单方法;Linux还为每个文件和目录存储了3个额外的信息位。

SUID

定义:设置用户ID(SUID)当文件被用户使用时,程序会以文件属主的权限运行。
现实中的应用:
查看/usr/bin/passwd 与/etc/passwd文件的权限

san@san-ubuntu16:~$ ls -alh /etc/passwd
-rw-r--r-- 1 root root 2.4K 12月 10 14:06 /etc/passwd

san@san-ubuntu16:~$ ls -alh /usr/bin/passwd 
-rwsr-xr-x 1 root root 53K 5月  17  2017 /usr/bin/passwd

说明:
由于/etc/passwd文件存储的是用户的账号与密码信息,因此它的属主和属组都是root系统管理员;并且通常只有root才能读写修改,属组和其他用户只读;
/usr/bin/passwd是执行修改和查看/etc/passwd文件的程序,但从权限上看,/etc/passwd仅有root拥有写的权限,可实际上每个用户都可以通过/usr/bin/passwd命令去修改这个文件(普通用户不加sudo只能修改自己的,加sudo输入root密码拥有root权限除外),于是这里就涉及了linux里的特殊权限setuid,正如-rwsr-xr-x中的s 就是设置了SUID
作为普通用户是没有权限修改/etc/passwd文件的,但给/usr/bin/passwd以suid权限后,普通用户就可以通过执行passwd命令,临时的拥有root权限,去修改/etc/passwd文件了
同样的例子就是ping命令
添加SUID权限:
chmod u+s “文件”

SGID

定义:设置组ID(SGID)对文件来说,程序会以文件属组的权限运行;对于目录来说,目录中创建的新文件会以目录的默认属组作为默认属组。
添加SGID权限
chmod g+s "目录"
实验:
/home/san/test/目录下有一个test2目录
默认权限如下:

san@san-ubuntu16:~/test$ ls -alh
drwxrwxr-x  2 san san 4.0K 12月 10 14:05 test2

通过:
chmod g+s test2 对test2目录设置SGID权限如下:

san@san-ubuntu16:~/test$ chmod g+s test2/
san@san-ubuntu16:~/test$ ls -alh
总用量 48K
drwxr-xr-x  3 san san 4.0K 12月 10 14:05 .
drwxr-xr-x 60 san san 4.0K 12月 10 13:05 ..
drwxrwsr-x  2 san san 4.0K 12月 10 14:05 test2

此时切换到root用户再到tes2目录下创建一个文件a.txt

san@san-ubuntu16:~/test$ su root
密码:                               #输入root密码
root@san-ubuntu16:/home/san/test/test2# ls -alh
总用量 8.0K
drwxrwsr-x 2 san  san 4.0K 12月 10 14:24 .
drwxr-xr-x 3 san  san 4.0K 12月 10 14:05 ..
**-rw-r--r-- 1 root san    0 12月 10 14:24 a.txt**

由于test2加了SGID权限,所以切换到root时创建的文件默认属组已经变成了san组。

sticky

粘贴位(sticky),对文件目录添加了sticky权限后,此目录下的文件或目录,是谁创建的只有创建者才能删除(root除外),即使在这个拥有sticky目录下创建的文件是777权限,非创建本身(除root) 其他用户都不能删除,Linux系统中/tmp目录就是这个权限。
san@san-ubuntu16:/tmp$ ls -alh /
drwxrwxrwt 10 root root 4.0K 12月 10 14:38 tmp

实验:
现系统中有两个用户 一个san 一个dong

san账号切换到/tmp下创建san.txt 修改权限为777
san@san-ubuntu16:/tmp$ touch san.txt
san@san-ubuntu16:/tmp$ chmod 777 san.txt
dong账号切换到/tmp下创建dong.txt   修改权限为777
dong@dong-ubuntu16:/tmp$ touch dong.txt
dong@dong-ubuntu16:/tmp$ chmod 777 dong.txt
最后的权限如下:
san@san-ubuntu16:/tmp$ ls -alh |egrep "*.txt"
-rwxrwxrwx  1 dong dong    0 12月 10 14:36 dong.txt
-rwxrwxrwx  1 san  san     0 12月 10 14:35 san.txt

近道理说san用户 对dong.txt文件也是可执行和修改删除的,我们来删除下试试看
san@san-ubuntu16:/tmp$ rm -rf dong.txt
rm: 无法删除'dong.txt': 不允许的操作

没有 权限,这就是sticky权限起的作用。
我们自己也可以创建目录并赋予sticky权限
设置sticky权限:
chmod o+t "目录"

总结

SUID 主要对可执行文件的执行有效,当可执行文件设置了SUID后,其他用户(普通用户,即原本对这个可执行文件没有权限的用户)运行这个文件时,以该文件的属主权限临时来运行.
SGID对文件和目录均有效,对于文件,程序将在文件用户组的权限下运行;当目录设置SGID权限时,其下的所有文件或目录的默认属组都和父目录(设置SGID)保持一致;
STICKY粘着位,进程结束后,文件仍然保留在内存中;针对目录添加时,其目录下的文件或目录,只有创建本人完全拥有,非创建者或root不能删除修改,即使这个文件是777权限.