一、什么是ACL(文件访问控制列表)

 

假设用户hadoop在某个公共目录(具有sgid权限的目录)下创建了一个文件/u01/tutor/test/test.txt,那么该文件的属主和属组分别是是hadoophadoop,且该文件的权限为664,即属主属组有读写权限,其他用户有只读权限:

 

[hadoop@localhost tutor]$ ls -ld test

drwxrwxr-x. 2root mygrp 4096 Jul 13 21:34 test


[hadoop@localhost tutor]$ cd test


[hadoop@localhost test]$ touch test.txt


[hadoop@localhost test]$ ll

-rw-rw-r--. 1hadoop hadoop   0 Jul 13 21:36 test.txt
# hadoop用户创建的文件具有664权限

 

现在hadoop用户希望hive用户能够写此文件,但是hive用户对该文件即不是属主也不是属组,而其他用户为只读权限,而hadoop用户又不能修改文件的属主和属组,如果修改了other权限,使其具有写权限,那么除了hive用户外,其他所有的用户都对test.txt文件有写权限了,这样是不合适的。于是这里就需要引入新的机制——ACL(文件访问控制列表)

ACL用于实现在原有的访问控制机制之外补充一种文件访问控制机制

 

二、如何设置ACL(文件控制访问列表)

 

获取文件控制访问列表的方式为:

getfacl FileName

设定文件控制访问列表的命令为setfacl,如果加上-m,就表示设定访问权限,-x表示取消访问权限:

setfacl -m u:USERNAME:MODE FileName

setfacl -m g:GROUPNAME:MODE FileName

如果是取消权限,则无需指定具体的权限,只指定用户名或组名即可:

setfacl -x u:USERNAME:MODE FileName

setfacl -x g:GROUPNAME:MODE FileName

 

现在继续上面的例子:

 

[hadoop@localhost test]$ getfacl test.txt

# file:test.txt
# owner:hadoop
# group:hadoop
user::rw-
group::rw-
other::r--

 

[hadoop@localhost test]$ setfacl -m u:hive:rw- test.txt

# hive用户设定文件访问权限


[hadoop@localhost test]$ getfacl

