当前位置 主页 > 服务器问题 > Linux/apache问题 >

Linux详解ACL的访问权限控制

栏目:Linux/apache问题 时间:2018-12-04 16:59

  在普通权限中,Linux用户对文件只有三种身份,就是属主、属组和其他人;每种用户身份拥有读(read)、写(write)和执行(execute)三种权限。但是在实际工作中,这三种身份实在是不够用,我们举个例子来看看。
  图 1 的根目录中有一个 /project 目录,这是班级的项目目录。班级中的每个学员都可以访问和修改这个目录,老师也需要对这个目录拥有访问和修改权限,其他班级的学员当然不能访问这个目录。需要怎么规划这个目录的权限呢?应该这样:老师使用 root 用户,作为这个目录的属主,权限为 rwx;班级所有的学员都加入 tgroup 组,使 tgroup 组作为 /project 目录的属组,权限是 rwx;其他人的权限设定为 0。这样这个目录的权限就可以符合我们的项目开发要求了。
  有一天,班里来了一位试听的学员 st,她必须能够访问 /project 目录,所以必须对这个目录拥有 r 和 x 权限;但是她又没有学习过以前的课程,所以不能赋予她 w 权限,怕她改错了目录中的内容,所以学员 st 的权限就是 r-x。可是如何分配她的身份呢?变为属主?当然不行,要不 root 该放哪里?加入 tgroup 组?也不行,因为 tgroup 组的权限是 rwx,而我们要求学员 st 的权限是 r-x。如果把其他人的权限改为 r-x 呢?这样一来,其他班级的所有学员都可以访问 /project 目录了。
  当出现这种情况时,普通权限中的三种身份就不够用了。ACL 权限就是为了解决这个问题的。在使用 ACL 权限给用户 st 陚予权限时,st 既不是 /project 目录的属主,也不是属组,仅仅赋予用户 st 针对此目录的 r-x 权限。这有些类似于 Windows 系统中分配权限的方式,单独指定用户并单独分配权限,这样就解决了用户身份不足的问题。
  ACL是Access Control List(访问控制列表)的缩写,不过在Linux系统中,ACL用于设定用户针对文件的权限,而不是在交换路由器中用来控制数据访问的功能(类似于防火墙)。
  开启ACL权限
  在 CentOS 6.x 系统中 ACL 权限默认是开启的,不需要手工开启。不过,如果你的操作系统不是 CentOS 6.x,那该如何查看 ACL 权限是否开启了呢?可以这样查看:
  [root@localhost ——]# mount
  /dev/sda1 on /boot type ext4 (rw)
  /dev/sda3 on I type ext4 (rw)
  …省略部分输出…
  #使用mount命令可以看到系统中已经挂载的分区,但是并没有看到ACL权限的设置
  [root@localhost ——]# dumpe2fs -h /dev/sda3
  #dumpe2fs是查询指定分区文件系统详细信息的命令
  …省略部分输出…
  Default mount options: user_xattr acl
  …省略部分输出…
  其中,dumpe2fs 命令可选的选项及其含义如下:
  -h:仅显示超级块中的信息,而不显示磁盘块组的详细信息;
  使用 mount 命令可以査看到系统中已经挂载的分区,而使用 dumpe2fs 命令可以査看到这个分区文件系统的详细信息。大家可以看到,我们的 ACL 权限是 /dev/sda3 分区的默认挂载选项,所以不需要手工挂载。
  不过我的 Linux 系统如果没有默认挂载,则可以手工挂载吗?当然可以,执行如下命令:
  [root@localhost ——]# mount -o remount, acl /
  #重新挂载根分区,并加入ACL权限
  使用 mount 命令重新挂载,并加入 ACL 权限。不过使用此命令是临时生效的。要想永久生效,需要修改 /etc/fstab 文件,命令如下:
  [root@localhost ——]#vi /etc/fstab
  UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 /ext4 defaults, acl 1 1
  #加入ACL权限
  [root@localhost ——]# mount -o remount /
  #重新挂载文件系统或重启系统,使修改生效
  在你需要开启 ACL 权限的分区行上(也就是说 ACL 权限针对的是分区),手工在 defaults 后面加入",acl"即可永久在此分区中开启 ACL 权限。
  ACL权限设置
