本文为转载。
LINUX ACL 学习笔记
一、 为什么要使用ACL
先让我们来简单地复习一下Linux的文件权限。
在 linux下,对一个文件(或者资源)可以进行操作的对象被分为三类: file owner(文件
的拥有者),group(组,注意不一定是文件拥有者所在的组), other (其他)而对于每一类
别又分别定义了read, write and execute/search 权限 (这里不讨论SUID, SGID以及
Sticky bit的设置)
通过ls -l命令就我们就可以列出一个文件的权限
代码:
[leonard@localhost ~]$ ls -l
-rw-rw---- 1 leonard admin 0 Jul 3 20:12 test.txt
在这里说明了对于test.txt这个文件leonard用户(由于是file owner)拥有read & write
权限. 所有属于admin 组的用户(group)拥有read & write 权限. 其他任何用户(other)
对于文件没有任何的权限
如果我们现在希望john这个用户也可以对test.txt文件进行读写操作. 我自己大概会想到
以下几种办法 (这里假设john不属于admin group)
1. 给文件的other类别增加读和写的权限. 这样由于john会被归为other类别,那么
他也将拥有读写的权限。
2. 将john加入到admin group. 那么john会被归为group类别,那么他将拥有读写的权限。
3. 设置sudo, 使john能够以leonard的身份对test.txt进行操作,从而获得读写权限。
第一种做法的问题在于所有用户都将对test.txt拥有读写操作,显然这种做法不可取。
第二种做法的问题在于john被赋予了过多的权限.所有属于admin组的文件,john都可以拥
有其等同的权限了。
第三种做法虽然可以达到只限定john用户一人拥有对test.txt文件的读写权限.但是需要
对sudoers文件进行严格的格式控制. 而且当文件数量和用户很多的时候,这种方法就相当
地不灵活了。
看来好像都没有一个很好的解决方案. 其实问题就出在Linux 文件权限里面,对于other的
定义过于广泛,以至于很难把权限限定于一个不属于file owner和group的用户身上. 那么
Access Control List (ACL)就是用来帮助我们解决这个问题的。
简单地来说ACL就是可以设置特定用户或者用户组对于一个文件/文件夹的操作权限. 需要
掌握的命令也只有三个: getfacl, setfacl, chacl
在接下去讨论之前大家可以先安装上ACL的RPM包
代码:
# rpm -ivh libacl-2.2.39-1.1 acl-2.2.39-1.1.i386.rpm
如果配置好了yum可以直接安装这两个包
# yum -y install libacl acl
另外还需要磁盘分区的支持
永久启用acl。我这里以自己的分区/data为例
# vi /etc/fstab
LABEL=/data /data ext3 defaults,acl 1 2
在启用了acl参数之后重新加载/data分区
# mount -o remount /data
# cat /etc/mtab | grep /data
/dev/sda5 /data ext3 rw,acl 0 0
出现上面的信息代表分区的acl功能已经正常加载
二、ACL的名词定义
先来看看在ACL里面每一个名词的定义.这些名词我大多从man page上摘下来虽然有些枯燥,
但是对于理解下面的内容还是很有帮助的
ACL 是由一系列的Access Entry所组成的. 每一条Access Entry定义了特定的类别可以对
文件拥有的操作权限. Access Entry有三个组成部分: Entry tag type, qualifier
(optional), 权限
我们先来看一下最重要的Entry tag type, 它有以下几个类型
ACL_USER_OBJ: 相当于Linux里file_owner的权限
ACL_USER: 定义了额外的用户可以对此文件拥有的权限
ACL_GROUP_OBJ: 相当于Linux里group的权限
ACL_GROUP: 定义了额外的组可以对此文件拥有的权限
ACL_MASK: 定义了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限 (这个我下面还会专门讨论)
ACL_OTHER: 相当于Linux里other的权限
让我们来据个例子说明一下. 下面我们就用getfacl命令来查看一个定义好了的ACL文件
代码:
[root@zyq-server data]# getfacl test.txt
# file: test.txt
# owner: root
# group: family
user::rw-
user:zyq:rw-
group::rw-
group:jackuser:rw-
mask::rw-
other::---
前面三个以#开头的定义了文件名,文件所有者和文件拥有组. 这些信息没有太大的作用,我
们可以用 --omit-header来省略掉
user::rw- 定义了ACL_USER_OBJ, 说明file owner拥有读和写的权限
user:zyq:rw- 定义了ACL_USER,这样用户zyq就拥有了对文件的读写权限,实现了我们一开始要达到的目的
group::rw- 定义了ACL_GROUP_OBJ,说明文件的group拥有read和write 权限
group: jackuser:rw- 定义了ACL_GROUP,使得jackuser组拥有了对文件的read 和write权限
mask::rw- 定义了ACL_MASK的权限为read and write
other::--- 定义了ACL_OTHER的没有任何权限操作此文件
从这里我们就可以看出ACL提供了我们可以定义特定用户和用户组的功能. 那么接下来我们就来
看一下如何设置一个文件的ACL
三、 如何设置ACL文件
首先我们还是要讲一下设置ACL文件的格式. 从上面的例子中我们可以看到每一个Access Entry
都是由三个被:号分隔开的字段所组成. 第一个就是Entry tag type
user 对应了ACL_USER_OBJ和ACL_USER
group 对应了ACL_GROUP_OBJ和ACL_GROUP
mask 对应了ACL_MASK
other 对应了ACL_OTHER
第二个字段称之为qualifier.也就是上面例子中的zyq和jackuser组.它定义了特定用户和用户组
对于文件的权限.这里我们也可以发现只有user和group才有qualifier,其他的都为空
第三个字段就是我们熟悉的权限了. 它和Linux的权限一样定义,这里就不多讲了
下面我们就来看一下怎么设置test.txt这个文件的ACL让它来达到我们上面的要求
一开始文件没有ACL的额外属性
代码:
[root@zyq-server data]# ll test.txt
-rw-r--r-- 1 root root 0 12-27 22:55 test.txt
[root@zyq-server data]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@zyq-server data]# getfacl -c test.txt
user::rw-
group::r--
other::r--
我们先让用户zyq拥有对test.txt文件的读写权限
代码:
[root@zyq-server data]# setfacl -m u:zyq:rw test.txt
[root@zyq-server data]# getfacl -c test.txt
user::rw-
user:zyq:rw-
group::r--
mask::rw-
other::r--
这时我们就可以看到zyq用户在ACL里面已经拥有了对文件的读写权限. 这个时候如果我们
查看一下linux的权限我们还会发现一个不一样的地方
代码:
[root@zyq-server data]# ll test.txt
-rw-rw-r--+ 1 root root 0 12-27 22:55 test.txt
在文件权限的最后多了一个+号. 当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后我
们就可以称它为ACL文件.这个+号就是用来提示我们的
我们还可以发现当一个文件拥有了ACL_USER或者ACL_GROUP的值时ACL_MASK同时也会被定义
接下来我们来设置jackuser组拥有read 权限
代码:
[root@zyq-server data]# ll test.txt
-rw-rw-r--+ 1 root root 0 12-27 22:55 test.txt
[root@zyq-server data]#
[root@zyq-server data]# setfacl -m g:jackuser:r test.txt
[root@zyq-server data]# getfacl -c test.txt
user::rw-
user:zyq:rw-
group::r--
group:jackuser:r--
mask::rw-
other::r--
[root@zyq-server data]# ll test.txt
-rw-rw-r--+ 1 root root 0 12-27 22:55 test.txt
到这里就完成了我们上面讲到的要求.是不是很简单呢
四、ACL_MASK 和 Effective 权限
这里需要重点讲一下ACL_MASK, 因为这是掌握ACL的另一个关键
在Linux 文件权限里面大家都知道比如对于rw-rw-r--来说, 第二组中的那个rw-是指文件
组的权限. 但是在ACL里面这种情况只是在ACL_MASK不存在的情况下成立. 如果文件有ACL_MASK
值,那么当中那个rw-代表的就是mask值而不再是group 权限了
让我们来看下面这个例子
代码:
[root@zyq-server data]# ll test.sh
-rwxrw-r-- 1 root family 0 12-27 23:04 test.sh
这里说明test.sh文件只有file owner: root拥有read, write, execute/search 权限. Family
组只有读和写的权限。现在我们想让用户zyq也对test.sh具有和root一样的权限。
代码:
[root@zyq-server data]# setfacl -m u:zyq:rwx test.sh
[root@zyq-server data]# getfacl -c test.sh
user::rwx
user:zyq:rwx
group::rw-
mask::rwx
other::r--
这里我们看到zyq已经拥有了rwx的权限. mask值也被设定为rwx.那是因为它规定了ACL_USER,
ACL_GROUP和ACL_GROUP_OBJ的最大值
现在我们再来看test.sh的Linux 权限, 它已经变成了
代码:
[root@zyq-server data]# ll test.sh
-rwxrwxr--+ 1 root family 0 12-27 23:04 test.sh
那么如果现在family组的用户想要执行test.sh的程序会发生什么情况呢? 它会被权限 deny.原
因在于实际上family组的用户只有读和写的权限.这里当中显示的rwx是ACL_MASK的值而不是group
的权限
所以从这里我们就可以知道,如果一个文件后面有+标记,我们都需要用getfacl来确认它的权
限,以免发生混淆
下面我们再来继续看一个例子
假如现在我们设置test.sh的mask为read only,那么family组的用户还会有write 权限吗?
代码:
[root@zyq-server data]# setfacl -m mask::r test.sh
[root@zyq-server data]# getfacl -c test.sh
user::rwx
user:zyq:rwx #effective:r--
group::rw- #effective:r--
mask::r--
other::r--
这时候我们可以看到ACL_USER和ACL_GROUP_OBJ旁边多了个#effective:r--, 这是什么意思呢?
让 我们再来回顾一下ACL_MASK的定义. 它规定了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大
权限.那么在我们这个例子中他们的最大权限也就是read only.虽然我们这里给ACL_USER和ACL_GROUP_OBJ
设置了其他权限,但是他们真正有效果的只有read权限.
这时我们再来查看test.sh的Linux 文件权限时它的group 权限也会显示其mask的值(i.e. r--)
代码:
[root@zyq-server data]# ll test.sh
-rwxr--r--+ 1 root family 0 12-27 23:04 test.sh
五、 Default ACL
上面我们所有讲的都是Access ACL, 也就是对文件而言. 下面我简单讲一下Default ACL. Default ACL
是指对于一个目录进行Default ACL设置,并且在此目录下建立的文件都将继承此目录的ACL
同样我们来做一个试验说明
比如现在leonard用户建立了一个dir目录
代码:
[root@zyq-server data]$ mkdir mydir
我希望所有在此目录下建立的文件都可以被smbuser用户所访问. 那么我们就应该对mydir目录设置Default ACL
我 先利用root用户在/data/创建一个mydir的文件夹,然后将这个文件夹的default user权限设置为smbuser可以rw- 以root身份在mydir目录下创建一个test.txt的文件。其他的不做限制,然后切换到smbuser。发现smbuser用户可以修改 test.txt文件中的内容但是无法在mydir目录中创建和删除文件/文件夹
代码:
[root@zyq-server data]# id
uid=0(root) gid=0(root) groups=0(root)
[root@zyq-server data]# ll mydir/
总计 0
[root@zyq-server data]# getfacl mydir/
# file: mydir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
[root@zyq-server data]# setfacl -m d:smbuser:rw mydir/
[root@zyq-server data]# getfacl mydir/
# file: mydir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:smbuser:rw-
default:group::r-x
default:mask::rwx
default:other::r-x
[root@zyq-server data]# cd mydir/
[root@zyq-server mydir]# touch test.txt
[root@zyq-server mydir]# su - smbuser
[smbuser@zyq-server ~]$ cd /data/mydir/
[smbuser@zyq-server mydir]$ touch a
touch: 无法创建 “a”: 权限不够
[smbuser@zyq-server mydir]$ rm test.txt
rm: 无法删除 “test.txt”: 权限不够
[smbuser@zyq-server mydir]$ echo hello world>>test.txt
[smbuser@zyq-server mydir]$ cat test.txt
hello world
这 里我们可以看到ACL定义了default选项, smbuser用户拥有了default的read, write, excute/search 权限.但是却无法删除和创建文件。经过试验,发现还必须将mydir目录的ACL_USER修改为smbuser后,切换到smbuser用户才能够在 mydir目录中创建和删除文件/文件夹
[root@zyq-server data]# setfacl -m u:smbuser:rwx mydir/
[root@zyq-server data]# getfacl -c mydir/
user::rwx
user:smbuser:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:smbuser:rw-
default:group::r-x
default:mask::rwx
default:other::r-x
[root@zyq-server data]# su - smbuser
[smbuser@zyq-server ~]$ cd /data/mydir/
[smbuser@zyq-server mydir]$ touch a
[smbuser@zyq-server mydir]$ ll
总计 4
-rw-rw-r--+ 1 smbuser family 0 12-27 23:43 a
-rw-rw-r--+ 1 root root 19 12-27 23:33 test.txt
[smbuser@zyq-server mydir]$ rm * -rf
[smbuser@zyq-server mydir]$
下面的试验我们看到在mydir下建立的文件或文件夹都自动的加上了default的权限
[root@zyq-server mydir]# su - smbuser
[smbuser@zyq-server ~]$ cd /data/mydir/
[smbuser@zyq-server mydir]$ ll
总计 0
-rw-rw-r--+ 1 root root 0 12-27 23:48 a
-rw-rw-r--+ 1 root root 0 12-27 23:48 test.tt
[smbuser@zyq-server mydir]$ rm * -rf
[smbuser@zyq-server mydir]$ touch test.txt
[smbuser@zyq-server mydir]$ ll
总计 0
-rw-rw-r--+ 1 smbuser family 0 12-27 23:48 test.txt
[smbuser@zyq-server mydir]$ getfacl -c test.txt
user::rw-
user:smbuser:rw-
group::r-x #effective:r--
mask::rw-
other::r--
[smbuser@zyq-server mydir]$ mkdir smbuserdir
[smbuser@zyq-server mydir]$ getfacl -c smbuserdir/
user::rwx
user:smbuser:rw-
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:smbuser:rw-
default:group::r-x
default:mask::rwx
default:other::r-x
[smbuser@zyq-server mydir]$ ll
总计 4
drwxrwxr-x+ 2 smbuser family 4096 12-27 23:49 smbuserdir
-rw-rw-r--+ 1 smbuser family 0 12-27 23:48 test.txt
六、 ACL 相关命令
前 面的例子中我们都注意到了getfacl命令是用来读取文件的ACL, setfacl是用来设定文件的Acess ACL. 这里还有一个chacl是用来改变文件和目录的Access ACL and Default ACL. 它的具体参数大家可以去看man page. 我只想提及一下chacl -B. 它可以彻底删除文件或者目录的ACL属性(包括Default ACL). 比如你即使用了setfacl -x删除了所有文件的ACL属性,那个+号还是会出现在文件的末尾.所以正确的删除方法应该是用chacl -B
用cp来复制文件的时候我们现在可以加上-p选项.这样在拷贝文件的时候也将拷贝文件的ACL属性.对于不能拷贝的ACL属性将给出警告
mv命令将会默认地移动文件的ACL属性. 同样如果操作不允许的情况下会给出警告
七. 需要注意的几点
如果你的文件系统不支持ACL的话,你也许需要重新mount你的file system
mount -o remount, acl [mount point]
如果用chmod命令改变Linux 文件权限的时候相应的ACL值也会改变.反之改变ACL的值,相应的文件权限也会改变
八. 参考资料
相关推荐
锐捷交换机访问控制列表(Access Control List, ACL)是一种强大的网络管理工具,它允许管理员对网络流量进行精细控制,以实现安全策略、流量管理和优化。在锐捷交换机上配置基于时间的ACL,可以进一步细化策略,...
思科ACL基本配置 思科ACL(Access Control List,访问控制列表)是一种网络安全机制,用于控制网络流量和访问权限。思科ACL可以分为标准ACL、扩展ACL和命名ACL三种类型,每种类型都有其特点和应用场景。 标准ACL ...
### 华为S5700交换机VLAN划分与ACL配置详解 #### 一、华为S5700交换机简介 华为S5700系列交换机是一款多功能、高性能的企业级接入层交换机,支持多种管理和安全特性,如IPv6、PoE+、集成Wi-Fi等,适用于中小型企业...
【访问控制列表(ACL)配置方法】 访问控制列表(Access Control List,简称ACL)是网络设备,特别是路由器和交换机上的一种安全机制,用于控制网络流量的进出,以实现访问控制和网络安全策略。通过配置ACL,可以...
ACL 和前缀列表区别详解 在网络路由中,ACL(Access Control List)和前缀列表(prefix-list)都是常用的路由条目过滤和处理工具,但是它们在实现路由条目抓取和过滤方面有着不同的特点和应用场景。 一、ACL 的...
基于acl库封装的redis client vs2010工程; 运行时解压到: redis-acl\lib_acl_cpp\samples\redis路径下,把lib_acl_vc2010d.lib、lib_acl_cpp_vc2010d.lib放到 \redis-acl\lib_acl_cpp\samples\redis\redisclient...
ACL,即访问控制列表,是网络管理中一种重要的安全机制,用于实现对网络流量的精细化控制。ACL的基本工作原理是通过一系列预定义的规则来决定数据包是否可以通过网络设备,以此来分配带宽资源,保障局域网的安全。 ...
"H3C交换机典型配置举例-6W100-ACL典型配置举例" 本文将详细介绍H3C交换机中的ACL(Access Control List,访问控制列表)典型配置举例,包括允许指定的主机访问网络和拒绝指定的主机访问网络两种配置举例。 首先,...
本实验"使用基本ACL限制公司网络访问"旨在让学生深入理解并掌握如何通过访问控制列表(ACL)来实现这一目标。实验主要涉及了eNSP(Enterprise Network Simulation Platform,企业网络模拟平台)、ACL、VLAN以及三层...
NAT + VLAN + ACL 管理企业网络 在企业中实现网络管理是非常重要的,因为企业中有多个部门,每个部门都有其特定的需求和权限。为了满足这些需求,我们可以使用 NAT、VLAN 和 ACL 技术来管理企业网络。 首先,让...
cisco最完美的ACL配置详解及配置全过程cisco最完美的ACL配置详解及配置全过程cisco最完美的ACL配置详解及配置全过程cisco最完美的ACL配置详解及配置全过程cisco最完美的ACL配置详解及配置全过程cisco最完美的ACL配置...
在 CakePHP 中,Access Control List(ACL,访问控制列表)是一个强大的工具,用于管理用户对资源的访问权限。本教程将深入探讨CakePHP的ACL系统,以便你能够有效地实现安全的用户权限管理。 **1. ACL基本概念** ...
**H3C ACL包过滤基础配置案例详解** 在H3C网络设备中,访问控制列表(ACL)是一种重要的网络安全和流量管理工具,用于定义网络流量的过滤规则。本文档将详细讲解一个基于H3C设备的ACL包过滤基础配置案例,适用于H3...
ACL 配置实验报告 本实验报告的主要目的是了解并掌握路由器上的标准 ACL 配置,实现网段间互访的安全控制。通过本次实验,我们可以深入理解包过滤防火墙的工作原理,并掌握路由器上的标准 ACL 规则及配置。 一、...
在这个更新中,RocketMQ Console增加了两个重要的安全特性:ACL(Access Control List)鉴权和控制台登录验证。 1. ACL鉴权: ACL,即访问控制列表,是一种常见的权限管理系统,用于限制用户或角色对资源的访问。...
【思科交换机访问控制列表(ACL)】是网络管理员用于增强网络安全的重要工具,它允许对数据包在交换机上的流动进行精细化控制。访问控制列表主要用于过滤特定类型的流量,阻止潜在的恶意活动,并保护网络资源免受...
### 华三ACL命令大全详解 #### 一、概述 华三通信技术有限公司(简称H3C)是一家专业提供IT基础架构产品及方案的研究、开发、生产、销售及服务的公司,其产品线覆盖了路由、交换、WLAN、安全、网络管理等领域。在H3...
ACL 进行网络流量的控制 知识点一:什么是 IP ACL? IP ACL(IP 访问控制列表或 IP 访问列表)是实现对流经路由器或交换机的数据包根据一定的规则进行过滤,从而提高网络可管理性和安全性。 知识点二:IP ACL 的...
在本文中,我们将深入探讨如何使用基于ACL会议模板的LaTeX双栏中文模板来创建专业且规范的学术论文。ACL(Association for Computational Linguistics)是计算语言学领域的重要会议,其提供的模板旨在确保论文格式的...
**华为模拟器eNSP与ACL实践指南** 在IT领域,华为eNSP(Enterprise Network Simulation Platform)是一款强大的网络仿真工具,它允许用户在虚拟环境中模拟和测试华为网络设备,如路由器、交换机等。本练习题专注于...