Linux系统上的特殊权限


特殊权限:SUID, SGID, STICKY

安全上下文:

1、进程以某用户的身份运行;进程是发起此进程用户的代理,因此以此用户的身份和权限完成所有操作;

2、权限匹配模型:

  (1) 判断进程的属主,是否为被访问的文件属主;如果是,则应用属主的权限;否则进入第2步;

  (2) 判断进程的属主,是否属于被访问的文件属组;如果是,则应用属组的权限;否则进入第3步;

  (3) 应用other的权限;

SUID:

默认情况下:用户发起的进程,进程的属主是其发起者;因此,其以发起者的身份在运行; 

SUID的功用:用户运行某程序时,如果此程序拥有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而程序文件自己的属主;

管理文件的SUID权限:

     chmod u+|-s FILE...

     展示位置:属主的执行权限位

     如果属主原本有执行权限,显示为小写s; 

     否则,显示为大写S;

演示说明:

[root@app1 tmp]# \cp /bin/ls /tmp/ls
#拷贝ls命令到/tmp目录下
[root@app1 tmp]# ll /tmp/ls 
-rwxr-xr-x 1 root root 117024 Sep 27 11:06 /tmp/ls
#默认所属组是有执行权限
[root@app1 tmp]# chmod u+s /tmp/ls 
[root@app1 tmp]# ll /tmp/ls
-rwsr-xr-x 1 root root 117024 Sep 27 11:06 /tmp/ls
#有执行权限了,在所属主的执行权限位为s,没有执行权限为S
[root@app1 tmp]# su - svn
[svn@app1 ~]$ ls /root/
ls: cannot open directory /root/: Permission denied
#切换到svn用户,用ls命令查看/root目录,没有权限
[svn@app1 ~]$ /tmp/ls /root/  #用拥有SUID 权限的命令就有查看的权限了
anaconda-ks.cfg   Desktop
[root@app1 tmp]# chmod u-s /tmp/ls #取消文件的SUID权限
[root@app1 tmp]# su - svn
[svn@app1 ~]$ /tmp/ls /root/
/tmp/ls: cannot open directory /root/: Permission denied
[svn@app1 ~]$ ll /tmp/ls 
-rwxr-xr-x 1 root root 117024 Sep 27 11:06 /tmp/ls

SGID:

功用:当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组(以此目录的属组为附加组的用户),且以属组身份在此目录中新建文件或目录时,新文件的属组不是用户的基本组,而是此目录的属组;

管理文件的SGID权限:

     chmod g+|-s FILE...    

     展示位置:属组的执行权限位

     如果属组原本有执行权限,显示为小写s; 

     否则,显示为大写S;

使用演示:

[root@app1 tmp]# ls -ld SGID/
drwxr-xr-x 2 root root 4096 Sep 27 11:18 SGID/
[root@app1 tmp]# chmod g+s SGID/  #对目录添加SGID权限
[root@app1 tmp]# ls -ld SGID/
drwxr-sr-x 2 root root 4096 Sep 27 11:18 SGID/
[root@app1 tmp]# chmod g+w SGID/
[root@app1 tmp]# ls -ld SGID/
drwxrwsr-x 2 root root 4096 Sep 27 11:18 SGID/  #在所属组的执行位显示为s
[root@app1 tmp]# su - centos
-bash-4.1$ id centos
uid=495(centos) gid=491(centos) groups=491(centos),0(root)
#centos的默认属组centos
-bash-4.1$ cd /tmp/SGID/
-bash-4.1$ touch a.txt
-bash-4.1$ mkdir centos
-bash-4.1$ ll
total 4
-rw-rw-r-- 1 centos root    0 Sep 27 11:20 a.txt
drwxrwsr-x 2 centos root 4096 Sep 27 11:20 centos
#默认创建的文件的所属组是目录的所属组,而非用户本身

结论:1.对目录进行赋权SGID时,在其目录中创建文件的用户必须是其目录的属组的成员。

         2.当sgid作用在目录上时,在目录内新建的文件或目录的所属组自动继承该目录的所属组

         3.在具有SGID权限的目录中创建文件时,目录的属组一定要有写(w)权限,因为这样才能对其目录创建文件。


Sticky:

