linux中对文件除了有读(r)、写(w)、执行(x)权限以外,还有3个特殊的权限,分别是setuid、setgid和stick bit
设置了suid的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限。例如程序文件的属主是root,那么执行该程序的用户就将暂时获得root账户的权限。sgid与suid类似,只是执行程序时获得的是文件属组的权限。
例如我们使用root身份创建一个suid.sh文件
ls -l setuid.sh文件,可以看到文件的属主和属组都是root,文件的权限是-rw-------
再将/bin下的cat复制到tmp下,将权限使用chmod u+s cat添加suid。这样/tmp下的cat在执行时便让执行该命令的用户以该命令拥有者(root)的权限去执行”。
此时我们以一个普通用户openstack的身份登录去修改这个文件,由文件权限-rw-------可知openstack无法查看suid.sh这个文件。
因此,我们可以使用/tmp/cat这个程序去查看,这样就可以查看suid.sh这个文件了。
而sgid的意思和suid是一样的,即让执行文件的用户以该文件所属组的权限去执行。
这里特别强调 suid仅可用于二进制程序上,不能用于在shellscript上面,这是因为shell script只是将很多的二进制执行文件调用进来执行而已。所以suid的权限部分,还是得看shell script调用过来的程序的设置,而不是shell script本身,另外suid对目录也是无效的。
sticky (粘贴位)仅对目录有效。
如果你查看/tmp目录的权限时,你会发现/tmp目录的权限是rwxrwxrwt权限,这就是sticky。
sticky (粘贴位)就是:除非目录的属主和root用户有权限删除它,除此之外其它用户不能删除和修改这个目录。
也就是说,在/tmp目录中,只有文件的拥有者和root才能对其进行修改和删除,其他用户则不行,避免了上面所说的问题产生。用途一般是把一个文件夹的的权限都打开,然后来共享文件,象/tmp目录一样。
如何设置这些特殊权限呢
suid:chmod u+s 文件名
sgid: chmod g+s 文件名
sticky: chmod o+t 文件名
或者使用八进制方式表示
suid guid sticky
1 1 1
suid的二进制串为:100,换算八进制为: 4
guid的二进制串为:010,换算八进制为: 2
sticky 二进制串:001,换算八进制为:1
于是也可以这样设:
suid:chmod 4644 文件名
sgid:chmod 2644 文件名
sticky:chmod 1644 文件名
而有时候我们会发现,文件使用suid或者sgid后文件后面有时候是S或者s,这里的区别是:
s:属主原有执行权限
S:属主无执行权限
同理T和t的区别同上。
此外文件特殊权限设置还有文件的acl:
我们使用root创建getfacl.txt,其中other的权限是r--,再以普通用户opentack身份登录并尝试修改此文件,会发现由于没有w权限,文件无法修改,那么如何才能修改呢?
此时就可以用到我们的acl了。
查看文件的acl,使用getfacl +文件名来查看,
设置facl使用格式
facl -m u:用户名:[rwx] 文件名
为openstack添加rw权限后使用getfacl查看会发现此时多了一个条acl
再次切换到openstack用户后,向facl.txt写入hello world后,发现可以成功写入。