在Linux中,目录或文件的权限是针对的所有者(owner),所属组(group),其他人(others)这3种类别来设置的。这种根据类别控制权限的方法无法精确控制每个用户的行为。为了解决这个问题,Linux引入了访问控制列表(Access Control Lists,简称 ACL),它可以进行精确的权限控制。
文章目录
- 一、访问控制列表简介
- 二、访问控制列表设置示例
- 2.1 设置某个用户的ACL
- 2.2 设置组或其他人的的ACL
- 2.3 清除ACL
- 2.4 设置掩码
- 2.5 设置默认ACL
一、访问控制列表简介
访问控制列表的功能是由acl包实现的,其中包含了设置、修改、删除和查看ACL的工具。
ACL权限总共有2种:
1. access ACLs,可以设置在目录或文件上
2. default ACLs,仅可以设置在目录上
如果目录中的文件没有显式设置ACLs,那么则会继承目录的ACLs。
二、访问控制列表设置示例
ACL通过setfacl工具进行权限的设置、修改和删除。设置的类别有4种:
• 设置某个用户的ACL
• 设置某个组的ACL
• 设置其他人的ACL
• 设置ACL的掩码(权限上限)
设置完成后可以通过getfacl工具查看ACL的具体规则。
2.1 设置某个用户的ACL
这里用root用户在/tmp目录下新建一个file.txt,要求权限如下,所有者:rwx,所属组:rw,其他人:r
touch file.txt
chmod u=rwx,g=rwx,o=r file.txt
ls -l file.txt
现有一个用户userA,要求其没有任何权限。而此文件即使是others也有读的权限,即仅针对userA限制文件权限,此时只能通过ACL实现。使用setfacl命令为userA设置权限,其语法为:setfacl -m u:user:perms file
setfacl -m u:userA:--- file.txt
命令的选项解释如下:
- -m 代表修改/设置权限,常用的选项还有-x 删除ACL,-b清除所有ACL
- u:userA:—,这是规则组合,u代表用户,userA是用户名,也可以用uid代替,—对应rwx权限,这里要求无任何权限,因此是—
- file.txt 文件名
设置完成后可以使用getfacl file.txt来查看文件上的ACLs:
getfacls file.txt
红框处的userA:—代表userA对此文件没有任何权限
切换到userA测试一下
ls -l file.txt
cat file.txt
可以看到文件的所有者,所属组,其他人都有r的权限,但是userA却无法查看文件内容。同时文件权限的最后多了一个+号,这意味着文件设置了ACL。
2.2 设置组或其他人的的ACL
组的ACL设置和用户设置类似,只是影响范围由用户扩展到组,需要变化的部分只有规则组合,u:user:perms需要变为g:group:perms。其中g代表组,group为组名或gid,perms对应具体的rwx权限。例如:
setfacl -m g:root:rxw file.txt
设置其他人的ACL,只需要将规则组合部分变为o:perms,这里o代表others,perms代表具体的权限。
2.3 清除ACL
使用setfacl的-x选项可以清除指定ACL规则,其格式和设置的语法很像,只是没有了perms部分,例如清除userA在file.txt上的ACL:
setfacl -x u:userA file.txt
getfacl file.txt
通过getfacl可以看到ACL规则已经被清除
或者,使用-b选项清除指定文件或目录上所有的ACL规则:
setfacl -b file.txt
2.4 设置掩码
掩码可以看作ACL规则权限的上限设置,你设置所有的ACLs规则都会和掩码进行交集运算,只有在掩码范围内的权限才会生效。
首先我们将userA的属组修改为root
usermod -g root userA
我们设置ACLs属组的权限为rw:
setfacl -m g:root:rw file.txt
getfacl file.txt
注意此时root组的权限和mask都是rw-。
下面我们将mask修改为r,修改掩码的语法将规则部分修改为m:perms
setfacl -m m:r file.txt
getfacl file.txt
可以看到组的权限依然是rw,但是后面多了一行注释effective:r–,表示只有r生效,这是因为下面的mask被修改为r–,所以最高权限只能是r–。这个掩码规则会应用到所有的组和用户ACLs上(这里仅演示了组)。
2.5 设置默认ACL
设置默认的ACL规则,只需要将规则组合前面的字母替换为d,且只能应用在目录上,当在目录上设置ACL时,其下的文件都会继承,如果在文件上设置ACL,则会覆盖所属目录的ACL规则。对于目录,普通的目录权限一般就足够了,通常不会使用ACL控制。
新建一个目录acldir,默认其他人的权限设置为r-x:
mkdir acldir
setfacl -m d:o:r-x acldir
这里只是演示了设置方法,这里目录本身对于其他人的权限是other:—。即使设置default:other::r-x,依然是无法进入目录或查看内容的。这里列举的权限是从上到下依次生效的。