- 浏览: 44731 次
文章分类
最新评论
Linux的ACL配置
一、 为什么要使用ACL
首先,在 linux下,对一个文件可以进行的操作的对象分别为user(文件的拥有者),group(组,注意不一定是文件拥有者所在的组), other (其他)而对于每一对象的操作又有了读 写 执行 (这里不讨论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用户(user)拥有read & write权限. 所有属于admin 组的用户(group)拥有read & write 权限. 其他任何用户(other)
对于文件没有任何的权限
如果我们现在希望john这个用户也可以对test.txt文件进行读写操作. 我自己大概会想到以下几种办法 (这里假设john不属于admin组)
1. 给文件的other类别增加读和写的权限. 这样由于john会被归为other类别,那么他也将拥有读写的权限。
2. 将john加入到admin group. 那么john会被归为group类别,那么他将拥有读写的权限。
第一种做法的问题在于所有用户都将对test.txt拥有读写操作,显然这种做法不可取
第二种做法的问题在于john被赋予了过多的权限.所有属于admin组的文件,john都可以拥有其等同的权限了。
对于以上不安全的情况,我们可以用Linux的Access Control List (ACL)来帮助我们解决当然,要讨论ACL你必须要安装上ACL的RPM包,而且,在安装完成后,还要磁盘分区的支持。
以我为例,我的分区默认并没有支持ACL功能,如果要让分区支持ACL,有以下几种办法:
1.使用tune2fs命令让分区永久支持ACL功能 语法: tune2fs -o acl 分区
如:[root@localhost ~]# tune2fs -o acl /dev/sda2 #如果不知道目录所在的分区,可以看我的一篇相关文章
tune2fs 1.41.12 (17-May-2010) http://blog.chinaunix.net/uid-30212356-id-5077530.html
配置完成后,可以通过tune2fs -l 分区 查看,如我的:
[root@localhost ~]# tune2fs -l /dev/sda2
tune2fs 1.41.12 (17-May-2010)
Filesystem volume name:
Last mounted on: /
Filesystem UUID: eafb2027-525e-4a4d-8df7-f7123a9fe637
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
#在“Default mount options:”的值中包括“acl”就说明该分区支持ACL功能。
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux............
2.使用mount命令让分区临时支持ACL功能(重启开机后ACL失效)
mount -o remount 分区 或者 mount -o acl 分区 挂载点
注意:使用mount命令让一个分区临时支持ACL功能时,可以使用以上二种方式。第一种使用在分区已经被挂载的情况,也就是说这个分区已经在使用但还不支持ACL功能,在不影响分区使用的情况下重新挂载分区使其支持ACL功能;第二种使用在一开始挂载分区时就使其支持ACL功能。
[root@srv ~]# mount -o remount /dev/sda13
[root@srv ~]# mount -o acl /dev/sda14 /media/sda14(此为引用,我没有再去试验)
[root@srv ~]# mount #使用mount命令查看。
#如果分区支持ACL功能时,在挂载信息中会显示出来。
/dev/sda13 on /media/sda13 type ext3 (rw,acl)
/dev/sda14 on /media/sda14 type ext3 (rw,acl)
3.修改/etc/fstab文件,使分区永久支持ACL功能。在/etc/fstab文件中在需要支持ACL功能分区的挂载选项列中加上“,acl”即可使分区永久支持ACL功能。(这里是引用的,懒,没测试)
如:[root@srv ~]# cat /etc/fstab
LABEL=SWAP-sda9
swap
swap
defaults
0 0
/dev/sda10
/media/sda10
ext3
defaults,acl
0 0
在启用了acl参数之后重新加载/data分区
# mount -o remount 分区 即可!
提示:通过tune2fs命令使分区支持ACL功能后,通过mount命令是无法查看到的,通过修改/etc/fstab使分区支持ACL功能后,通过mount命令可以查看到分区支持ACL功能
二:ACL的名词定义
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参数(即getfacl -c tset.txt命令)来省略掉
user::rw- 定义了ACL_USER_OBJ, 说明文件拥有者拥有读和写的权限
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文件的格式. 从上面的例子中我们可以看到每一个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的权限一样定义,这里就不多讲了
一开始文件没有ACL的额外属性
[root@localhost mnt]# ll
总用量 4
drwxr-xr-x. 2 root root 4096 3月 14 07:00 hgfs
-rw-r--r-- 1 root root 0 6月 10 05:50 test.txt
[root@zyq-server data]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
我们先让用户abc拥有对test.txt文件的读写权限
[root@localhost mnt]# setfacl -m u:abc:rw test.txt
[root@localhost mnt]# getfacl -c test.txt
user::rw-
user:abc:rw-
group::r--
mask::rw-
other::r--
这时我们就可以看到abc用户在ACL里面已经拥有了对文件的读写权限. 这个时候如果我们查看一下linux的权限我们还会发现一个不一样的地方
[root@localhost mnt]# ll
总用量 4
drwxr-xr-x. 2 root root 4096 3月 14 07:00 hgfs
-rw-rw-r--+ 1 root root 0 6月 10 05:50 test.txt
在文件权限的最后多了一个+号. 当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后,我们就可以称它为ACL文件.这个+号就是用来提示我们的.
我们还可以发现当一个文件拥有了ACL_USER或者ACL_GROUP的值时ACL_MASK同时也会被定义;
接下来我们来设置ABC组拥有read 权限
[root@localhost mnt]# setfacl -m g:ABC:r test.txt
[root@localhost mnt]# getfacl -c test.txt
user::rw-
user:abc:rw-
group::r--
group:ABC:r--
mask::rw-
other::r--
[root@localhost mnt]# setfacl -m g:ABC:r test.txt
[root@localhost mnt]# getfacl -c test.txt
user::rw-
user:abc:rw-
group::r--
group:ABC:r--
mask::rw-
other::r--
[root@localhost mnt]# setfacl -m g:ABC:r test.txt
[root@localhost mnt]# getfacl -c test.txt
user::rw-
user:abc:rw-
group::r--
group:ABC:r--
mask::rw-
other::r--
[root@localhost mnt]# setfacl -m g:ABC:r test.txt
[root@localhost mnt]# getfacl -c test.txt
user::rw-
user:abc:rw-
group::r--
group:ABC:r--
mask::rw-
other::r--
[root@localhost mnt]# ll test.txt
-rw-rw-r--+ 1 root root 0 6月 10 05:50 test.txt
四、ACL_MASK 和 Effective 权限
这里需要重点讲一下ACL_MASK, 因为这是掌握ACL的另一个关键
在Linux 文件权限里面大家都知道比如对于rw-rw-r--来说, 第二组中的那个rw-是指文件组的权限. 但是在ACL里面这种情况只是在ACL_MASK不存在的情况下成立. 如果文件有ACL_MASK值,那么当中那个rw-代表的就是mask值而不再是group 权限了;
例如:[root@localhost mnt]# ll test.sh
-rwxrw-r-- 1 root family 1 6月 10 06:28 test.sh
这里说明test.sh文件只有文件拥有者 root拥有read, write, execute 权限. family
组只有读和写的权限。现在我们想让用户abc也对test.sh具有和root一样的权限。
[root@localhost mnt]# setfacl -m u:abc:rwx test.sh
[root@localhost mnt]# getfacl -c test.sh
user::rwx
user:abc:rwx
group::rw-
mask::rwx
other::r--
这里我们看到abc已经拥有了rwx的权限. mask值也被设定为rwx.那是因为它规定了ACL_USER, ACL_GROUP和ACL_GROUP_OBJ的最大值(也就是权限的最大值)
现在我们再来看test.sh的Linux 权限, 它已经变成了
[root@localhost mnt]# ll test.sh
-rwxrwxr--+ 1 root family 1 6月 10 06:28 test.sh
那么如果现在family组的用户想要执行test.sh的程序会发生什么情况呢? 它会被权限 deny.原因在于实际上family组的用户只有读和写的权限.这里当中显示的rwx是ACL_MASK的值而不是group的权限
所以从这里我们就可以知道,如果一个文件后面有+标记,我们都需要用getfacl来确认它的权限,以免发生混淆
下面我们再来继续看一个例子
假如现在我们设置test.sh的mask为read only,那么family组的用户还会有write 权限吗?
[root@localhost mnt]# setfacl -m mask::r test.sh
[root@localhost mnt]# getfacl -c test.sh
user::rwx
user:abc: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权限也就是mask的权限.
这时我们再来查看test.sh的Linux 文件权限时它的group 权限也会显示其mask的值
[root@localhost mnt]# ll test.sh
-rwxr--r--+ 1 root family 1 6月 10 06:28 test.sh
五、 Default ACL
上面我们所有讲的都是Access ACL, 也就是对文件而言. 下面讲的是Default ACL.,Default ACL是指对于一个目录进行Default ACL设置,并且在此目录下建立的文件都将继承此目录的ACL
我希望所有在此目录下建立的文件都可以被smbuser用户所访问. 那么我们就应该对mydir目录设置Default ACL
首先利用root用户在/mnt/创建一个dir的文件夹,然后将这个文件夹的default user权限设置为smbuser可以rw-
以root身份在dir目录下创建一个test.txt的文件。其他的不做限制,然后切换到smbuser。发现smbuser用户可以修改 test.txt文件中的内容但是无法在dir目录中创建和删除文件/文件夹
[root@localhost mnt]# mkdir dir
[root@localhost mnt]# id
uid=0(root) gid=0(root) groups=0(root)
[root@localhost mnt]# ll dir/
total 0
[root@localhost mnt]# getfacl dir
# file: dir
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
[root@localhost mnt]# setfacl -m d:smbuser:rw dir/
[root@localhost mnt]# getfacl dir/
# file: dir/
# 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
此时我们可以看到ACL定义了default选项, smbuser用户拥有了default的read, write, excute/search 权限.但是却无法删除和创建文件,这里还必须将mydir目录的ACL_USER修改为smbuser后,切换到smbuser用户才能够在 mydir目录中创建和删除文件/文件夹
[root@localhost mnt]# setfacl -m u:smbuser:rwx dir/
[root@localhost mnt]# getfacl -c dir/
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@localhost mnt]# cd dir/
[root@localhost dir]# touch test.txt
[root@localhost mnt]# cd dir/
[root@localhost dir]# su - smbuser
[smbuser@localhost ~]$ cd /mnt/dir/
[smbuser@localhost dir]$ touch a
[smbuser@localhost dir]$ ll
total 0
-rw-rw-r--+ 1 smbuser smbuser 0 Jun 10 07:38 a
-rw-rw-r--+ 1 root root 0 Jun 10 07:34 test.txt
[smbuser@localhost dir]$ rm * -rf
[smbuser@localhost dir]$
下面的试验我们看到在dir下建立的文件或文件夹都自动的加上了default的权限
[smbuser@localhost dir]$ touch test.txt
[smbuser@localhost dir]$ getfacl test.txt
# file: test.txt
# owner: smbuser
# group: smbuser
user::rw-
user:smbuser:rw-
group::r-x #effective:r--
mask::rw-
other::r--
[smbuser@localhost dir]$ mkdir testdir
[smbuser@localhost dir]$ getfacl testdir/
# file: testdir/
# owner: smbuser
# group: smbuser
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@localhost dir]$ ll
total 4
drwxrwxr-x+ 2 smbuser smbuser 4096 Jun 10 07:43 testdir
-rw-rw-r--+ 1 smbuser smbuser 0 Jun 10 07:41 test.txt
六:总结
从上面的例子可以看到,getfacl命令是用来读取文件的ACL, setfacl是用来设定文件的Acess ACL. 这里还有一个chacl是用来改变文件和目录的Access ACL and Default ACL. 他的用法很多, 这里只提及一下chacl -B. 它可以彻底删除文件或者目录的ACL属性(包括Default ACL). 比如你即使用了setfacl -x 删除了所有文件的ACL属性,那个+号还是会出现在文件的末尾.所以正确的删除方法应该是用chacl -B
用cp来复制文件的时候我们现在可以加上-p选项.这样在拷贝文件的时候也将拷贝文件的ACL属性.对于不能拷贝的ACL属性将给出警告
mv命令将会默认地移动文件的ACL属性. 同样如果操作不允许的情况下会给出警告
如果用chmod命令改变Linux 文件权限的时候相应的ACL值也会改变.反之改变ACL的值,相应的文件权限也会改变
这篇博客我先看了几篇相关内容,然后自己动手又做了完整的测试,已经实现了ACL的功能,希望看到的人也自己亲自测试一下,遇到跟着片博客不符的情况可以找资料解决,这样才能进步,才能提升自己的能力。
首先,在 linux下,对一个文件可以进行的操作的对象分别为user(文件的拥有者),group(组,注意不一定是文件拥有者所在的组), other (其他)而对于每一对象的操作又有了读 写 执行 (这里不讨论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用户(user)拥有read & write权限. 所有属于admin 组的用户(group)拥有read & write 权限. 其他任何用户(other)
对于文件没有任何的权限
如果我们现在希望john这个用户也可以对test.txt文件进行读写操作. 我自己大概会想到以下几种办法 (这里假设john不属于admin组)
1. 给文件的other类别增加读和写的权限. 这样由于john会被归为other类别,那么他也将拥有读写的权限。
2. 将john加入到admin group. 那么john会被归为group类别,那么他将拥有读写的权限。
第一种做法的问题在于所有用户都将对test.txt拥有读写操作,显然这种做法不可取
第二种做法的问题在于john被赋予了过多的权限.所有属于admin组的文件,john都可以拥有其等同的权限了。
对于以上不安全的情况,我们可以用Linux的Access Control List (ACL)来帮助我们解决当然,要讨论ACL你必须要安装上ACL的RPM包,而且,在安装完成后,还要磁盘分区的支持。
以我为例,我的分区默认并没有支持ACL功能,如果要让分区支持ACL,有以下几种办法:
1.使用tune2fs命令让分区永久支持ACL功能 语法: tune2fs -o acl 分区
如:[root@localhost ~]# tune2fs -o acl /dev/sda2 #如果不知道目录所在的分区,可以看我的一篇相关文章
tune2fs 1.41.12 (17-May-2010) http://blog.chinaunix.net/uid-30212356-id-5077530.html
配置完成后,可以通过tune2fs -l 分区 查看,如我的:
[root@localhost ~]# tune2fs -l /dev/sda2
tune2fs 1.41.12 (17-May-2010)
Filesystem volume name:
Last mounted on: /
Filesystem UUID: eafb2027-525e-4a4d-8df7-f7123a9fe637
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
#在“Default mount options:”的值中包括“acl”就说明该分区支持ACL功能。
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux............
2.使用mount命令让分区临时支持ACL功能(重启开机后ACL失效)
mount -o remount 分区 或者 mount -o acl 分区 挂载点
注意:使用mount命令让一个分区临时支持ACL功能时,可以使用以上二种方式。第一种使用在分区已经被挂载的情况,也就是说这个分区已经在使用但还不支持ACL功能,在不影响分区使用的情况下重新挂载分区使其支持ACL功能;第二种使用在一开始挂载分区时就使其支持ACL功能。
[root@srv ~]# mount -o remount /dev/sda13
[root@srv ~]# mount -o acl /dev/sda14 /media/sda14(此为引用,我没有再去试验)
[root@srv ~]# mount #使用mount命令查看。
#如果分区支持ACL功能时,在挂载信息中会显示出来。
/dev/sda13 on /media/sda13 type ext3 (rw,acl)
/dev/sda14 on /media/sda14 type ext3 (rw,acl)
3.修改/etc/fstab文件,使分区永久支持ACL功能。在/etc/fstab文件中在需要支持ACL功能分区的挂载选项列中加上“,acl”即可使分区永久支持ACL功能。(这里是引用的,懒,没测试)
如:[root@srv ~]# cat /etc/fstab
LABEL=SWAP-sda9
swap
swap
defaults
0 0
/dev/sda10
/media/sda10
ext3
defaults,acl
0 0
在启用了acl参数之后重新加载/data分区
# mount -o remount 分区 即可!
提示:通过tune2fs命令使分区支持ACL功能后,通过mount命令是无法查看到的,通过修改/etc/fstab使分区支持ACL功能后,通过mount命令可以查看到分区支持ACL功能
二:ACL的名词定义
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参数(即getfacl -c tset.txt命令)来省略掉
user::rw- 定义了ACL_USER_OBJ, 说明文件拥有者拥有读和写的权限
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文件的格式. 从上面的例子中我们可以看到每一个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的权限一样定义,这里就不多讲了
一开始文件没有ACL的额外属性
[root@localhost mnt]# ll
总用量 4
drwxr-xr-x. 2 root root 4096 3月 14 07:00 hgfs
-rw-r--r-- 1 root root 0 6月 10 05:50 test.txt
[root@zyq-server data]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
我们先让用户abc拥有对test.txt文件的读写权限
[root@localhost mnt]# setfacl -m u:abc:rw test.txt
[root@localhost mnt]# getfacl -c test.txt
user::rw-
user:abc:rw-
group::r--
mask::rw-
other::r--
这时我们就可以看到abc用户在ACL里面已经拥有了对文件的读写权限. 这个时候如果我们查看一下linux的权限我们还会发现一个不一样的地方
[root@localhost mnt]# ll
总用量 4
drwxr-xr-x. 2 root root 4096 3月 14 07:00 hgfs
-rw-rw-r--+ 1 root root 0 6月 10 05:50 test.txt
在文件权限的最后多了一个+号. 当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后,我们就可以称它为ACL文件.这个+号就是用来提示我们的.
我们还可以发现当一个文件拥有了ACL_USER或者ACL_GROUP的值时ACL_MASK同时也会被定义;
接下来我们来设置ABC组拥有read 权限
[root@localhost mnt]# setfacl -m g:ABC:r test.txt
[root@localhost mnt]# getfacl -c test.txt
user::rw-
user:abc:rw-
group::r--
group:ABC:r--
mask::rw-
other::r--
[root@localhost mnt]# setfacl -m g:ABC:r test.txt
[root@localhost mnt]# getfacl -c test.txt
user::rw-
user:abc:rw-
group::r--
group:ABC:r--
mask::rw-
other::r--
[root@localhost mnt]# setfacl -m g:ABC:r test.txt
[root@localhost mnt]# getfacl -c test.txt
user::rw-
user:abc:rw-
group::r--
group:ABC:r--
mask::rw-
other::r--
[root@localhost mnt]# setfacl -m g:ABC:r test.txt
[root@localhost mnt]# getfacl -c test.txt
user::rw-
user:abc:rw-
group::r--
group:ABC:r--
mask::rw-
other::r--
[root@localhost mnt]# ll test.txt
-rw-rw-r--+ 1 root root 0 6月 10 05:50 test.txt
四、ACL_MASK 和 Effective 权限
这里需要重点讲一下ACL_MASK, 因为这是掌握ACL的另一个关键
在Linux 文件权限里面大家都知道比如对于rw-rw-r--来说, 第二组中的那个rw-是指文件组的权限. 但是在ACL里面这种情况只是在ACL_MASK不存在的情况下成立. 如果文件有ACL_MASK值,那么当中那个rw-代表的就是mask值而不再是group 权限了;
例如:[root@localhost mnt]# ll test.sh
-rwxrw-r-- 1 root family 1 6月 10 06:28 test.sh
这里说明test.sh文件只有文件拥有者 root拥有read, write, execute 权限. family
组只有读和写的权限。现在我们想让用户abc也对test.sh具有和root一样的权限。
[root@localhost mnt]# setfacl -m u:abc:rwx test.sh
[root@localhost mnt]# getfacl -c test.sh
user::rwx
user:abc:rwx
group::rw-
mask::rwx
other::r--
这里我们看到abc已经拥有了rwx的权限. mask值也被设定为rwx.那是因为它规定了ACL_USER, ACL_GROUP和ACL_GROUP_OBJ的最大值(也就是权限的最大值)
现在我们再来看test.sh的Linux 权限, 它已经变成了
[root@localhost mnt]# ll test.sh
-rwxrwxr--+ 1 root family 1 6月 10 06:28 test.sh
那么如果现在family组的用户想要执行test.sh的程序会发生什么情况呢? 它会被权限 deny.原因在于实际上family组的用户只有读和写的权限.这里当中显示的rwx是ACL_MASK的值而不是group的权限
所以从这里我们就可以知道,如果一个文件后面有+标记,我们都需要用getfacl来确认它的权限,以免发生混淆
下面我们再来继续看一个例子
假如现在我们设置test.sh的mask为read only,那么family组的用户还会有write 权限吗?
[root@localhost mnt]# setfacl -m mask::r test.sh
[root@localhost mnt]# getfacl -c test.sh
user::rwx
user:abc: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权限也就是mask的权限.
这时我们再来查看test.sh的Linux 文件权限时它的group 权限也会显示其mask的值
[root@localhost mnt]# ll test.sh
-rwxr--r--+ 1 root family 1 6月 10 06:28 test.sh
五、 Default ACL
上面我们所有讲的都是Access ACL, 也就是对文件而言. 下面讲的是Default ACL.,Default ACL是指对于一个目录进行Default ACL设置,并且在此目录下建立的文件都将继承此目录的ACL
我希望所有在此目录下建立的文件都可以被smbuser用户所访问. 那么我们就应该对mydir目录设置Default ACL
首先利用root用户在/mnt/创建一个dir的文件夹,然后将这个文件夹的default user权限设置为smbuser可以rw-
以root身份在dir目录下创建一个test.txt的文件。其他的不做限制,然后切换到smbuser。发现smbuser用户可以修改 test.txt文件中的内容但是无法在dir目录中创建和删除文件/文件夹
[root@localhost mnt]# mkdir dir
[root@localhost mnt]# id
uid=0(root) gid=0(root) groups=0(root)
[root@localhost mnt]# ll dir/
total 0
[root@localhost mnt]# getfacl dir
# file: dir
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
[root@localhost mnt]# setfacl -m d:smbuser:rw dir/
[root@localhost mnt]# getfacl dir/
# file: dir/
# 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
此时我们可以看到ACL定义了default选项, smbuser用户拥有了default的read, write, excute/search 权限.但是却无法删除和创建文件,这里还必须将mydir目录的ACL_USER修改为smbuser后,切换到smbuser用户才能够在 mydir目录中创建和删除文件/文件夹
[root@localhost mnt]# setfacl -m u:smbuser:rwx dir/
[root@localhost mnt]# getfacl -c dir/
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@localhost mnt]# cd dir/
[root@localhost dir]# touch test.txt
[root@localhost mnt]# cd dir/
[root@localhost dir]# su - smbuser
[smbuser@localhost ~]$ cd /mnt/dir/
[smbuser@localhost dir]$ touch a
[smbuser@localhost dir]$ ll
total 0
-rw-rw-r--+ 1 smbuser smbuser 0 Jun 10 07:38 a
-rw-rw-r--+ 1 root root 0 Jun 10 07:34 test.txt
[smbuser@localhost dir]$ rm * -rf
[smbuser@localhost dir]$
下面的试验我们看到在dir下建立的文件或文件夹都自动的加上了default的权限
[smbuser@localhost dir]$ touch test.txt
[smbuser@localhost dir]$ getfacl test.txt
# file: test.txt
# owner: smbuser
# group: smbuser
user::rw-
user:smbuser:rw-
group::r-x #effective:r--
mask::rw-
other::r--
[smbuser@localhost dir]$ mkdir testdir
[smbuser@localhost dir]$ getfacl testdir/
# file: testdir/
# owner: smbuser
# group: smbuser
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@localhost dir]$ ll
total 4
drwxrwxr-x+ 2 smbuser smbuser 4096 Jun 10 07:43 testdir
-rw-rw-r--+ 1 smbuser smbuser 0 Jun 10 07:41 test.txt
六:总结
从上面的例子可以看到,getfacl命令是用来读取文件的ACL, setfacl是用来设定文件的Acess ACL. 这里还有一个chacl是用来改变文件和目录的Access ACL and Default ACL. 他的用法很多, 这里只提及一下chacl -B. 它可以彻底删除文件或者目录的ACL属性(包括Default ACL). 比如你即使用了setfacl -x 删除了所有文件的ACL属性,那个+号还是会出现在文件的末尾.所以正确的删除方法应该是用chacl -B
用cp来复制文件的时候我们现在可以加上-p选项.这样在拷贝文件的时候也将拷贝文件的ACL属性.对于不能拷贝的ACL属性将给出警告
mv命令将会默认地移动文件的ACL属性. 同样如果操作不允许的情况下会给出警告
如果用chmod命令改变Linux 文件权限的时候相应的ACL值也会改变.反之改变ACL的值,相应的文件权限也会改变
这篇博客我先看了几篇相关内容,然后自己动手又做了完整的测试,已经实现了ACL的功能,希望看到的人也自己亲自测试一下,遇到跟着片博客不符的情况可以找资料解决,这样才能进步,才能提升自己的能力。
相关推荐
- ACL功能可能不是所有Linux发行版都默认启用的,在使用前需要确认文件系统的相关配置。 总之,Linux中的ACL提供了一种强大的方法来管理文件和目录的访问权限。通过合理设置ACL,可以实现更加细致和安全的权限管理...
ACL 配置实验报告 本实验报告的主要目的是了解并掌握路由器上的标准 ACL 配置,实现网段间互访的安全控制。通过本次实验,我们可以深入理解包过滤防火墙的工作原理,并掌握路由器上的标准 ACL 规则及配置。 一、...
在深入探讨Linux ACL(Access Control List)的知识点之前,我们首先需要理解什么是ACL以及它在Linux系统中的作用。ACL是一种比传统Unix权限模型更为精细的访问控制机制,它允许管理员为文件或目录设置更复杂的权限...
在 Linux 软防火墙中,配置 ACL 权限是一个非常重要的方面,我们可以使用 Linux 指令来配置 ACL 权限,例如使用 iptables 命令来实现 Linux 防火墙功能。此外,我们还可以使用 CentOS 7.0 关闭默认防火墙启用 ...
在 Linux 文件系统中增加 ACL 功能 Linux 操作系统中,存储控制是通过一个 9 位的存储控制字来进行的,只能对文件的所有者、文件所有者所在的组及其它用户的文件操作权限进行设置。这种文件存储控制功能在实际使用...
在Linux系统中,访问控制列表(Access Control List,简称ACL)是一种高级的权限管理系统,它扩展了传统Unix-like系统中基于属主、属组和其他用户的权限模型。在没有ACL技术之前,用户只能通过chmod、chown和chgrp等...
ACL(Access Control Lists)是一种在Linux和类Unix系统中用于扩展文件系统权限管理的技术,它允许用户超越传统的用户、组和其他基本权限模型,为文件和目录设置更细致的访问规则。`acl-2.2.52.src.tar.gz` 是一个源...
### Linux账号管理与ACL权限设置 #### 一、Linux账号管理概述 Linux系统中的账号管理是确保系统安全和资源合理分配的重要组成部分。通过账号管理,系统管理员可以有效地控制用户对系统资源的访问权限。 ##### ...
2. **使用工具**:在Linux中,我们可以使用`setfacl`和`getfacl`命令来设置和查看ACL。在UNIX系统上,具体实现可能因发行版而异,但通常也有类似的机制。 3. **默认ACL**:默认ACL定义了新创建的文件或子目录继承的...
但同时,过度使用或配置不当的ACL可能导致混乱,增加管理复杂性。 总之,Linux 2.6内核引入的ACL功能为系统管理员提供了一种更强大的工具来管理文件系统的访问权限,特别是在需要为特定用户或组设定特殊权限的情况...
为了更好地理解和实践Linux中的ACL功能,接下来我们将通过具体步骤演示如何在Linux环境下启用和配置ACL。 #### 四、实验环境搭建 为了安全地进行ACL实验而不影响现有系统数据,推荐使用loop设备来创建一个临时文件...
6. **定制性**:用户可以根据自己的需要定制Linux系统,包括选择不同的桌面环境、应用程序和配置选项。 7. **广泛的软件支持**:Linux拥有丰富的软件库,包括服务器软件、图形界面、办公软件、开发工具
本实验旨在通过实践操作,让参与者深入了解Linux下的访问控制列表(Access Control List,简称ACL)的概念及其配置方法。通过一系列具体任务,帮助学习者掌握如何设置与管理文件或目录的访问权限,特别是在涉及多...
设置ACL;设置ACL练习1;设置ACL练习结果分析;查看ACL控制列表;删除ACL权限;练习2;删除ACL权限;*ACL的mask权限;ACL的mask权限演示;*mask权限验证;思考;课堂活动验证&结论;*ACL的有效权限演示;ACL的有效权限验证;默认...
然而,使用ACL也需谨慎,过度的权限设置可能会增加系统的复杂性,且可能导致安全风险,因此在配置时应确保遵循最小权限原则。 总的来说,Linux的ACL权限提供了一种强大的工具,使得系统管理员能够更好地控制文件和...
### Linux上配置iSCSI服务详解 #### 一、iSCSI简介 iSCSI (Internet Small Computer System Interface) 是一种基于IP网络实现SCSI协议的技术。它允许用户通过TCP/IP网络来传输SCSI指令,使得存储设备可以跨越地理...
例如,在 Linux 中,可以使用 setfacl 命令来设置 ACL 权限。setfacl 命令可以设置文件或目录的权限,使得不同的用户或组可以拥有不同的权限。这样,可以灵活地控制文件和目录的访问权限。 在 Linux 系统中,还有...
总之,Linux的ACL权限配置提供了一种灵活的机制,使得管理员能够精确控制文件和目录的访问权限,不仅可以为每个用户或组单独设定权限,还可以设定预设权限,以及通过mask来限制最大可允许的权限。这对于保障系统的...
Linux访问控制列表(Access Control List, ACL)是Linux系统中提供的一种更为精细的权限管理机制,它超越了传统的用户、组和其他用户(ugo)的基本权限模型。在传统的Linux权限模型中,每个文件或目录只能拥有所有者...
Linux账号管理与ACL权限设置,管理员的工作中,相当重要的一环就是“账号管理”。因为整个系统都是你在管理的,并且所有一般用户的账号申请都必须通过你的协助才行!所以你就必须了解一下如何管理好一个服务器主机的...