功用:对于属组或全局可写的目录,组内的所有用户或系统上的所有用户对在此目录中都能创建新文件或删除所有的已有文件;如果为此类目录设置Sticky权限,则每个用户能创建新文件,且只能删除自己的文件;

管理文件的Sticky权限:

     chmod o+|-t FILE...

     展示位置:其它用户的执行权限位

     如果其它用户原本有执行权限,显示为小写t; 

     否则,显示为大写T;

    

     系统上的/tmp和/var/tmp目录默认均有sticky权限;

管理特殊权限的另一方式:

suid sgid sticy     八进制权限

0 0 0   0

0 0 1   1

0 1 0   2

0 1 1   3

1 0 0   4

1 0 1   5

1 1 0   6

1 1 1   7

基于八进制方式赋权时,可于默认的三位八进制数字左侧再加一位八进制数字;

例如:chmod 1777 filename 给有所有权限并且给予sticky权限

使用演示:

[root@app1 tmp]# mkdir STICKY        #创建目录
[root@app1 tmp]# chmod 1777 STICKY/  #给予目录所有的权限并且赋予sticky权限
[root@app1 tmp]# ls -ld STICKY       
drwxrwxrwt 2 root root 4096 Sep 27 14:12 STICKY #目录拥有1777权限

[root@app1 tmp]# su - centos
-bash-4.1$ cd /tmp/STICKY/
-bash-4.1$ touch centos
-bash-4.1$ mkdir centos.d
-bash-4.1$ ll
total 4
-rw-rw-r-- 1 centos centos    0 Sep 27 14:14 centos
drwxrwxr-x 2 centos centos 4096 Sep 27 14:14 centos.d
-bash-4.1$ exit
logout
[root@app1 tmp]# cd STICKY/
[root@app1 STICKY]# touch root
[root@app1 STICKY]# mkdir root.d
[root@app1 STICKY]# ll
total 8
-rw-rw-r-- 1 centos centos    0 Sep 27 14:14 centos
drwxrwxr-x 2 centos centos 4096 Sep 27 14:14 centos.d
-rw-r--r-- 1 root   root      0 Sep 27 14:15 root
drwxr-xr-x 2 root   root   4096 Sep 27 14:15 root.d
#分别用root用户和centos用户创建文件

[root@app1 tmp]# su - centos
-bash-4.1$ cd /tmp/STICKY/
-bash-4.1$ rm -f root
rm: cannot remove `root': Operation not permitted
-bash-4.1$ rm -rf root.d/
rm: cannot remove `root.d': Operation not permitted
-bash-4.1$ rm -rf centos.d
#切换到centos目录下,可以删除自己创建的文件,但是不能删除其他用户创建文件


facl:file access control lists

文件的额外赋权机制:

在原来的u,g,o之外,另一层让普通用户能控制赋权给另外的用户或组的赋权机制;

getfacl命令:

     getfacl FILE...

     user:USERNAME:MODE

     group:GROUPNAME:MODE

setfacl命令:

赋权给用户:

    setfacl  -m  u:USERNAME:MODE  FILE...

[root@app1 tmp]# mkdir FACL                    #创建目录 
[root@app1 tmp]# ls -ld FACL                   #查看权限
drwxr-xr-x 2 root root 4096 Sep 27 14:34 FACL   
[root@app1 tmp]# setfacl -m u:dts:7 FACL/      #赋予额外的权限  
[root@app1 tmp]# su - dts
dts@app1:~$ cd /tmp/facl/                      #验证可以创建文件,有写权限 
-bash: cd: /tmp/facl/: Permission denied
dts@app1:~$ cd /tmp/FACL/
dts@app1:/tmp/FACL$ cat << EOF > a.txt
> time flies
> EOF
dts@app1:/tmp/FACL$ cat a.txt 
time flies
dts@app1:/tmp/FACL$ ls -ld                     #查看实际的权限,只有r-x权限
drwxrwxr-x+ 2 root root 4096 Sep 27 14:40 ./

赋权级组:

    setfacl  -m  g:GROUPNAME:MODE FILE...

撤销赋权:

     setfacl  -x u:USERNAME  FILE...

[root@app1 tmp]# setfacl -x u:dts FACL/

     setfacl  -x  g:GROUPNAME  FILE...