/article/2017/06/18/linux-facl/

linux强大的facl功能

  • 【作者】看不见我
  • 【分类】Linux
  • 【发布】2017-06-18 12:06
  • 【更新】2017-11-11 10:57

facl

POSIX Access Control Lists

Linux ACL 权限控制:
ACL即Access Control List 主要的目的是提供传统的owner,group,others的read,write,execute权限之外的具体权限设置, ACL可以针对单一用户、单一文件或目录来进行r,w,x的权限控制,对于需要特殊权限的使用状况有一定帮助。 如,某一个文件,不让单一的某个用户访问。

facl support

要使用ACL必须要有文件系统支持才行,目前绝大多数的文件系统都会支持,EXT3文件系统默认启动ACL的。

ext4文件系统:

# 查看EXT4文件系统是否支持ACL:
dumpe2fs -h /dev/sda2
# 检查mount options选项: Default mount options:    user_xattr acl

# 如果UNIX支持ACL但是文件系统并不是默认加载此功能,可自己进行添加
mount -o acl /dev/sda1 /export1
mount -o remount,acl /data

xfs文件系统:xfs系统已经强制开启了ACL权限了。

facl soft

libacl (库) - /lib64/libacl.so.1 - /lib64/libacl.so.1.1.0

libacl-devel (库) - /lib64/libacl.so - /usr/include/acl - /usr/include/acl/libacl.h - /usr/include/sys/acl.h - /usr/lib64/libacl.a - /usr/lib64/libacl.so

acl (包) - /usr/bin/chacl - /usr/bin/getfacl - /usr/bin/setfacl

facl command

  • getfacl:取得某个文件/目录的ACL设置项目
  • setfacl:设置某个文件/目录的ACL设置项目

◆ getfacl

getfacl命令

Usage: getfacl [-aceEsRLPtpndvh] file ...

◆ setfacl

setfacl命令

Usage: setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...

OPTION参数:
  -h                 显示帮助信息
  -m acl_spec        设置后续的acl参数,不可与'-x'一起使用
  -M acl_spec_file   根据提供的acl_spec_file文件中的acl设置文件权限
  -x acl_spec        删除后续的acl参数,不可与'-m'一起使用
  -X acl_spec_file   根据提供的acl_spec_file文件中的acl设置文件权限
  -b                 删除所有的acl参数,参数单独使用
  -k                 删除默认的acl参数,参数单独使用
  -R                 递归设置acl参数
  -d                 设置默认的acl参数,只对目录有效,作用使目录下新
                     建的子目录和文件继承父目录的默认acl权限

  acl_spec_file的内容就是权限内容

acl_spec格式:
  [d:]u:[username|uid]:perms
  [d:]g:[groupname|gid]:perms
  [d:]o::perms
  [d:]m::perms

  perms: 权限内容是‘rwx-’中的3位组合
      ---
      rwx
      r-x

setfacl详解

# 对特殊用户设置的facls,如果不指定用户则对文件本身生效,同chmod设置。
setfacl -m u:antony:rw /mnt/gluster/data/testfile

# 对用户组设置的facls,如果不指定用户组则对文件本身生效,同chmod设置。
setfacl -m g:usergroup:rw /mnt/gluster/data/testfile

# 针对有效权限设置的facls
# 有效权限(mask)就是acl权限设置的极限值,也就是所设置的acl权限
# 一定是mask的一个子集,如果超出mask范围会将超出的权限去掉.
setfacl -m m::rw /PATH/TO/DIR_OR_FILE

# 设置目录下的新建的文件或子目录的默认ACLs权限
# 针对一个目录为一个用户(组)设置特定权限,但是如果这个目录下在
# 新创建的文件是不具有这些针对这个用户的特定权限的。为了解决这个
# 问题,就需要设置默认 acl 权限,使这个目录下新创建的文件有和目录
# 相同的默认ACL特定权限。因此该设置只能设置目录。
setfacl -m d:u:antony:rw /mnt/gluster/data/dirname
setfacl -d -m u:antony:rw /path/to//dirname

# Removing POSIX ACLs
# 移除已设置的POSIX ACLs权限方式
setfacl -x u:antony /mnt/gluster/data/test-file
setfacl -x g:usergroup:rw /mnt/gluster/data/testfile

# 删除文件权限列表,一下子就全删了,+号都没有了
setfacl -b /path/to/name

# 删除默认的acl参数,会删除默认(defaultt)的权限列表
setfacl -k /path/to/dirname

◆ 查看权限列表

[user@linux Desktop]$ ls  -l  file 
-rw-rw-r--      .      1 root group1 0 Nov  7 15:13 file

# 如果此位为 “.”  代表这位没有权限列表
# 如果此位为 “+”  代表有权限列表存在

facl useful

搞定开发项目的目录权限:

chown -R root:www /www                         #确定目录属组
chmod 2775 /www                                #目录属组下文件及目录使用共享组权限
find /www -type d -exec chmod -v 2775 {} \;    #目录属组下文件及目录使用共享组权限
find /www -type f -exec chmod -v ug+rw {} \;   #目录下文件使用组共享写权限
setfacl -R -m d:u::rwx /www                    #配置该目录下创建目录或文件时的默认权限
setfacl -R -m d:g::rwx /www                    #配置该目录下创建目录或文件时的默认权限
setfacl -R -m d:o::rx /www                     #配置该目录下创建目录或文件时的默认权限
setfacl -R -m d:m::rwx /www                    #配置该目录下创建目录或文件时的默认权限
setfacl -R -m d:g:www:rwx /www                 #配置该目录下创建目录或文件时的默认权限 

# 这样设置完后,以后给linux账号加权限只要添加属组就够了:
usermod -a -G www Username

reference

http://www.linuxidc.com/Linux/2013-07/88049.htm
http://wiki.jikexueyuan.com/project/learn-linux-step-by-step/acl-permission-control.html

Top