Linux系统上的特殊权限

 

        

 

举例:

[root@centos730g ~]# ll /bin/passwd    //查看“/bin/passwd”文件的权限,有一                                             个“s”(注意:这个文件在centOS6上                                             没有,在centOS7上有)
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd
[root@centos730g ~]# 

 

[root@centos6 ~]# ls -ld /tmp   //查看目录“/tmp”本身的权限,发现里面有一个t

drwxrwxrwt. 20 root root 4096 Oct 11 13:42 /tmp

[root@centos6 ~]#

        

 

Linux系统上特殊权限有三个:SUID  SGID STICKY

 

安全上下文的概念:其实就是访问文件的访问机制

                   一个用户或者一个进程访问一个文件时,是怎样的访问机制?一个进程是否能够访问一个文件,取决于发起这个进程的用户对文件的访问权限的应用机制,应用机制是,首先去判断发起这个进程的用户是否是被访问文件的属主,如果是则应用属主权限,否则,则检查发起这个进程的用户是否是被访问文件的属组,如果是则应用属组权限,否则应用其他权限。)

 

         安全上下文:

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

 

 

(但是我们有没有想象过,用户第一次运行命令时,他怎样应用这个命令上的权限,刚才我们一直在讲,如果一个用户执行“ls”,就相当于ls这个进程等,访问/etc时,要看发起ls这个进程的用户。到底是不是这个文件或目录的属主,但是现在有一个问题,我们访问“ls”这个文件,“ls”本身就是一个文件,那我们能不能运行这个ls命令,这取决于什么?以前我们一直说的是这个进程访问的对象,但是进程自己,他在被执行之前,本身也是一个文件,因此一个用户有没有权限运行这个命令,他取决于什么?取决于这个文件自己的权限,取决于用户对这个文件有没有执行权限。

         我们看一下“/bin/ls”这个文件的权限:

         [root@centos6~]# ls -l /bin/ls   发现“/bin/ls”文件权限是755

         -rwxr-xr-x.1 root root 109208 May 11 16:59 /bin/ls

         [root@centos6~]#

         我们当前用户是root,所以root用户直接运行这个程序时,他是以谁的身份来访问的?我们看到root是文件“/bin/root”的属主,所以运行属主的权限

         那我们现在换一个用户,hadoop用户。

[root@centos6 ~]# useradd hadoop

[root@centos6 ~]# su - hadoop

[hadoop@centos6 ~]$ ls -l /bin/ls    //可以看出hadoop用户查看ls命令时,发现ls命令的                                                                                  属主仍然是root用户。

-rwxr-xr-x. 1 root root 117048 May 11 16:59/bin/ls

[hadoop@centos6 ~]$

那么hadoop用户,执行ls这个命令时,是以ls命令中的其他用户的权限“r-x”来执行。但是没有写权限,所以hadoop用户不能改这个文件。

         所以一个用户是否有权限运行某个命令,取决于这个用户对这个命令的文件是否有执行权限。

         问题,谁代理用户将这个命令发起为进程的呢?

                   shell进程,所以任何用户执行进程,都是他的shell进程的子进程,我们可以运行“pstree”命令来查看:

         ├─sshd─┬─sshd───bash───su───bash───pstree,那么shell是以谁的身份运行呢?

         答案是,谁的shell就以谁的身份运行:用“ps aux”命令知:

hadoop   30540  0.0  0.0 108352 1776 pts/1    S    11:36  0:00 -bash

         我们一定要记得,每一个用户登录系统后,都有一个默认的shell,这个shell就是以当前的用户身份运行。

         所以  每一个用户发起的进程,在shell命令下首先是shell的子进程,其次他还得以当前用户的身份来映射这个文件的权限,有执行权限才能运行。

                   2.权限匹配模型:

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

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

                            3)应用other的权限;

 

 

