我们举个例子,A开发小组共同开发一个项目,其中项目中有个问题需要B小明的小黑来帮忙处理,此时A组同事不想把小黑加入到A组,因为这样小黑拥有了A组操作项目的所有权限,但是也不能把项目文件权限完全开放,这样所有人都可操作了。那怎么分配权限呢?acl就运用而生了,我们通过acl指定用户添加指定的权限。

ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。

本文的演示环境为 centos7.4

acl可以帮我们完成这些:

  1. 可以针对用户来设置权限
  2. 可以针对用户组来设置权限
  3. 子文件/目录继承父目录的权限

检查是否支持ACL

ACL需要Linux内核和文件系统的配合才能工作,当前我们能见到的大多数Linux发行版本默认都是支持的。但最好还是能够先检查一下:

 tune2fs -l /dev/vda1 |grep 'Default mount'
 Default mount options:    user_xattr acl

我们能够看到默认情况下(Default mount options:)已经加入acl支持了

我们可以使用setfaclgetfacl命令来设置或观察文件/目录的acl权限

setfacl :

setfacl [-bkRd] [{-m|-x} acl参数] 文件/目录名
-m :更改文件和目录的 ACL 权限,不可与 -x 合用;
-x :删除指定[用户或者组]的acl权限 ,不可与 -m 合用;
-b :删除所有的acl权限  命令后直接 跟 -b 文件名,删除这个文件名的所有acl权限
-k :删除默认acl权限
-R :递归设定acl权限
-d :配置“默认 acl 权限”,只对目录有效,在该目录新建的数据会引用此默认值;

-m参数说明:

  • 当一个用户或组的 ACL 权限不存在时,-m 选项执行的是添加操作
  • 如果一个用户或组的 ACL 权限已经存在时,-m 选项执行的是更新操作

下面我们来演示一下setfacl的使用:

当前登录用户是root,我们再创建两个用户 test1test2 来进行测试

 useradd  test1
 useradd  test2

创建一个aclfile文件用来测试权限

touch aclfile

先查看一下默认的权限信息:

getfacl aclfile

# file: my.cnf
# owner: root
# group: root
user::rw-
group::r--
other::r--

我们切换用户到test1,来操作aclfile

echo 'hello my name is test1' >> aclfile

-bash: aclfile: 权限不够

上述命令,提示我们权限不够,这是因为其他用户没有写权限。

我们来为test1用户赋予aclfile的写权限:

setfacl -m u:test1:rw aclfile

修改成功后再次以 test1 用户的身份向 aclfile 文件写入数据,这次已经可以正常写入了。查看 aclfile文件的权限:

 ls -l aclfile
 -rw-rw-r--+ 1 root root 28 May 13 11:44 aclfile
 #在描述权限的地方多出了一个 “+” 号

使用getfacl 查看:

getfacl aclfile
# file: aclfile
# owner: root
# group: root
user::rw-
user:test1:rw-  #新添加的一行
group::r--
mask::rw-
other::r--

通过getfacl查看发现权限信息中多出了一行,user:test1:rw-就是它让用户 test1 具有了读写 aclfile 的权限。

针对用户组来设置权限和针对用户的设置几乎一样,只是把小写的 u 换成小写的 g 就行了。

我们来看另外一个例子:

使用 -d参数使子文件/目录继承父目录的权限

切换到root用户在根目录创建一个文件夹 demo ,然后为用户test1设置读写权限

mkdir demo
setfacl -m d:u:test1:rw demo

查看权限信息:

getfacl demo
# file: demo
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx      #新增
default:user:test1:rwx #新增
default:group::r-x     #新增
default:mask::rwx      #新增
default:other::r-x     #新增

这次多出了一些以default 开头的行,这些 default 权限信息只能在目录上设置,然后会被目录中创建的文件和目录继承。下面分别在demo目录下创建文件 testfile 和目录 testdir,并查看它们的 acl 权限:

getfacl testfile
# file: testfile
# owner: root
# group: root
user::rw-
user:test1:rwx                  #effective:rw-
group::r-x                      #effective:r--
mask::rw-
other::r--

从上图可以看到文件 testfile继承了父目录的 acl 权限,因此用户 test1 对它有读写权限

再看testdir目录:

getfacl testdir/
# file: testdir/
# owner: root
# group: root
user::rwx
user:test1:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:test1:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

从图中可以看出,testdir 目录不仅继承了 test1 的访问权限,还继承了父目录上的 default权限。也就是说我们通过这种方式设置目前权限,其子目录权限会被递归继承下去。

删除 ACL 权限:

我们可以通过 setfacl 命令的 -x 选项来删除指定用户或组的 ACL 权限,还可以通过 -b 选项来清除文件和目录上所

有的 ACL 权限。

setfacl -x u:test1 aclfile

此时,test1 用户 已经没有对aclfile的写权限了。

删除aclfile的所有acl权限:

 setfacl -b aclfile

上述命令对于目录同样适用。

权限备份与恢复:

将当前目录下所有文件权限信息写入文件permissions

getfacl -R ./ > permissions 

然后我们随意改下目录中文件权限,然后再进行恢复:

setfacl --restore permissions

之前改动的 权限全都恢复回来了!


Leave Your Comment

电子邮件地址不会被公开。 必填项已用*标注