ACL(acess control list)
传统UNIX文件系统:文件访问权限包含三个部分,user / group / others,这类文件系统简洁而功能相对完善,在很长时间内被证实可以被应用于大多数场合,其典型表示如图
但是某些特殊场合,仅仅拥有三种权限判定类别是不够的。因此出现了ACL这样新型的文件系统设计,从而指定更多具体的用户其访问权限
ACL标准
标准名称 | 备注 |
---|---|
POSIX ACL | 最初制定的ACL草案,但是由于资金问题并没有成为正式的标准。但是在UNIX阵营被广泛的实现 |
Windows ACL | 微软公司制定了自己的Windows ACL,该方案相比POSIX差异很大并且更加复杂 |
NFSv4 ACL | 鉴于没有一个权威的ACL标准,在制定此标准的时候:基于POSIX ACL,兼容Windows ACL |
ACL 实现
文件系统 | 操作系统 | 支持ACL |
---|---|---|
ReiserFS | Linux | POSIX ACL |
XFS | Linux | POSIX ACL |
JFS | Linux | POSIX ACL |
BtrFS | Linux | POSIX ACL |
ext* | Linux | POSIX ACL |
UFS | Solaris | POSIX ACL |
VxFS | HP-UX | POSIX ACL |
ZFS | Solaris | NFSv4 ACL |
JFS2 | AIX | NFSv4 ACL |
- POSIX ACL
ACL访问表语法格式
语法 | 语义 |
---|---|
user::rw- | 属主权限,可读可写 |
user:wein:r– | 特定用户wein,只读 |
group::r– | 文件属组,只读 |
group:ruby:r-x | 特定用户组ruby,可执行 |
other::rwx | 其它用户,读写,可执行 |
mask::perms | 影响除属主和其它之外的所有成员 |
ACL权限判定
-
判断进程有效用户ID是否和属主相同,如果相同,最终访问权限为user::这一项决定(与mask无关)
-
继续判断有效用户ID是否和其它特定用户相同,如果相同,最终访问权限为user:name:一项与mask决定
-
继续判断有效用户ID所属诸多组别是否和ACL中有匹配项,如果匹配,最终访问权限为group:*:与mask决定
-
以上都不成立,权限取决于other::项(于mask无关)
-
ACL继承
POSIX ACL实验
01 最小ACL(实际ACL并没有存储,只是把9bits翻译成为ACL输出),通过ls -l 输出最后没有提示"+“符号判断是否存储ACL
手动编辑最小ACL,事实上仍然只是修改9bit权限位
02真实ACL
setfacl 把写权限提供给用户wein(wein不在jianleya这个组当中),实验发现wein确实可以写入文件。此时文件已经真实需要一个ACL存储,从文件末尾的”+“符号可以看出这一点
03 当文件末尾有一个”+"符号,意味着文件需要单独存储ACL:
这个时候使用chmod 命令改变组权限将会产生一个问题,chmod g+w 或者g-w修改的是mask这个字段,并不会影响group::
example文件开始组权限只读,使用chmod g+w发现ls命令显示组已经有了写权限,但是ACL中mask增加了w掩码字,group::仍然是只读(这个时候属于jianleya这个组的成员对该文件是没有写权限的)。显然ls -l 的输出有些问题,为了真正赋予组写权限需要编辑ACL group::
- NFSv4 ACL