一、什么是ACL(文件访问控制列表)
假设用户hadoop在某个公共目录(具有sgid权限的目录)下创建了一个文件/u01/tutor/test/test.txt,那么该文件的属主和属组分别是是hadoop和hadoop,且该文件的权限为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