Linux 系统传统的权限控制方式,无非是利用 3 种身份(文件所有者,所属群组,其他用户),并分别搭配 3 种权限(读 r,写 w,访问 x)。比如,我们可以通过 ls -l 命令查看当前目录中所有文件的详细信息,其中就包含对各文件的权限设置:
[root@localhost ~]# ls -l
total 36
drwxr-xr-x. 2 root root 4096 Apr 15 16:33 Desktop
drwxr-xr-x. 2 root root 4096 Apr 15 16:33 Documents
...
-rwxr-xr-x. 2 root root 4096 Apr 15 16:33 post-install
...
以上输出信息中,“rwxr-xr-x”就指明了不同用户访问文件的权限,即文件所有者拥有对文件的读、写、访问权限(rwx),文件所属群组拥有对文件的读、访问权限(r-x),其他用户拥有对文件的读、访问权限(r-x)。
权限前的字符,表示文件的具体类型,比如 d 表示目录,- 表示普通文件,l 表示连接文件,b 表示设备文件,等等。
但在实际应用中,以上这 3 种身份根本不够用,给大家举个例子。
图 1 ACL 访问控制权限
图 1 的根目录中有一个 /project 目录,这是班级的项目目录。班级中的每个学员都可以访问和修改这个目录,老师需要拥有对该目录的最高权限,其他班级的学员当然不能访问这个目录。
需要怎么规划这个目录的权限呢?应该这样,老师使用 root 用户,作为这个目录的属主,权限为 rwx;班级所有的学员都加入 tgroup 组,使 tgroup 组作为 /project 目录的属组,权限是 rwx;其他人的权限设定为 0(也就是 ---)。这样一来,访问此目录的权限就符合我们的要求了。
有一天,班里来了一位试听的学员 st,她必须能够访问 /project 目录,所以必须对这个目录拥有 r 和 x 权限;但是她又没有学习过以前的课程,所以不能赋予她 w 权限,怕她改错了目录中的内容,所以学员 st 的权限就是 r-x。可是如何分配她的身份呢?变为属主?当然不行,要不 root 该放哪里?加入 tgroup 组?也不行,因为 tgroup 组的权限是 rwx,而我们要求学员 st 的权限是 r-x。如果把其他人的权限改为 r-x 呢?这样一来,其他班级的所有学员都可以访问 /project 目录了。
显然,普通权限的三种身份不够用了,无法实现对某个单独的用户设定访问权限,这种情况下,就需要使用 ACL 访问控制权限。
ACL,是 Access Control List(访问控制列表)的缩写,在 Linux 系统中, ACL 可实现对单一用户设定访问文件的权限。也可以这么说,设定文件的访问权限,除了用传统方式(3 种身份搭配 3 种权限),还可以使用 ACL 进行设定。拿本例中的 st 学员来说,既然赋予它传统的 3 种身份,无法解决问题,就可以考虑使用 ACL 权限控制的方式,直接对 st 用户设定访问文件的 r-x 权限。
开启 ACL 权限
CentOS 6.x 系统中,ACL 权限默认处于开启状态,无需手工开启。但如果你的操作系统不是 CentOS 6.x,可以通过如下方式查看ACL权限是否开启:
[root@localhost ~]# mount
/dev/sda1 on /boot type ext4 (rw)
/dev/sda3 on I type ext4 (rw)
…省略部分输出…
\#使用mount命令可以看到系统中已经挂载的分区,但是并没有看到ACL权限的设置
[root@localhost ~]# dumpe2fs -h /dev/sda3
\#dumpe2fs是查询指定分区文件系统详细信息的命令
…省略部分输出…
Default mount options: user_xattr acl
…省略部分输出…
其中,dumpe2fs 命令的 -h 选项表示仅显示超级块中的信息,而不显示磁盘块组的详细信息;
使用 mount 命令可以查看到系统中已经挂载的分区,而使用 dumpe2fs 命令可以查看到这个分区文件系统的详细信息。大家可以看到,我们的 ACL 权限是 /dev/sda3 分区的默认挂载选项,所以不需要手工挂载。
如果 Linux 系统如果没有默认挂载,可以执行如下命令实现手动挂载:
[root@localhost ~]# mount -o remount,acl /
\#重新挂载根分区,并加入ACL权限
使用 mount 命令重新挂载,并加入 ACL 权限。但使用此命令只是临时生效,要想永久生效,需要修改 /etc/fstab 文件,修改方法如下:
[root@localhost ~]#vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 /ext4 defaults,acl 1 1
\#加入ACL权限
[root@localhost ~]# mount -o remount /
\#重新挂载文件系统或重启系统,使修改生效
在你需要开启 ACL 权限的分区行上(也就是说 ACL 权限针对的是分区),手工在 defaults 后面加入 ",acl" 即可永久在此分区中开启 ACL 权限。