来源: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. 
|