(1)ACL权限管理命令
  我们知道了 ACL 权限的作用,也知道了如何开启 ACL 权限,接下来学习如何査看和设定 ACL 权限。命令如下:
  [root@localhost ——]# getfacle 文件名
  #查看ACL权限
  [root@localhost ——]# setfacl 选项 文件名
  #设定ACL权限
  选项:
  -m:设定 ACL 权限。如果是给予用户 ACL 权限,则使用"u:用户名:权限"格式赋予;如果是给予组 ACL 权限,则使用"g:组名:权限" 格式赋予;
  -x:删除指定的 ACL 权限;
  -b:删除所有的 ACL 权限;
  -d:设定默认 ACL 权限。只对目录生效,指目录中新建立的文件拥有此默认权限;
  -k:删除默认 ACL 权限;
  -R:递归设定 ACL 权限。指设定的 ACL 权限会对目录下的所有子文件生效;
(2)给用户和用户组添加ACL权限
  举个例子,就来看看图 1 中的权限怎么分配。我们要求 root 是 /project 目录的属主,权限是 rwx;tgroup 是此目录的属组,tgroup 组中拥有班级学员 zhangsan 和 lisi,权限是 rwx;其他人的权限是 0。这时,试听学员 st 来了,她的权限是 r-x。我们来看具体的分配命令。
  [root@localhost ——]# useradd zhangsan
  [root@localhost ——]# useradd lisi
  [root@localhost ——]# useradd st
  [root@localhost ——]# groupadd tgroup
  #添加需要试验的用户和用户组,省略设定密码的过程
  [root@localhost ——]# mkdir /project #建立需要分配权限的目录
  [root@localhost ——]# chown root:tgroup /project/
  #改变/project目录的属主和属组
  [root@localhost ——]# chmod 770 /project/
  #指定/project目录的权限
  [root@localhost ——]# ll -d /project/
  drwxrwx--- 2 root tgroup 4096 1月19 04:21 /project/
  #查看一下权限,已经符合要求了
  #这时st学员来试听了,如何给她分配权限
  [root@localhost ——]# setfacl -m u:st:rx /project/
  #给用户st赋予r-x权限,使用"u:用户名:权限" 格式
  [root@localhost /]# cd /
  [root@localhost /]# ll -d project/
  drwxrwx---+ 3 root tgroup 4096 1月19 05:20 project/
  #使用ls-l査询时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限
  [root@localhost /]# getfacl project
  #查看/prpject目录的ACL权限
  #file: project <-文件名
  #owner: root <-文件的属主
  #group: tgroup <-文件的属组
  user::rwx <-用户名栏是空的,说明是属主的权限
  user:st:r-x <-用户st的权限
  group::rwx <-组名栏是空的,说明是属组的权限
  mask::rwx <-mask权限
  other::--- <-其他人的权限
  大家可以看到,st 用户既不是 /prpject 目录的属主、属组,也不是其他人,我们单独给 st 用户分配了 r-x 权限。这样分配权限太方便了,完全不用先辛苦地规划用户身份了。
  我想给用户组赋予 ACL 权限可以吗?当然可以,命令如下:
  [root@localhost /]# groupadd tgroup2
  #添加测试组
  [root@localhost /]# setfacl -m g:tgroup2:rwx project/
  #为组tgroup2纷配ACL权限,使用"g:组名:权限"格式
  [root@localhost /]# ll -d project/
  drwxrwx---+ 2 root tgroup 4096 1月19 04:21 project/
  #属组并没有更改
  [root@localhost /]# getfacl project/
  #file: project/
  #owner: root
  #group: tgroup
  user::rwx
  user:st:r-x
  group::rwx
  group:tgroup2:rwx <-用户组tgroup2拥有了rwx权限
  mask::rwx
  other::--