Usage: getfacl[-aceEsRLPtpndvh] file ...
Try `getfacl--help' for more information.


[hadoop@localhost test]$ getfacl test.txt

# file:test.txt
# owner:hadoop
# group:hadoop
user::rw-
user:hive:rw-
# 可以看到hive用户具有了读写权限
group::rw-
mask::rw-
other::r--

 

用户能否访问文件,需经过以下几重判断:

1、用户是否为文件属主?

2、用户是否有特定的访问控制条目?

3、用户是否属于文件属组?

4、用户所属的组是否有特定的访问控制条目?

5、其它。

 

故上述例子中hive用户对test.txt文件有特定的访问控制条目,故可以进行读写操作:

[hadoop@localhost test]$ exit

exit


[root@localhost test]# su openstack

# 切换到openstack用户


[openstack@localhost test]$ echo Hello >> test.txt

bash:test.txt: Permission denied
# openstack用户无法对test.txt文件进行写操作


[openstack@localhost test]$ exit

exit

[root@localhost test]# su hive


[hive@localhost test]$ echo Hello >> test.txt


[hive@localhost test]$ cat test.txt

Hello
# hive用户可以对test.txt文件进行写操作


 现在hadoop用户想要取消hive用户对test.txt文件的写权限,那么可以进行如下操作:


[hive@localhost test]$ exit

exit

[root@localhost test]# su hadoop


[hadoop@localhost test]$ setfacl -x u:hive test.txt

# 取消hive用户的权限,无需指定具体的权限


[hadoop@localhost test]$ getfacl test.txt

# file:test.txt
# owner:hadoop
# group:hadoop
user::rw-
group::rw-
mask::rw-
other::r--

[hadoop@localhost test]$ exit

exit


[root@localhost test]# su hive


[hive@localhost test]$ echo World >> test.txt

bash:test.txt: Permission denied
# hive用户不能再对test.txt进行写操作了。


三、挂载设备的文件控制访问列表

并不是在任何情况下都可以设置文件访问控制列表的,现在看下面这个例子:

 

[root@localhost ~]# df -lh

Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root   23G 4.5G   17G  22% /
tmpfs                         499M  268K 498M   1% /dev/shm
/dev/sda1                     485M   35M 426M   8% /boot
/dev/sdb3                     9.9G   36M 9.7G   1% /mydata
# 可以看到/dev/sdb3这个设备挂载到了/mydata目录下
/dev/sr0                      288K  288K    0 100% /media/20140715_2041

 

[root@localhost ~]# cd /mydata


[root@localhost mydata]# ll

total 13
-rw-r--r--. 1root root   884 Jul 11 02:11 inittab
drwx------. 2root root 12288 Jul 11 01:09 lost+found

 

[root@localhost mydata]# getfacl inittab

# file:inittab
# owner: root
# group: root
user::rw-
group::r--
other::r--
# 进入/mydata目录,查看inittab这个文件的文件控制访问列表


 [root@localhost mydata]# setfacl -m u:hadoop:rw inittab

setfacl:inittab: Operation not supported
# 无法为用户hadoop指定特殊访问权限

 

注意:任何挂载的设备,默认是不支持ACL(文件控制访问列表)的

 

如果要让挂载的设备支持ACL,可以有以下几种方案:

 

A. 手动设置挂载选项

手动设置挂载选项,使其支持ACL,是指在挂载设备时通过选项来指定acl

mount -o acl DEVICE MOUNT_POINT

 

接上文的例子:

[root@localhost mydata]# cd


[root@localhost ~]# umount /mydata


[root@localhost ~]# mount -o acl /dev/sdb3 /mydata


[root@localhost ~]# mount

/dev/mapper/VolGroup-lv_rooton / type ext4 (rw)
proc on /proctype proc (rw)
sysfs on /systype sysfs (rw)
devpts on/dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on/dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on/boot type ext4 (rw)
none on/proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemonon /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sr0 on/media/20140715_2041 type iso9660(ro,nosuid,nodev,uhelper=udisks,uid=0,gid=0,iocharset=utf8,mode=0400,dmode=0500)
/dev/sdb3 on/mydata type ext4 (rw,acl)
# 挂载的设备/dev/sdb3多了一项acl


[root@localhost ~]# cd /mydata


[root@localhost mydata]# setfacl -m u:hadoop:rw- inittab

# 此时可以设定acl


[root@localhost mydata]# getfacl inittab

# file:inittab
# owner: root
# group: root
user::rw-
user:hadoop:rw-
# hadoop用户对inittab具有了读写权限
group::r--
mask::rw-
other::r--

 

B.修改配置环境:

上述操作为手动设置挂载设备的acl选项,如果希望开机自动挂载设备时也支持acl,就需要编辑/etc/fstab,在挂载选项后面附加acl选项:

 

 [root@localhostmydata]# vim /etc/fstab

#
# /etc/fstab
# Created byanaconda on Wed Jul  9 21:21:40 2014
#
# Accessiblefilesystems, by reference, are maintained under '/dev/disk'
# See manpages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root/            ext4    defaults        1 1
UUID=d9512fb3-8dd6-4613-ae55-8e99ba0ef627/boot  ext4  defaults   1 2
/dev/mapper/VolGroup-lv_swapswap                swap  defaults   0 0
tmpfs                   /dev/shm                tmpfs  defaults  0 0
devpts                  /dev/pts        devpts  gid=5,mode=620   0 0
sysfs                   /sys            sysfs   defaults         0 0
proc                    /proc            proc   defaults         0 0
/dev/sdb3               /mydata      ext4  defaults,noatime,acl  0 0
# 在defaluts后面加上acl,就可以实现自动挂载时支持acl了
LABEL="NEWSWAP"         swap            swap    defaults         0 0

 

C. 使用tune2fs命令来指定acl

除了修改使用修改配置环境的方法,还可以使用tune2fs命令来实现挂载设备支持acl

tun2efs -o acl DEVICE

如果要取消默认的挂载选项,则使用:

tun2efs -o ^acl DEVICE

 

演示实例如下:

[root@localhost mydata]# man tune2fs

TUNE2FS(8)                                                         TUNE2FS(8)

NAME

       tune2fs - adjust tunable filesystemparameters on ext2/ext3/ext4 filesystems

  -o [^]mount-option[,...]  Set or  clear  the indicated default mount options in thefilesystem.

# 使用-o选项,可以设置挂载选项,如果加上[^]脱字符,就能取消相应的挂载选项

 

[root@localhost ~]# umount /dev/sdb3


[root@localhost ~]# mount /dev/sdb3 /mydata


[root@localhost ~]# cd /mydata


[root@localhost mydata]# setfacl -m u:hive:rw- inittab

setfacl:inittab: Operation not supported
# 重新挂载/dev/sdb3之后,默认无法设置文件访问控制列表


[root@localhost mydata]# cd


[root@localhost ~]# tune2fs -o acl /dev/sdb3

tune2fs1.41.12 (17-May-2010)
# 使用tune2fs -o来指定挂载选项


[root@localhost ~]# tune2fs -l /dev/sdb3

tune2fs1.41.12 (17-May-2010)
Filesystemvolume name:   MYDAT
Last mountedon:          /mydata
Default mountoptions:    acl
# 默认挂载选项为acl
Filesystemstate:         clean

 

[root@localhost ~]# umount /dev/sdb3


[root@localhost ~]# mount /dev/sdb3 /mydata


[root@localhost ~]# cd /mydata

# 重新挂载/dev/sdb3,并进入/mydata目录


[root@localhost mydata]# setfacl -m u:hive:rw- inittab


[root@localhost mydata]# getfacl inittab

# file:inittab
# owner: root
# group: root
user::rw-
user:hive:rw-
group::r--
mask::rw-
other::r--
# 这次能够成功设置acl了

 

如果要取消acl,则可以使用^设定:


[root@localhost mydata]# cd


[root@localhost ~]# tune2fs -o ^acl /dev/sdb3

tune2fs1.41.12 (17-May-2010)


[root@localhost ~]# tune2fs -l /dev/sdb3

tune2fs1.41.12 (17-May-2010)
Filesystemvolume name:   MYDAT
Last mountedon:          /mydata
Default mountoptions:    (none)
# 这次没有acl项了
FilesystemUUID:         ead64b7a-80bd-4ad7-af3f-bece9a76e04c

[root@localhost mydata]# cd


[root@localhost ~]# umount /dev/sdb3


[root@localhost ~]# mount /dev/sdb3 /mydata


[root@localhost ~]# cd /mydata


[root@localhost mydata]# setfacl -m u:hive:rw- inittab

setfacl:inittab: Operation not supported
# 无法再为hive用户指定acl了

 

四、不允许某个用户访问文件


上文介绍的都是为某个用户提供特殊的访问权限,如果现在不想让某个用户具有任何访问权限,则可以使用setfacl -m u:USERNAME:--- FileName


hadoop用户不希望hive用户有任何权限,可以进行如下操作:


[root@localhost tutor]# cd test


[root@localhost test]# su hadoop


[hadoop@localhost test]$ setfacl -m u:hive:--- test.txt


[hadoop@localhost test]$ exit

exit


[root@localhost test]# su hive


[hive@localhost test]$ cat test.txt

cat: test.txt:Permission denied