(如果当前系统中运行的用户为“hadoop”,那么hadoop用户发起ls命令时,那么这个ls进程是以谁的身份在运行?是以hadoop的身份在运行,也就是意味着虽然这个ls程序文件的属主属组是root用户,hadoop用户在发起这个命令时,是能够应用ls程序文件的other类用户的权限,但是ls这个进程发起后,是以hadoop用户作为属主,

[hadoop@centos6 ~]$ whoami

hadoop

[hadoop@centos6 ~]$ ls -l /bin/ls

-rwxr-xr-x. 1 root root 117048 May 11 16:59/bin/ls

[hadoop@centos6 ~]$

         一个用户发起一个进程,那么这个进程就代表这个用户在运行,所以这就意味着,虽然这个进程的程序文件的属主属组是root,但是这个程序被用户启动以后,成为进程了,这个进程的属主是当前用户,

 

 

 

SUID

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

 

[hadoop@centos6 ~]$ ps aux     //可以看出bash的发起者是hadoop用户

hadoop   30540  0.0  0.0 108352 1776 pts/1    S    11:36  0:00 -bash  

[hadoop@centos6 ~]$ ls -l /bin/bash     //bash程序文件的属主,属组都是root

-rwxr-xr-x. 1 root root 941880 May 11 07:21/bin/bash

[hadoop@centos6 ~]$

         所以我们一定要明白,程序文件的属主属组,与程序运行后进程的属主属组是不一样的

程序启动后就成为了进程,进程与程序文件就没有关系了。

         进程的属主是进程的发起者,属主只要对程序文件有执行权限就能发起进程。

 

上面说的是正常情况下的规则,但是有了SUID之后,这种规则就被改变了。

 

当发起这个进程的时候,如果一个文件有SUID权限,就意味着这个进程的运行者身份不是发起者,而是文件自己的属主。

 

SUID的功用:

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

 

(这意味着什么?

         比如说如果bash拥有SUID的话,每一个用户登录后,打开的bash,都以root的身份运行,那么这样的话,任何用户都可以假冒root用户的身份进行操作)

 

举例演示:

 

[hadoop@centos6 ~]$ ls -l /bin/cat     //查看原本cat程序的属主属组为root,并且其他用                                                                                  户有执行权限。

-rwxr-xr-x. 1 root root 48568 May 11 16:59/bin/cat

[hadoop@centos6 ~]$ ls -l /etc/shadow   //查看文件shadow的权限,看到对于任何用户都没                                                                             有权限,实际上这种没有任何权限对root管理员                                                                                        是不起作用的,但是对于普通用户就会有作用,不                                                                               允许普通用户查看文件内容

----------. 1 root root 1089 Nov  4 11:36 /etc/shadow

[hadoop@centos6 ~]$ cat /etc/shadow   //普通用户hadoop用户运行cat程序,查看shadow                                                                             文件,但是shadow文件权限对普通用户是不允许                                                                             的,所以被禁止

cat: /etc/shadow: Permission denied

[root@centos6 ~]# cp /bin/cat /tmp/            //程序文件不一定非要保存在/bin/目录下

[root@centos6 ~]# chmod u+s /tmp/cat    //我们给cat程序加上SUID功能,使得这个cat                                           序被普通用户发起时,他以自己的程序文件属主root身份运行。

[hadoop@centos6 ~]$ ls -l /tmp/cat                     //再次查看cat命令,发现有了SUID功能

-rwsr-xr-x. 1 hadoop hadoop 48568 Nov  4 15:26 /tmp/cat

[hadoop@centos6 ~]$ /tmp/cat /etc/shadow    //再次查看shadow文件时,是以root身份                                                                                                运行,所以可以查看文件内容。

root:$6$OVD4n2P9EgnrtYnm$WDc9Jap/CVzJe8rTmHSPjgSvPz6o5JlzmcqftQv9wvPJd8lGkyZv43rG876rsYYngDXH6Ke3zBYn5SrzBZc/j.:17085:0:99999:7:::

bin:*:15980:0:99999:7:::

daemon:*:15980:0:99999:7:::

adm:*:15980:0:99999:7:::

lp:*:15980:0:99999:7:::

sync:*:15980:0:99999:7:::

shutdown:*:15980:0:99999:7:::

halt:*:15980:0:99999:7:::

mail:*:15980:0:99999:7:::

[hadoop@centos6 ~]$ whoami   //但是我们现在的用户依然是hadoop

hadoop

[hadoop@centos6 ~]$

 

上面的演示,就验证了SUID的功能,就是当一个用户要运行一个程序时,这个程序如果有SUID功能,那么这个程序被发起为进程时,这个进程的属主不再是发起者,而是这个程序文件件的属主。

 

 

SUID的功能更是体现在我们普通用户可以修改自己的密码上。因为当用户运行passwd这个程序,发起为进程时,由于passwdSUID功能,那么运行后,passwd的属主是root,那么就可以改密码了。并将密码保存在/etc/shadow文件中。

[root@centos7 ~]# ls -l /bin/passwd

-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd

[root@centos7 ~]#

 

 

由此我们发现SUID有风险。

 

 

管理文件的SUID权限:

                   chmod  u+|-s FILE.....

        

                   展示位置(即SUID符号S的出现位置):属主的执行权限位

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

                            否则,显示为大写S

 

 

 

 

 

 

SGID

                   SGID一般用在更改目录的属组权限

举例演示:

[root@centos6 ~]# useradd fedora

 

[root@centos6 ~]# useradd mygrp

 

[root@centos6 ~]# useradd centos

 

[root@centos6 ~]# usermod -a -G mygrp fedora    //fedora用户添加附加组

 

[root@centos6 ~]# usermod -a -G mygrp centos   //centos用户添加附加组

 

[root@centos6 ~]# id fedora

uid=501(fedora) gid=501(fedora)groups=501(fedora),502(mygrp)

 

[root@centos6 ~]# id centos

uid=504(centos) gid=504(centos)groups=504(centos),502(mygrp)

 

[root@centos6 ~]# mkdir /var/tmp/test

 

 [root@centos6~]# chown :mygrp /var/tmp/test   //更改目录的属组为“mygrp

 

 [root@centos6~]# ls -dl  /var/tmp/test/

drwxr-xr-x. 2 root mygrp 4096 Nov  4 19:36 /var/tmp/test/

 

[root@centos6 ~]# chmod g+w /var/tmp/test/   //给用户的属组加写权限

 

[root@centos6 ~]# ls -dl /var/tmp/test/

drwxrwxr-x. 2 root mygrp 4096 Nov  4 19:36 /var/tmp/test/

 

[root@centos6 ~]# su - fedora   //切换用户,让fedora用户在目录中床架一个文件

 

[fedora@centos6 ~]$ cd /var/tmp/test/

 

[fedora@centos6 test]$ touch a.fedora

[fedora@centos6 test]$ ls -l  //看到fedora用户在目录中创建的文件的属主,属组都为fedora

total 0

-rw-rw-r--. 1 fedora fedora 0 Nov  4 19:39 a.fedora

 

 [fedora@centos6test]$ exit

logout

[root@centos6 ~]# su - centos  //切换到centos用户,并在目录中也创建一个文件

 

[centos@centos6 ~]$ touch a.centos

 

[centos@centos6 ~]$ ls -l

total 0

-rw-rw-r--. 1 centos centos 0 Nov  4 19:39 a.centos

 

[centos@centos6 ~]$ cd /var/tmp/test/

 

[centos@centos6 test]$ touch a.centos

 

[centos@centos6 test]$ ls -l    //centos用在目录中创建的文件的属主属组也是centos本身

total 0

-rw-rw-r--. 1 centos centos 0 Nov  4 19:40 a.centos

-rw-rw-r--. 1 fedora fedora 0 Nov  4 19:39 a.fedora

[centos@centos6 test]$

 

结合上面的步骤演练SGID的效果:

 

 [centos@centos6 test]$ exit

logout

 

[root@centos6 ~]# chmod g+s /var/tmp/test/   //在管理员环境下,为目录加上SGID功能

 

[root@centos6 ~]# ls -ld /var/tmp/test/   //查看目录加上SGID后,权限的变化

drwxrwsr-x. 2 root mygrp 4096 Nov  4 19:40 /var/tmp/test/

 

 [root@centos6 ~]# su - fedora  //再次切换到fedora用户,并在目录中再次常见一个文件,                                                                  此时这个文件的属组不再是用户本身,而是目录的属组

 

[fedora@centos6 ~]$ cd /var/tmp/test/

 

[fedora@centos6 test]$ touch b.fedora

 

[fedora@centos6 test]$ exit

logout

 

[root@centos6 ~]# su - centos   //切换到centos用户下,并在目录项创建一个文件,发现                                                                      文件的属组也变成了目录的属组

 

[centos@centos6 ~]$ cd /var/tmp/test/

 

[centos@centos6 test]$ touch b.centos

[centos@centos6 test]$ ll

total 0

-rw-rw-r--. 1 centos centos 0 Nov  4 19:40 a.centos

-rw-rw-r--. 1 fedora fedora 0 Nov  4 19:39 a.fedora

-rw-rw-r--. 1 centos mygrp 0 Nov  4 19:54 b.centos

-rw-rw-r--. 1 fedora mygrp 0 Nov  4 19:53 b.fedora

[centos@centos6 test]$

 

         任何在此目录下创建文件的用户所新建的文件他的属组不再是用户的主组或者基本组,而是这个目录的属组,这既是SGID

 

         SGID的作用:

         如果有多个用户同属于一个组,而且大家彼此的属组都有这么一个组,并且对于这个共同的属组都有写权限,这样将来每个用户所创建的文件彼此都可以修改,因此他能带来的结果就是每一个人创建的文件,在这个目录中别人都可以改

         (那有人就说了,搞这么麻烦干嘛,我直接让其他用户有写权限不就行了,其实这样是不可取的,让其他用户拥有写权限,是非常危险的操作,但是作为普通用户来讲,怎样将自己的文件共享给别人,让别人能写?以为没有权限改属主属组,那除了修改权限没有别的办法,因此作为管理员来讲,为了使的这一个组内的几个开发程序员,能够彼此修改对方的程序文件,我们就用这个方式来做。)

 

         SGID引发的问题,

         这样的目录,用户在这个目录下可以对其他用户所创建的文件进行修改,不但能进行修改,还能删除这个目录下的所有文件,因为用户在该目录下有写权限。

         为了避免用户在该目录先能够任意删除这个目录下的文件,就引进了Sticky

Sticky我们称为粘滞位。

         什么是粘滞位?

                   我们可以做一个验证,就是我们基于别的用户名,来删文件,看看能不能删掉,

 

演示操作:

[centos@centos6 test]$ whoami

centos

[centos@centos6 test]$ rm a.fedora

rm: remove write-protected regular emptyfile `a.fedora'? y

[centos@centos6 test]$ ll

total 0

-rw-rw-r--. 1 centos centos 0 Nov  4 19:40 a.centos

-rw-rw-r--. 1 centos mygrp  0 Nov 4 19:54 b.centos

-rw-rw-r--. 1 fedora mygrp  0 Nov 4 19:53 b.fedora

[centos@centos6 test]$

[centos@centos6 test]$ exit

logout

[root@centos6 ~]# su - fedora

[fedora@centos6 ~]$ cd /var/tmp/test/

[fedora@centos6 test]$ rm a.centos

rm: remove write-protected regular emptyfile `a.centos'? y

[fedora@centos6 test]$ ll

total 0

-rw-rw-r--. 1 centos mygrp 0 Nov  4 19:54 b.centos

-rw-rw-r--. 1 fedora mygrp 0 Nov  4 19:53 b.fedora

 [fedora@centos6 test]$ exit

logout

[root@centos6 ~]#

 

(这样,由于我们可以任意的删除其他用户在改目录下创建的文件,那么当一个用户创建一个文件以后,我们将这个文件删除以后,我们说这个用户没有创建文件,因为我们将这个文件删除了。

         那为了避免出现这样的问题,我们就是用了“Sticky”)

 

演示操作如下:

[root@centos6 ~]# chmod o+t /var/tmp/test/    //我们引入了Sticky是“o+t”对目录进处理

 

[root@centos6 ~]# ls -ld /var/tmp/test/

drwxrwsr-t. 2 root mygrp 4096 Nov  4 20:24 /var/tmp/test/

 

[root@centos6 ~]# su - fedora  //我们再次切换用户,按理说fedoracentos两个用户和这                                                          个目录都属于同一个组,并且这个目录的属组有写权限,那                                                             么这两个用户的在这个目录中可以执行创建文件删除文件                                                                 的操作。

 

[fedora@centos6 ~]$ cd /var/tmp/test/

 

[fedora@centos6 test]$ ll

total 0

-rw-rw-r--. 1 centos mygrp 0 Nov  4 19:54 b.centos

-rw-rw-r--. 1 fedora mygrp 0 Nov  4 19:53 b.fedora

 

[fedora@centos6 test]$ vim b.fedora    //编辑自己的文件,并添加了“hello  China”内容

 

[fedora@centos6 test]$ cat b.fedora

hello China

 

 [fedora@centos6 test]$ vim b.centos    //编辑centos用户的文件,并成功添加“hellopeople

 

[fedora@centos6 test]$ cat b.centos

hello people

[fedora@centos6 test]$

[fedora@centos6 test]$ rm -f b.centos    //但是正是加了Sticky功能,目录中的用户不能删                                                                                         除其他用户在该目录下创建的文件,但是能够创建                                                                                    并删除自己的文件。

rm: cannot remove `b.centos': Operation notpermitted

[fedora@centos6 test]$

 

[fedora@centos6 test]$ rm -f b.fedora    //用户可以删除自己创建的文件

[fedora@centos6 test]$ ll

total 0

-rw-rw-r--. 1 centos mygrp 0 Nov  4 19:54 b.centos

[fedora@centos6 test]$

[fedora@centos6 test]$ touch b.fedora   //还能创建文件

[fedora@centos6 test]$ ll

total 0

-rw-rw-r--. 1 centos mygrp 0 Nov  4 19:54 b.centos

-rw-rw-r--. 1 fedora mygrp 0 Nov  4 20:40 b.fedora

[fedora@centos6 test]$

 

总结上面的演示就是:

一般而言,只要某个目录用t权限,任何人只要有写权限在这个目录中,则就能创建文件,修改自己的文件和其他用户的文件,但是删除时,只能删除自己的文件或目录,不能删别人的。

 

 

 

 

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

 

         管理文件的SGID权限:

                   chmod  g+|-s FILE.....

 

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

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

                            否则,显示为大写S

 

 

 

 

演示举例说明:

         SGID主要功能:修改目录的属组权限上:

 

 

Sticky

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

 

         管理文件的Sticky权限:

                   chmod  o+|-t FILE.......

 

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

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

                   否则,显示为大写T

 

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

[fedora@centos6 test]$ ls -ld /tmp

drwxrwxrwt. 11 root root 4096 Nov  4 20:51 /tmp

[fedora@centos6 test]$ ls -ld /var/tmp

drwxrwxrwt. 3 root root 4096 Nov  4 19:36 /var/tmp

[fedora@centos6 test]$

                  

 

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

        

SUID SGID  STICKY又正好可以组合成一个三位权限,分别代表属主(u),属组(g),其他用户(o);

 

         SUID                   SGID                   STICKY     转化成八进制对应为

         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:左侧的1表示Sticky权限位

         这也是umask为什么有四位,最左侧的权限位是代表特殊权限位

         [root@centos6~]# umask

         0022   //而这个最左侧的数字0,并不是用7去减的,7-0=7;这个0表示是特殊权限没有启动

                            所以我们在使用umask时最左侧的特殊权限忽略。

 

 

 

 

facl  (并不关键的内容,了解即可)

         file  access control  lists文件访问控制列表

 

         facl是文件的额外赋权机制

         额外的赋权机制可以针对指定的用户或者指定的组来实现

 

         功能:每一个用户都没有办法去修改任何一个文件的属主属组,所以我作为一个普通用户来讲,我想将自己的文件修改后,让别人拥有写权限,让别人能不能写,这时我们应该怎么办?这时我们除了修改other的权限没有别的办法,但是我们如果修改 我们文件的其他用户的权限,这会非常的危险,因为我们改了其他用户可读,那么其他用户都可读,这危险还不很大,但是我们如果改了文件的其他用户可执行,则其他用户都可执行,这时就很危险了,尤其是可写,那怎么办呢?这就加了一个facl

 

getfacl命令:  //查看赋权列表

         getfacl  FILE.....

                   user:USERNAME:MODE    //表示额外用户的权限(如果我们授权了多个用户,则这里的用户出现多次,如果USERNAME为空,则表示文件的属主的权限,)

                   group:GROUPNAME:MODE   //表示额外组的权限(这里如果GROUPNAME为空,则表示为默认属组的权限)

 

 

setfacl:命令    //设置赋权列表

 

         赋权给用户:

         setfacl  -m u:USERNAME:MODE  FILE.....    //赋权用户

         赋权给组:

         setfacl  -m g:GROUPNAME:MODE  FILE.....   //赋权用户组

 

         撤销赋权:

         setfacl  -x u:USERNAME  FILE....

         setfacl  -x g:GROUPNAME  FILE.....

 

 

 

 

 

facl的作用在于:

         可以让每一个用户修改属主为自己文件的权限,但是这种权限不是修改默认的ugo 的权限,而是额外新增了一个权限机制,所以facl是文件的额外赋权机制

 

facl是文件的额外赋权机制:

                  

         额外赋权机制:

         可以针对指定的用户和组来实现,比如一个普通的用户,我们可以明确说明,我的文件可以让其他那个用户来访问,但是这里不该属主,只是额外的加了一个谁拥有什么访问权限的。

                   这表示在原有的ugo之外,另一层让普通用户能控制赋权给另外的用户或组的赋权机制。

 

 

 

 

举例:

         [root@centos6tmp]# su - centos

 

[centos@centos6 ~]$ cd /tmp

 

[centos@centos6 tmp]$ touch test.centos

 

[centos@centos6 tmp]$ ls -l

total 0

-rw-rw-r--. 1 centos centos 0 Nov  4 22:54 test.centos

 

[centos@centos6 tmp]$ exit

logout

 

[root@centos6 tmp]# su - fedora

 

[fedora@centos6 ~]$ echo hello > /tmp/test.centos    //发现没有权限写入

-bash: /tmp/test.centos: Permission denied

 

 [fedora@centos6~]$ getfacl /tmp/test.centos     //查看用户的权限

getfacl: Removing leading '/' from absolutepath names

# file: tmp/test.centos

# owner: centos      //属主

# group: centos                 //属组

user::rw-                             //属主的权限,并且能看到没有额外的其他用户

group::rw-                           //属组的权限,并且能看到没有额外的其他用户

other::r--                    //其他用户

 

[fedora@centos6 ~]$ exit

logout

 

[root@centos6 tmp]# su - centos

 

[centos@centos6 ~]$ setfacl -m u:fedora:rw /tmp/test.centos    //使用访问控制列表的方式                                                                                                                               对指定的用户加权限

[centos@centos6 ~]$ getfacl /tmp/test.centos      //查看这个文件增加的额外的权限

getfacl: Removing leading '/' from absolutepath names

# file: tmp/test.centos

# owner: centos             //属主

# group: centos                 //主组

user::rw-                   //属主的权限

user:fedora:rw-                  //新增加的额外的属主权限列,属主是fedora,并且拥有的权限rw

group::rw-     

mask::rw-

other::r--

 

[centos@centos6 ~]$ exit

logout

 

[root@centos6 tmp]# su - fedora

 

[fedora@centos6 ~]$ echo hello > /tmp/test.centos    //就能写入了

 

[fedora@centos6 ~]$ getfacl /tmp/test.centos     //查看额外权限时,文件写的是绝对路径

getfacl:Removing leading '/' from absolute path names

# file: tmp/test.centos

# owner: centos

# group: centos

user::rw-

user:fedora:rw-

group::rw-

mask::rw-

other::r--

 

[fedora@centos6 ~]$ cd /tmp

  

[fedora@centos6 tmp]$ getfacl test.centos //文件写的是相对路径,就没有相面的那一栏提示

# file: test.centos

# owner: centos

# group: centos

user::rw-

user:fedora:rw-

group::rw-

mask::rw-

other::r--

 

[fedora@centos6 tmp]$ cat test.centos

hello

[fedora@centos6 tmp]$ ll test.centos     //被额外赋权的文件,查看详细信息时,前面的权                                                          限最后面有一个加号“+”这表示额外权限列表已经被添加成功

-rw-rw-r--+ 1 centos centos 6 Nov  4 23:03 test.centos

[fedora@centos6 tmp]$

 [centos@centos6~]$ setfacl -m g:mygrp:rw/tmp/test.centos    //为目录设置额外的组权限

 

[centos@centos6 ~]$ getfacl /tmp/test.centos    //查看目录的额外权限

getfacl: Removing leading '/' from absolutepath names

# file: tmp/test.centos

# owner: centos

# group: centos

user::rw-

user:fedora:rw-

group::rw-

group:mygrp:rw-   //多了一个额外组权限

mask::rw-

other::r--

 

[centos@centos6 ~]$

 

 

上面的就是我们的访问控制列表机制,但是一旦有了访问控制列表以后,我们的权限应用模型就变了,以前我们说的安全上下文,是一个进程访问一个文件时,首先检查这个进程的属主,是不是文件的属主,是则运行属主的权限,否则在检查进程的属组是不是文件属组,是则运行属组,否则运行其他用户的权限,

         但是有了访问控制列表就不同了,当用户发起的进程访问一个文件时,首先检查进程属主是不是被访问的文件的属主,是则运行属主权限,否则就查看这个文件上有没有额外的专门定义给这个用户的发起的这个进程访问控制列表,如果有,则应用此特定的访问控制列表的权限。否则在检查这个进程树属组是否是被访问的文件的属组,是则运行属组的权限,否则就检查此用户所属的组有没有专门的访问控制列表,如果有则应用这个访问控制列表的权限,否则应用其他权限。

 

 

上面的举例演示:

 

         验证有了访问控制列表后,安全上下文的顺序:

 

[centos@centos6 ~]$ exit

logout

 

[root@centos6 ~]# useradd hadoop //添加一个新用户,然后再用这个用户来查看文件验证                                                                     没有给hadoop设置访问控制列表时,能否查看文件的内容

 

[root@centos6 ~]# su - hadoop

 

 [hadoop@centos6 ~]$ getfacl /tmp/test.centos   //查看文件访问控制列表,没有对hadoop                                                                                                           设置控制,hadoop根据安全上下文的顺                                                                                                          序,对这个文件,执行的是other权限

getfacl: Removing leading '/' from absolutepath names

# file: tmp/test.centos

# owner: centos

# group: centos

user::rw-

user:fedora:rw-

group::rw-

group:mygrp:rw-

mask::rw-

other::r--

[hadoop@centos6 ~]$ cat /tmp/test.centos      //的确能查看文件内容

hello

 

[hadoop@centos6 ~]$ exit

logout

[root@centos6 ~]# setfacl -m u:hadoop:--- /tmp/test.centos    //hadoop设置访问控制列表

 

[hadoop@centos6 ~]$ getfacl /tmp/test.centos    //查看文件的访问控制列表

getfacl: Removing leading '/' from absolutepath names

# file: tmp/test.centos

# owner: centos

# group: centos

user::rw-

user:fedora:rw-

user:hadoop:---         //有了hadoop的访问控制列

group::rw-

group:mygrp:rw-

mask::rw-

other::r--

 

 [root@centos6~]# su - hadoop

 

[hadoop@centos6 ~]$ cat /tmp/test.centos   //现在的确没有权限查看文件内容了

cat: /tmp/test.centos: Permission denied

[hadoop@centos6 ~]$