分类: LINUX
2014-08-18 13:38:11
原文地址:[原创] POSIX ACL 学习笔记 - (中篇) 作者:ailms
#问题 :模拟 ACL 的基本操作
[答案] :
首先确认当前文件系统启用了 ACL 功能
[root@mail ~]#
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw,acl)
/dev/hdb1 on /boot type ext3 (rw,acl)
[root@mail ~]#
[root@as7 t1]# touch file1
[root@as7 t1]# ll file1
-rw-r--r-- 1 root root 0 Nov 18
20:45 file1
[root@as7 t1]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@as7 t1]#
[root@as7 t1]# ll /home
total 32
drwx------ 4 bob bob
4096 Oct 12 00:34 bob # 注释 :使用它来测试
drwx------ 4 guest guest 4096 Apr 16 2006 guest
drwx------ 20 n7css n7css 4096 Oct 11 00:44 n7css # 注释 :使用它来测试
drwx------ 15 oracle dba 4096 May 10
2006 oracle
[root@as7 t1]
n7css@as7: /mnt/t1>whoami
n7css
n7css@as7: /mnt/t1>echo
"ok" >> file1
-bash: file1: Permission denied # 注释 :可以看到 n7css 用户不允许写该文件
n7css@as7: /mnt/t1>
现在使用 setfacl 给 n7css 用户添加 w 权限
[root@mail tmp]# setfacl -m
u:bob:rw file1
[root@mail tmp]#
[root@mail tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:bob:rw- # 注释 :现在 bob 用户具有对 file1 的写权限
group::r--
mask::rw- #
注释 :mask 限制了最
other::r--
[root@mail tmp]#
[root@mail tmp]# ll file1
-rw-rw-r--+ 1 root root 0 Nov 18 22:57
file1 # 注释 :可以看到 + 就是表示有设置了ACL 条目
[root@mail tmp]#
现在尝试用 bob 用户的身份来修改文件 file1
[bob@mail tmp]$ whoami
bob
[bob@mail tmp]$ echo
"ok" >> file1
[bob@mail tmp]$ cat file1
ok # 注释 :可以看到文件 file1 已经被修改了
[bob@mail tmp]$
[root@mail tmp]# setfacl -m
u:bob:rwx file1
[root@mail tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:bob:rwx
group::r--
mask::rwx
other::r--
[root@mail tmp]#
===============================================================================================
#问题 :setfacl 中的 mask 条目有普通 mask 和 default mask
[答案] :
[root@mail RPMS]# ll -d subdir
drwxrwxr-x+ 2 root root 4096 Nov 22 22:48
subdir
[root@mail RPMS]#
[root@mail RPMS]# getfacl subdir
# file: subdir
# owner: root
# group: root
user::rwx
user:bob:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:bob:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
[root@mail RPMS]#
===============================================================================================
#问题 :default mask 的介绍
[答案] :
[root@mail tmp]# setfacl -m
d:u:bob:rwx RPMS/
[root@mail RPMS]# getfacl .
# file: .
# owner: bob
# group: bob
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:bob:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
可以看到加上了 default ACL ,它不会在 access ACL 中添加条目。但子目录就不同了,见下面
[root@mail RPMS]#
[root@mail RPMS]# touch file
[root@mail RPMS]# getfacl file
# file: file
# owner: root
# group: root
user::rw-
user:bob:rwx #effective:rw- # 注释 :
group::r-x
#effective:r--
mask::rw- #
注释 :可以看到 mask 变成了 rw-,而不是父目录的 rwx
other::r--
[root@mail RPMS]#
[root@mail RPMS]# mkdir subdir
[root@mail RPMS]# getfacl subdir
# file: subdir
# owner: root
# group: root
user::rwx
user:bob:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:bob:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
[root@mail RPMS]# ll -d subdir
drwxrwxr-x+ 2 root root 4096 Nov 22 22:48 subdir
[root@mail RPMS]#
[root@mail RPMS]# ll file
-rw-rw-r--+ 1 root root 0 Nov 22 22:48 file
[root@mail RPMS]#
===============================================================================================
#问题 :setfacl 命令的用法
[答案] :
-)1、-b 、--remove-all :表示删除所有 ACL 条目,除了base acl 条目
-)2、-k, --remove-default :删除 default ACL 条目。如果没有 default ACL 则什么都不做
-)3、-n, --no-mask :不重新计算 mask 条目。setfacl 默认是会重新计算 MASK 条目,除非你明确指定了 Mask 条目的权限
mask 条目用于设置所有者 group、所有 named
user/group 的权限。
-)4、--mask :重新计算 mask 条目,即使已经存在一个 mask 条目了
-)5、-d, --default :设置 Default ACL 条目
-)6、--restore=file :从指定文件恢复文件的 ACL 设置
-)7、--test :测试
-)8、-R, --recursive :递归操作
-)9、-L, --logical :跟随 symbolic
link
-)10、-P, --physical :跳过所有 symbolic
links
-)11、--version :打印版本并退出
-)12、-- :表示结束所有选项
-)13、- :从 stdin 接受输入
-)14、-m
-M
-)15、-x
-X
-)16、--set=
-)17、--set-file=
===============================================================================================
#问题 :什么是 Default ACL ?什么是Base
ACL 条目
[答案] :
Base ACL 条目就是指 getfacl 输出中蓝色的部分,它们是无法被删除的,它们就是 UNIX 的传统权限
[root@mail tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:bob:-w-
group::r--
group:bob:r--
mask::rw-
other::r--
[root@mail tmp]#
而
Default ACL 条目是针对一个目录所设置的,对文件无效。在该目录下创建的文件自动继承该目录的 Default ACL 。
Default
ACL 一共有4个 :Default
user、Default group、Default mask、Default other
[root@mail tmp]# setfacl -m d:g:bob:rw file1
setfacl: file1: Only directories
can have default ACLs
[root@mail tmp]#
[root@mail tmp]# setfacl -m
d:g:bob:rw RPMS/
[root@mail tmp]#
[root@mail tmp]# getfacl RPMS
# file: RPMS
# owner: bob
# group: bob
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:bob:rw
default:mask::rwx
default:other::r-x
[root@mail tmp]#
可以看到该目录下文件的默认权限是 owner 有全部权限,同组的有 r、x 权限、其他人(除了 bob 组的用户之外)也是 r、x 权限
但 bob 组的用户有 rw 权限,但没有 x 权限
[root@mail tmp]# cd RPMS
[root@mail RPMS]# ll
total 0
[root@mail RPMS]# touch myfile
[root@mail RPMS]# ll myfile
-rw-rw-r--+ 1 root root 0 Nov 19
21:10 myfile
[root@mail RPMS]# getfacl myfile
# file: myfile
# owner: root
# group: root
user::rw-
group::r-x #effective:r--
group:bob:rw-
mask::rw-
other::r--
[root@mail RPMS]#
可以看到由于 mask 没有 x ,所以 group
的 r-x 实际上只剩下 r 权限了。
===============================================================================================
#问题 :如果改变了一个目录的 Default ACL ,该目录下的权限会自动修改吗?
[答案] :
不会
[root@mail tmp]# setfacl -m d:g:bob:rwx RPMS/
[root@mail tmp]#
[root@mail tmp]# getfacl RPMS/
# file: RPMS
# owner: bob
# group: bob
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:bob:rwx
default:mask::rwx
default:other::r-x
[root@mail tmp]#
[root@mail tmp]# cd RPMS
[root@mail RPMS]# ll
total 4
-rw-rw-r--+ 1 root root 0 Nov 19
21:10 myfile
[root@mail RPMS]# getfacl myfile
# file: myfile
# owner: root
# group: root
user::rw-
group::r-x #effective:r--
group:bob:rw-
mask::rw-
other::r--
[root@mail RPMS]#
可以看到并不会自动更新
===============================================================================================
#问题 :同上,如何解决该问题?
[答案] :
===============================================================================================
#问题 :ACL 条目的类型
[答案] :
有4种 :可以看到格式是
[defaul]:
[d[efault]:] [u[ser]:]uid [:perms]
Permissions of a named user. Permissions
of the file owner if uid is empty.
# 注释 :用于设置用户的 base、default、或者针对某个用户的设置
[d[efault]:] g[roup]:gid [:perms]
Permissions of a named group.
Permissions of the owning group if gid is empty.
# 注释 :同上,但设置的是 group 的
[d[efault]:] m[ask][:] [:perms]
Effective rights mask
# 注释 :设置 mask 或者默认 mask 条目。mask 是一个文件所的最高权限,如果说acl的优先级高于UGO,那么mask就是一个名副其实的最后一道防线。它决定了一个用户/组能够得到的最大的权限。这样我们在不破坏已有ACL的定义的基础上,可以临时提高或是降低安全级别:
[d[efault]:] o[ther][:] [:perms]
Permissions of others.
# 注释 :针对 other 的设置。
注意,在设置 mask 和 other
ACL 条目时,是不需要指定 uid / username 的,因为没有意义
===============================================================================================
问题 :setfacl 的操作模式
[答案] :
-b
:删除所有
-m
:修改某个现有条目,也可以已用于新增条目
-x
:删除某个现有条目
-M
/ -X : 通过文件操作
===============================================================================================
问题 :setfacl 可以一次处理多个文件吗?
[答案] :
可以。
[root@mail RPMS]# setfacl -m u:bob:rw file{1,2}
[root@mail RPMS]# ll file{1,2}
-rw-rw-r--+ 1 root root 0 Nov 19
21:49 file1
-rw-rw-r--+ 1 root root 0 Nov 19
21:49 file2
[root@mail RPMS]#
===============================================================================================
#问题 :setfacl
如何一次指定多个 acl ?
[答案] :
用 逗号隔开。例如
[root@mail tmp]# setfacl -m u:bob:rwx,o:rw file1
[root@mail tmp]#
[root@mail tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:bob:rwx
group::r--
mask::rwx
other::rw-
[root@mail tmp]#
[root@mail tmp]# ll file1
-rw-rwxrw-+ 1 root root 0 Nov 19
21:44 file1
[root@mail tmp]# ./file1
[root@mail tmp]#
可以看到 file1 变成了有执行权限,因为 bob 的 rwx 权限
===============================================================================================
问题 :setfacl -b 清除某个文件现有的 ACL
[答案] :
[root@mail tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:bob:rw-
group::r--
mask::rw-
other::r--
[root@mail tmp]#
[root@mail tmp]# setfacl -b file1
[root@mail tmp]#
[root@mail tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@mail tmp]#
可以看到关于 bob 用户的条目不见了,只剩下 user、group、other 三个 base ACL 条目
===============================================================================================
问题 :setfacl -b 可以用于目录下的所有文件吗?
[答案] :
可以,用 -R 递归
[root@mail tmp]# ll RPMS/
total 12
-rw-r--r--+ 1 root root 0 Nov 19
21:49 file1
-rw-r--r--+ 1 root root 0 Nov 19
21:49 file2
-rw-r--r--+ 1 root root 0 Nov 19
21:49 file3
[root@mail tmp]#
[root@mail tmp]# setfacl -R -b RPMS/
[root@mail tmp]#
[root@mail tmp]# ll -d RPMS/ RPMS/*
drwxr-xr-x 2 bob
bob 73728 Nov 19 21:49 RPMS/
-rw-r--r-- 1 root root 0 Nov 19 21:49 RPMS/file1
-rw-r--r-- 1 root root 0 Nov 19 21:49 RPMS/file2
-rw-r--r-- 1 root root 0 Nov 19 21:49 RPMS/file3
[root@mail tmp]#
可以看到 “+” 不见了
===============================================================================================
#问题 :setfacl 设置 mask 条目
[答案] :
如果使用 setfacl 后多了某个权限是你不想要的,可以用 mask 屏蔽掉。
例如下面的 file1 就变成可执行的,但这是一个空文件,你不想然普通用户可以通过
./file1 执行它
[root@mail tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:bob:rwx
group::r--
mask::rwx
other::rw-
[root@mail tmp]#
[root@mail tmp]# ll file1
-rw-rwxrw-+ 1 root root 0 Nov 19
21:44 file1
[root@mail tmp]# ./file1
[root@mail tmp]#
可以看到可以执行 file1
[root@mail tmp]# setfacl -m m:rw file1
[root@mail tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:bob:rwx #effective:rw- # 注释 :当实际权限小于设置权限时,就会显示 effective 行,表示 bob 实际上只有 rw 权限而已,没有 x 权限
group::r--
mask::rw-
other::rw-
[root@mail tmp]#
[root@mail tmp]# ll file1
-rw-rw-rw-+ 1 root root 0 Nov 19
21:44 file1 #
注释 :可以看到 group
部分不再显示 rwx 而是 rw- 了
可以看到 file1 不再具备执行权限了
[root@mail tmp]# su - bob
[bob@mail ~]$ cd /tmp
[bob@mail tmp]$ ./file1
-bash: ./file1: Permission denied # 注释 :bob 用户不再具备 x 权限了
[bob@mail tmp]$
[root@mail tmp]# ./file1
-bash: ./file1: Permission denied
[root@mail tmp]# /tmp/file1
-bash: /tmp/file1: Permission denied
[root@mail tmp]# su - bob
[bob@mail ~]$ /tmp/file1
-bash: /tmp/file1: Permission denied
[bob@mail ~]$ cd /tmp/
[bob@mail tmp]$ ./file1
-bash: ./file1: Permission denied
[bob@mail tmp]$
===============================================================================================
#问题 ;如何通过 mask 条目计算实际权限?
[答案] :
===============================================================================================
#问题 :如何 mask 高于设置权限呢?例如 -m u:bob:rw,m:rwx ?
[答案] :
[root@mail tmp]# setfacl -m u:bob:rw,m:rwx file1
[root@mail tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:bob:rw-
group::r--
mask::rwx
other::rw-
[root@mail tmp]#
[root@mail tmp]# ll file1
-rw-rwxrw-+ 1 root root 0 Nov 19
21:44 file1 # 注释 :可以看到 file1 的 group 是可执行的
[root@mail tmp]# /tmp/file1 # 注释 :可以看到 root (所有者)是可以执行该文件的
[root@mail tmp]# ./file1
[root@mail tmp]# su -l bob
[bob@mail ~]$ /tmp/file1
-bash: /tmp/file1: Permission
denied # 注释 :但 bob 这个 other 却只能获得所设置的权限,无法执行
[bob@mail ~]$ cd /tmp/
[bob@mail tmp]$ ./file1
-bash: ./file1: Permission denied
[bob@mail tmp]$