(3)最大有效权限mask
  mask 是用来指定最大有效权限的。mask 的默认权限是 rwx,如果我给 st 用户赋予了 r-x 的 ACL 权限,mj 需要和 mask 的 rwx 权限"相与"才能得到 st 的真正权限,也就是 r-x "相与"rwxtj 出的值是 r-x,所以 st 用户拥有 r-x 权限。
  如果把 mask 的权限改为 r--,和 st 用户的权限相与,也就是 r--"相与"r-x 得出的值是 r--,st 用户的权限就会变为只读。大家可以这么理解:用户和用户组所设定的权限必须在 mask 权限设定的范围之内才能生效,mask权限就是最大有效权限。
  不过我们一般不更改 mask 权限,只要给予 mask 最大权限 rwx,那么任何权限和 mask 权限相与,得出的值都是权限本身。也就是说,我们通过给用户和用户组直接赋予权限,就可以生效,这样做更直观。
  补充:逻辑与运算的运算符是"and"。可以理解为生活中所说的"并且"。也就是相与的两个值都为真,结果才为真;有一个值为假,与的结果就为假。比如 A 相与 B,结果入表 2 所示。
  表 2 逻辑与运算
  A B and
  真
  真
  假
  假
  那么两个权限相与和上面的结果类似,我们以读(r)权限为例,结果如表 3 所示。
  表 3 读权限相与
  A B and
  r r r
  r - -
  - r -
  - - -
  所以,"rwx"相与"r-x",结果是"r-x";"r--"相与"r-x",结果是"r--"。
  修改最大有效权限的命令如下:
  [root@localhost /]# setfacl -m m:rx project/
  #设定mask权限为r-x,使用"m:权限"格式
  [root@localhost /]# getfacl project/
  #file:project/
  #owner:root
  #group:tgroup
  user::rwx
  group::rwx #effective:r-x
  mask::r-x
  #mask权限变为r-x
  other::--
