来源:CnLinux.net
ACL(Access Control Lists)
传统的 Unix like 档案系统只能针对 user/group/other 来对档案设定权限(无法针对各别的使用者,群组来设定),而 ACL 可以针对各别的使用者/群组来设定权限.
Step 0:检查你的核心是否有支持 ACL 的功能
并不是每一个版本的核心都有支持 ACL 的功能,最简单的方式就是检查目前核心是否有支持.
#cat /boot/config-kernel-version | grep -i ext3
CONFIG_EXT3_FS=m
CONFIG_EXT3_IDEX=y
CONFIG_EXT3_FS_XATTR_SHARING=y
CONFIG_EXT3_FS_XATTR_USER=y
CONFIG_EXT3_FS_XATTR_TRUSTED=y
CONFIG_EXT3_FS_ACL=y
此时如果能看到上叙几项功能已经编译至核心中,那你的 ext3 档案系统已经有支持 ACL 的功能
如果没有那请自己编译一个含有上叙功能的模块吧!!这些功能在编译核心选项中的 File systems 下都可以找到.
如果你在编译核心时找不到上叙功能的模块,请至 ACL 的官方网站来安装 Kernel Patch
<http://acl.bestbits.at/>
Step 1:挂载扇区
你可以用下列的方式挂载扇区
#mount -t ext3 -o acl /dev/sda1 /fs1
你也可以直接写在 /etc/fstab 档案中,这样就可以在开机后支持 ACL 的功能
#vi /etc/fstab
-----------------------------------------------------------------------
..........略...................
LABEL=/fs1 /fs1 ext3 acl 1 2
-----------------------------------------------------------------------
Step 2:设定 ACL 的权限
ACL 可以针对下面四种权限来设定
1.个别的使用者
2.个别的群组
3. effective mask 的权限.
4.其它的使用者
下面是个别的说明
1.个别的使用者
假设 user1 user2 user3的使用者都以建立,或者用下面的方式来建立
root 登入系统
[root@unsvr root]#adduser user1
[root@unsvr root]#adduser user2
[root@unsvr root]#adduser user3
[root@unsvr root]#passwd user1
[root@unsvr root]#passwd user2
[root@unsvr root]#passwd user3
mount 一个 ext3 档案系统至目录 /fs1
[root@unsvr root]#mount -t ext3 -o acl /dev/sda1 /fs1
ex:user1 建立的档案开读写的权限给 user2
[root@unsvr root]#chmod -R 777 /fs1
让所有的使用者都能新增档案进入目录的权限
user1 登入系统
[user1@unsvr user1]# cd /fs1
[user1@unsvr fs1]# echo "Create by user1" > user1.txt
[user1@unsvr fs1]# chmod go-r user1.txt
[user1@unsvr fs1]# ll user1.txt
-rw------- 1 user1 user1 17 Jul 14 22:11 user1.txt
此时除了 user1 有读写的权限外没有其它人有读写 user1.txt 的权限(root 除外)
user2 登入系统
[user2@unsvr user2]# cd /fs1
[user2@unsvr fs1]# cat user1.txt
cat : user1.txt Permission denied
user1 登入系统
[user1@unsvr fs1]# setfacl -m u:user2:rw user1.txt
修改权限让 user2 有这个档案的读写权限
看一下他的档案属性变化
[user1@unsvr fs1]# ll
-rw-rw-r--+ 1 user1 user1 10 Feb 16 13:52 user1.txt
你会看到后面多了一个 "+" 表示这个档案有使用 ACL 的属性设定
再用指令 getfacl 来看 ACL 的档案属性设定为何
[user1@unsvr fs1]# getfacl user1.txt
# file: user1.txt
# owner: user1
# group: user1
user::rw-
user:user2:rw-
group::rw-
mask::rw-
other::r--
可以看到 user2 有权限读写这个档案.
user2 登入系统
[user2@unsvr user2]# cd /fs1
[user2@unsvr fs1]# cat user1.txt
Create by user1
user2 可以读取 user1.txt 档案了
[user2@unsvr fs1]# echo "Modify by user2" >> user1.txt
[user2@unsvr fs1]# cat user1.txt
Create by user1
Modify by user2
user2 也可以修改 user1.txt 档案了
user3 登入系统
[user3@unsvr user3]# cd /fs1
[user3@unsvr fs1]# cat user1.txt
cat : user1.txt Permission denied
除了 user1,user2 外没有其它人有读写 user1.txt 的权限(root 除外)
2.个别的群组
ACL 的个别群组权限设定就如同之前个别的使用者方法一样,不过群组的权限设定还要先设定 /etc/group,所以我们要做下列的练习要先做些设定.
假设 user1 user2 user3的使用者以及 group1 group2 群组都已建立,或者用下面的方式来建立
root 登入系统
[root@unsvr root]#adduser user1
[root@unsvr root]#adduser user2
[root@unsvr root]#adduser user3
[root@unsvr root]#passwd user1
[root@unsvr root]#passwd user2
[root@unsvr root]#passwd user3
设定群组
[root@unsvr root]#groupadd group1
[root@unsvr root]#groupadd group2
[root@unsvr root]#vi /etc/group
-----------------------------------------------------------------------
..................
group1:x:503:user1,user2
group2:x:504:user3
-----------------------------------------------------------------------
user1 user2 属于 group1 群组
user3 属于 group2 群组
mount 一个 ext3 档案系统至目录 /fs1
[root@unsvr root]#mount -t ext3 -o acl /dev/sda1 /fs1
ex:user1 想将他的档案分享给 group1 的人读写的权限.
user1 登入系统
[user1@unsvr user1]# cd /fs1
[user1@unsvr fs1]# echo "Create by group1's user1" > group1.txt
[user1@unsvr fs1]# chmod go-r user1.txt
[user1@unsvr fs1]# ll user1.txt
-rw------- 1 user1 user1 17 Jul 14 22:11 group1.txt
此时除了 user1 有读写的权限外没有其它人有读写 user1.txt 的权限(root 除外)
user2 登入系统
[user2@unsvr user2]# cd /fs1
[user2@unsvr fs1]# cat group1.txt
cat : group1.txt Permission denied
user1 登入系统
[user1@unsvr fs1]# setfacl -m g:group1:rw user1.txt
设定 group1 有权限读写这个档案.
note:
看一下他的档案属性变化
[user1@unsvr fs1]# ll
-rw-rw-r--+ 1 user1 user1 10 Feb 16 13:52 group1.txt
你会看到后面多了一个 "+" 表示这个档案有使用 ACL 的属性设定
再用指令 getfacl 来看 ACL 的档案属性设定为何
[user1@unsvr fs1]# getfacl group1.txt
# file: group1.txt
# owner: user1
# group: user1
user::rw-
group::rw-
group1:group1:rw-
mask::rw-
other::---
可以看到 group1 群组的人有权限读写这个档案.
user2 登入系统
[user2@unsvr user2]# cd /fs1
[user2@unsvr fs1]# cat group1.txt
Create by group1's user1
user2(group1 群组的人包括 user1 user2) 可以读取 group1.txt 档案了
[user2@unsvr fs1]# echo "Modify by group1's user2" >> group1.txt
[user2@unsvr fs1]# cat group1.txt
Create by group1's user1
Modify by group1's user2
user2(group1 群组的人包括 user1 user2) 也可以修改 group1.txt 档案了
user3 登入系统
[user3@unsvr user3]# cd /fs1
[user3@unsvr fs1]# cat group1.txt
cat : group1.txt Permission denied
除了 user1,user2(group1 群组的人包括 user1 user2) 外没有其它人有读写 group1.txt 的权限(root 除外)
3. effective mask 的权限.
这时 user1 想将刚才的权限暂时移除,就可以用下面的方式来设定
[user1@unsvr fs1]# setfacl -m m:--- user1.txt
[user1@unsvr fs1]# getfacl user1.txt
# file: user1.txt
# owner: user1
# group: user1
user::rw-
user:user2:rw- #effective:---
group::rw- #effective:---
mask::---
other::---
[user1@unsvr fs1]# setfacl -m m:--- group1.txt
[user1@unsvr fs1]# getfacl group1.txt
# file: group1.txt
# owner: user1
# group: user1
user::rw-
group::rw- #effective:---
group1:group1:rw- #effective:---
mask::rw-
other::---
这种 effective mask 的设定会影响到个别的使用者,群组,和使用者群组.
4.其它的使用者的权限设定
[user1@unsvr fs1]#setfacl -m o:rw user1.txt
他的设定就如同下面的一般权限设定
[user1@unsvr fs1]# chmod o+rw user1.txt
目录权限的设定
对目录而言:
可读(r):对目录而言单独有此权限是没有用的,还要同时有x的权限.才能有 ls 读取目录的内容.
可写(w): 对目录而言单独有此权限是没有用的,还要同时有x的权限.才能有cp,move,touch目录内的档案.
可执行(x): 具有 cd (change directory)进入目录的权限
所以我们要针对 x 的权限来搭配 rw 使用
root 登入系统
[root@unsvr root]#adduser user1
[root@unsvr root]#adduser user2
[root@unsvr root]#passwd user1
[root@unsvr root]#passwd user2
mount 一个 ext3 档案系统至目录 /fs1
[root@unsvr root]#mkdir /fs1
[root@unsvr root]#mount -t ext3 -o acl /dev/sda1 /fs1
[root@unsvr root]#chmod o-rwx /fs1
不希望所有的使用者都能进入目录,新增档案等的权限
ex:/fs1 目录开放进入读写的权限给 user1
root 登入系统
[root@unsvr root]#setfacl -m u:user1:rwx /fs1
[root@unsvr root]#getfacl /fs1
# file: fs1
# owner: root
# group: root
user::rwx
user:user1:rwx
group::---
mask::--x
other::---
user1 登入系统
[user1@unsvr user1]# cd /fs1
[user1@unsvr fs1]# echo "Create by user1" > user1.txt
[user1@unsvr fs1]# ll user1.txt
-rw------- 1 user1 user1 17 Jul 14 22:11 user1.txt
此时除了 user1 有进入目录,读写档案的权限外没有其它人有进入目录,读写档案的权限
user2 登入系统
[user2@unsvr user2]# cd /fs1
-bash:cd /fs1 :Permission denied
只有 user1 有进入目录读写档案的权限
Step3:预设的 ACLs 权限
通常在建立档案的时候,预设的权限是决定在 umask (umask 定义在 /etc/bashrc),而 umask 只能依据特权使用者(root 的umask 为022,)或者非特权使用者(非特权使用者为002)来限定,无法依据目录来设定.而 ACL 可以针对目录来设定预设权限.
ex:将目录 /fs1 的预设权限设定成只有 user 本身能读写执行(rwx).
[root@unsvr fs1]#setfacl -d -m u::rwx /fs1
[root@unsvr fs1]#setfacl -d -m g::0 /fs1
[root@unsvr fs1]#setfacl -d -m o::0 /fs1
[root@unsvr fs1]#getfacl /fs1
# file: fs1
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::---
default:other::---
可以看到 default 的权限已经变了,现在来建立一个档案看看
[root@unsvr fs1]#echo "default perms" > default.txt
[root@unsvr fs1]#ll
-rw--------- 1 root root 15 Jul 27 10:53 root.default
可以看到权限真的只有 user 本身有 rw 的权限,那 x 怎么不见了,那是因为 root.default 并不是一个执行档.
Step4:ACL 的权限移除
如果要将刚才练习的 acl 权限移除时,可以用下面指令来移除
[user1@unsvr fs1]# getfacl user1.txt
# file: user1.txt
# owner: user1
# group: user1
user::rw-
user:user2:rw-
group::rw-
mask::rw-
other::r--
可以看到 user2 有权限读写这个档案.
[user1@unsvr fs1]#setfacl -x u:user2 user1.txt
[user1@unsvr fs1]# getfacl user1.txt
# file: user1.txt
# owner: user1
# group: user1
user::rw-
group::rw-
mask::rw-
other::r--
可以看到 user2 的权限已经移除了.
Step5:其它范例
1.Copying the ACL of one file to another
#getfacl file1 | setfacl --set-file=- file2
2.Copying the access ACL into the Default ACL
#getfacl -a dir | setfacl -d -M -dir
Step6:setfacl 的参数使用方式
#setfacl [-bkndRLP] { -m|-M|-x|-X ...} file ...
{ -m|-M|-x|-X ...} 使用方式
#setfacl -m (rules) (files)
-m 代表是要 modify 权限设定
#setfacl -x (rules) (files)
-x 代表要 remove 权限设定
rules 的使用方式可以分成下列几种格式
u:(uid):(perms)
依使用者来设定来设定权限
g:(gid):(perms)
依群组来设定来设定权限
m:(perms)
依 effective mask 来设定来设定权限
o:(perms)
依其它来设定来设定权限
针对 other group 来设定权限
[-bkndRLP..] 参数使用方式
-b , --remove-all
Remove all extended ACL entries
-k, --remove-default
Remove the Default ACL.
-n , --no-mask
Do not recalculate the effective rights mask
--mask
Do recalculate the effective rights mask
-d, --default
All operations apply to the Default ACL.
--restore=file
Restore a permission backup created by 'getfacl -R' or similar.
--test
Test mode
-R, --recursive
Apply operations to all files and directories recursively.
-L, --logical
Logical walk,follow symbolic links
-P, --physical
Physical walk,skip all symbolic links.