Linux中特殊权限--ACL

Linux中的ACL功能是体现在对文件和目录的权限上,而且对于权限设置的精细度上有了非常大的提高;
比如一个文件或者目录的所有者和所有者都是tangsir,权限为755,那么也就是说root用户和tangsir可以
写入外,其余的人是没有权限的。但是如果我们配置了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的权限一样定义,这里就不多讲了

如何使文件或者目录具有ACL功能呢?我们可以通过配置分区来支持ACL功能。首先,我们要明白,是不是
所有的分区都支持ACL功能呢?在RHEL5.X版本中,安装操作系统时所建立的分区是支持ACl功能的,安装
操作系统任务完成后所建立的分区默认是不支持ACL功能的,那么如何实现这种分区支持ACL功能呢?我们
可以使用三种方式来实现操作系统安装成功后所建立的分区支持ACL功能;
(1)使用mount命令,此命令使一个分区临时生效,重启后ACL会失效。
mount –o remount,acl 分区
mount –o acl 分区 挂载点
以上两种语法的区别:上面的表示的是此分区已经建立且在使用了或者说已经被挂载了,但是还不支持ACL功能,
我们通过此命令来实现不影响分区使用的情况下来支持ACL功能;下面表示的是在挂载分区的同时使其具备ACL功能。