(4)默认ACL权限和递归ACL权限
  我们已经给 /project 目录设定了 ACL 权限,那么,在这个目录中新建一些子文件和子目录,这些文件是否会继承父目录的 ACL 权限呢?我们试试吧。
  [root@localhost /]# cd /project/
  [root@localhost prq'ect]# touch abc
  [root@localhost prq'ect]# mkdir d1
  #在/project目录中新建了abc文件和d1目录
  [root@localhost project]#ll
  总用量4
  -rw-r--r-- 1 root root 01月19 05:20 abc
  drwxr-xr-x 2 root root 4096 1月19 05:20 d1
  #这两个新建立的文件权限位后面并没有"+",表示它们没有继承ACL权限
  子文件 abc 和子目录 d1 因为是后建立的,所以并没有继承父目录的 ACL 权限。当然,我们可以手工给这��个文件分配 ACL 权限,但是如果在目录中再新建文件,都要手工指定,则显得过于麻烦。这时就需要用到默认 ACL 权限。
  默认 ACL 权限的作用是:如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。默认 ACL 权限只对目录生效。命令如下:
  [root@localhost /]# setfacl -m d:u:st:rx /project/
  #使用"d:u:用户名:权限"格式设定默认ACL权限
  [root@localhost project]# getfacl project/
  # file: project/
  # owner: root
  # group: tgroup
  user:: rwx
  user:st:r-x
  group::rwx
  group:tgroup2:rwx
  mask::rwx
  other::--
  default:user::rwx <-多出了default字段
  default:user:st:r-x
  default:group::rwx
  default:mask::rwx
  default:other::--
  [root@localhost /]# cd project/
  [root@localhost project]# touch bcd
  [root@localhost project]# mkdir d2
  #新建子文件和子目录
  [root@localhost project]# ll 总用量8
  -rw-r--r-- 1 root root 01月19 05:20 abc
  -rw-rw----+ 1 root root 01月19 05:33 bcd
  drwxr-xr-x 2 root root 4096 1月19 05:20 d1
  drwxrwx---+ 2 root root 4096 1月19 05:33 d2
  #新建的bcd和d2已经继承了父目录的ACL权限
  大家发现了吗?原先的 abc 和 d1 还是没有 ACL 权限,因为默认 ACL 权限是针对新建立的文件生效的。
  再说说递归 ACL 权限。递归是指父目录在设定 ACL 权限时,所有的子文件和子目录也会拥有相同的 ACL 权限。
  [root@localhost project]# setfacl -m u:st:rx -R/project/
  #-R递归
  [root@localhost project]# ll
  总用量8
  -rw-r-xr--+ 1 root root 01月19 05:20 abc
  -rw-rwx--+ 1 root root 01月19 05:33 bcd
  drwxr-xr-x+ 2 root root 4096 1月19 05:20 d1
  drwxrwx--+ 2 root root 4096 1月19 05:33 d2
  #abc和d1也拥有了ACL权限
  总结一下:默认 ACL 权限指的是针对父目录中新建立的文件和目录会继承父目录的 ACL 权限,格式是"setfacl-m d:u:用户名:权限 文件名";递归 ACL 权限指的是针对父目录中已经存在的所有子文件和子目录继承父目录的 ACL 权限,格式是"setfacl-m u:用户名: 权限 -R 文件名"。
(5)删除ACL权限
  我们来看看怎么删除 ACL 权限,命令如下:
  删除指定的ACL权限:
  [root@localhost /]# setfacl -x u:st /project/
  #删除指定用户和用户组的ACL权限
  [root@localhost /]# getfacl project/
  # file:project/
  # owner: root
  # group: tgroup
  user::rwx
  group::rwx
  group:tgroup2:rwx
  mask::rwx
  other::--
  #st用户的权限已被删除
  删除所有ACL权限:
  [root@localhost /]# setfacl -b project/
  #会删除文件的所有ACL权限
  [root@localhost /]# getfacl project/
  #file: project/
  #owner: root
  # group: tgroup
  user::rwx
  group::rwx
  other::--
  #所有ACL权限已被删除
  Linux公社的RSS地址:http
缩小 缩小 缩小 缩小
IIS7整站下载工具 IIS7批量查询排名 IIS7远程桌面连接工具 iis7-iis网站批量管理 iis7批量替换工具 IIS7服务器专用下载工具 IIS7日志分析工具 IIS7批量PING,服务器批量添加网卡IP小工具 IIS7远程同步备份工具
IIS7网站监控 站群批量SEO查询 批量获取排名域名 批量关键词排名查询 模拟各种蜘蛛 批量友情链接监测 批量检测死链 搜索引擎大全 批量查询外链
批量查询网站标题 批量查询KeyWords 批量查询描述 批量查询网站IP 批量百度收录查询 批量查询百度日收录 批量查询百度周收录 批量查询百度月收录 批量查询360总收录 批量查询360日收录 批量查询网站年龄 批量查询360PC权重 批量查询爱站移动权重 批量查询站长移动权重 批量查询360移动权重 批量查询神马权重 批量查询谷歌PR 批量查询搜狗PR 批量查询百度反链 批量查询爱站首页反链 批量查询爱站内页反链 批量查询百度快照 批量查询搜狗快照 批量icp备案查询 批量网站ip地址查询 批量查询导出链接 批量查询百度V认证 批量查询百度安全 批量查询站长PC权重 批量查询爱站PC权重 批量查询搜狗总收录 站长资源大全 IIS7-cms大全 IIS7站群大全 IIS7虚拟空间大全 IIS7服务器大全 IIS7-VPS大全