例子:第一种情况:
[root@tangsir ~]# mount -o remount,acl /dev/sdb1
第二种情况:
[root@tangsir ~]# mount -o acl /dev/sdb2 /test2
用mount命令来查看信息:
[root@tangsir ~]# mount
/dev/sda3 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
none on /proc/fs/vmblock/mountPoint type vmblock (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/sdb1 on /test1 type ext3 (rw,acl)
/dev/sdb2 on /test2 type ext3 (rw,acl)
从挂载的信息中,我们得知了此分区支持ACL功能

(2)使用tune2fs命令,此命令可以使分区永久支持ACL功能
例子:
[root@tangsir ~]# tune2fs -o acl /dev/sdb5
使用-l选项来查看分区配置的情况:
[root@tangsir ~]# tune2fs -l /dev/sdb5
tune2fs 1.39 (29-May-2006)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          7e4472be-3a69-4060-b781-4184149d06ad
Filesystem magic number: 0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal resize_inode dir_index filetype sparse_super large_file
Default mount options:    acl 说明了该分区支持ACL功能
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
注意:使用tune2fs命令配置分区,用mount命令是查看不到的,只有通过修改/etc/fstab来支持分区ACL功能后才可以看到

(3)通过修改/etc/fstab来实现分区支持ACl 功能
[root@tangsir ~]# cat /etc/fstab
LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
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
LABEL=SWAP-sda2         swap                    swap    defaults        0 0
/dev/sdb5               /test3                  ext3    defaults,acl    0 0

为了使配置生效要重启计算机或者使用mount –o remount PT 命令

分区支持ACL功能后,我们要对文件或者目录具体设置ACL功能以及查看具体的ACL配置,这里要使用两个命令字:
setfacel and getfacl 。为了更好的理解命令的用法和设置,我们通过具体的实例来分析。首先,我们来看看setfacl
命令常用的选项;
-m:修改文件或目录的ACL rules
-x:删除文件或者目录指定的ACLrules
-d:指定文件或者目录默认的ACLrules
-k:删除文件或者目录默认的ACL rules
-b:删除文件或者目录所有的ACL rules
-R:递归渲染,对具体目录下所有的文件和目录全部渲染

具体实例:目录系统中的/dev/sdb1分区支持ACL功能,分区的挂载目录是/test1,目录中包含了h3cte和ccie两个目录,
我们使用户tangsir对目录ccie有可读,可写,可执行的权限,并且配置用户tangsir对目录ccie有默认的可读,可写,可
执行权限,也就是说用户tangsir在目录ccie中建立的目录或者文件时会自动继承ACL权限;

信息查看:
[root@tangsir ~]# df -H
文件系统               容量   已用 可用 已用% 挂载点
/dev/sda3               21G   4.9G    15G 26% /
/dev/sda1              104M    12M    87M 12% /boot
tmpfs                  246M      0   246M   0% /dev/shm
/dev/sdb1              2.5G    71M   2.3G   4% /test1
/dev/sdb2              1.7G    37M   1.6G   3% /test2
[root@tangsir ~]# ll /test1
总计32
drwxr-xr-x 2 root root 4096 07-29 11:27 ccie
drwxr-xr-x 2 root root 4096 07-29 11:27 h3cte

规则配置:
[root@tangsir test1]# setfacl -m u:tangsir:rwx ccie/
命令分析:-m 表示修改文件或者目录的ACL rules;u表示针对用户;tangsir是用户名;rwx是对目录的权限,字母和数字都可以
表示;ccie/是具体的目录。

查看并用户测试:
[root@tangsir test1]# ll
总计32
drwxrwxr-x+ 2 root root 4096 07-29 11:27 ccie 目录权限的最后一位是一个“+”表示目录配置了ACL功能
drwxr-xr-x 2 root root 4096 07-29 11:27 h3cte

切换用户tangsir:
[root@tangsir ~]# su - tangsir
[tangsir@tangsir ~]$ mkdir /test1/ccie/ccm --可以创建目录,成功!!
[tangsir@tangsir ~]$ ll /test1/ccie/
总计8
drwxrwxr-x 2 tangsir tangsir 4096 07-29 11:38 ccm -- one

用户的默认的ACL配置:
[root@tangsir test1]# setfacl -m d:u:tangsir:rwx ccie/

创建目录或者文件并查看:
[root@tangsir test1]# su - tangsir
[tangsir@tangsir ~]$ mkdir /test1/ccie/ccm1
[tangsir@tangsir ~]$ ll /test1/ccie/
总计16
drwxrwxr-x 2 tangsir tangsir 4096 07-29 11:38 ccm
drwxrwxr-x+ 2 tangsir tangsir 4096 07-29 11:43 ccm1   ---two(自动继承了ACL功能)
注意比较one ,two ,看出两者的区别~~

具体实例:目录系统中的/dev/sdb2分区支持ACL功能,分区的挂载目录是/test2,目录中包含了mvp和cca两个目录,
建立用户组zu1,zu2,建立用户liugong ,xugong.

liugong属于组zu1,xugong属于zu2.配置zu1对mvp有执行的权限,zu2对cca有所有的权限。并实现zu2对cca目录有
默认的ACl功能。(可读,可写,可执行)组,用户的建立:

[root@tangsir ~]# groupadd zu1
[root@tangsir ~]# groupadd zu2
[root@tangsir ~]# usermod -G zu1 liugong
[root@tangsir ~]# gpasswd -a xugong zu2
正在将用户“xugong”加入到“zu2”组中
[root@tangsir ~]# ll /test2/
总计32
drwxr-xr-x 2 root root 4096 07-29 11:52 cca
drwx------ 2 root root 16384 07-29 10:33 lost+found
drwxr-xr-x 2 root root 4096 07-29 11:52 mvp

配置zu1对mvp有执行的权限:
 [root@tangsir test2]# setfacl -m g:zu1:x mvp/

zu2对cca有所有的权限:
[root@tangsir test2]# setfacl -m g:zu2:7 cca/
[root@tangsir test2]# setfacl -m d:g:zu2:7 cca/

ACL功能查看:
[root@tangsir test2]# ll
总计32
drwxrwxr-x+ 2 root root 4096 07-29 11:52 cca
drwx------ 2 root root 16384 07-29 10:33 lost+found
drwxr-xr-x+ 2 root root 4096 07-29 11:52 mvp

用户测试:
[root@tangsir ~]# su - liugong
[liugong@tangsir ~]$ cd /test2/mvp/
[liugong@tangsir mvp]$ touch jilu.txt
touch: 无法触碰 “jilu.txt”: 权限不够
liugong对mvp目录只有执行权限,效果正确~
[xugong@tangsir ~]$ cd /test2/cca/
[xugong@tangsir cca]$ mkdir keke && touch diligence
[xugong@tangsir cca]$ ll
总计12
-rw-rw-r--+ 1 xugong xugong    0 07-29 12:14 diligence
drwxrwxr-x+ 2 xugong xugong 4096 07-29 12:14 keke

getfacl 命令来查看文件或者目录的ACL;
[root@tangsir test1]# ll
总计32
drwxrwxr-x+ 4 root root 4096 07-29 11:43 ccie
drwxr-xr-x 2 root root 4096 07-29 11:27 h3cte
drwx------ 2 root root 16384 07-29 10:31 lost+found

[root@tangsir test1]# getfacl ccie
# file: ccie 文件或者目录的名称
# owner: root 文件或者目录的属主
# group: root 文件或者目录属组
user::rwx   属主的权限
user:tangsir:rwx 用户tangsir的权限
group::r-x 属组的权限
mask::rwx 文件或者目录最大权限
other::r-x 其他人的权限
default:user::rwx
default:user:tangsir:rwx 用户tangsir对目录或者文件的默认权限
default:group::r-x
default:mask::rwx

文件或者目录ACL的删除:
[root@tangsir test1]# getfacl ccie
# file: ccie
# owner: root
# group: root
user::rwx
user:tangsir:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:tangsir:rwx
default:group::r-x
default:mask::rwx

[root@tangsir test1]# setfacl -x u:tangsir ccie删除指定的ACL
[root@tangsir test1]# setfacl -b ccie --删除全部的ACl
[root@tangsir test1]# getfacl ccie

# file: ccie
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

注意:文件或者目录配置了ACL以后,由于系统管理的需要要将配置了ACL的目录进行复制操作,那么cp命令后必要加上
“-P”选项
,如果是剪切的话,就不需要了,因为默认mv命令会保留原ACL。当然前提必须是目标目录必须也要支持ACL功
能才行~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值