Linux文件权限与属性详解 之 ACL

 

Linux文件权限与属性详解 之 一般权限
Linux文件权限与属性详解 之 ACL
Linux文件权限与属性详解 之 SUID、SGID & SBIT
Linux文件权限与属性详解 之 chattr & lsattr
Linux文件权限与属性详解 之 su & sudo

ACL权限

1. 什么是ACL

ACL(Access Control List),访问控制列表。
那么这玩意有啥用处呢?下面我们考虑一种场景:

那么,我们为什么不为Sherry开小灶呢?就是让其不属于任何一个组,只是以单用户的身份被赋予特定权限。
这种“开小灶”的方式,其实就是ACL权限!
centos7 ACL-LMLPHP
ACL可以针对单一用户、单一文件或目录来进行r、w、x的权限设置,对于需要特殊权限的使用状况非常有帮助

2. ACL的操作

0). 查看系统是否支持ACL

首先,我们看一下自己的Linux系统存在着那些硬盘:

[niesh@niesh ~]$ df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos_niesh-root xfs 18G 8.5G 9.1G 49% /
devtmpfs devtmpfs 348M 0 348M 0% /dev
tmpfs tmpfs 363M 84K 363M 1% /dev/shm
tmpfs tmpfs 363M 5.5M 358M 2% /run
tmpfs tmpfs 363M 0 363M 0% /sys/fs/cgroup
/dev/sda1 xfs 497M 158M 339M 32% /boot
.host:/ vmhgfs 271G 42G 229G 16% /mnt/hgfs
tmpfs tmpfs 73M 16K 73M 1% /run/user/42
tmpfs tmpfs 73M 0 73M 0% /run/user/1000

根目录(/)的挂载点此处为/dev/mapper/centos_niesh-root,我们可以查看其是否支持ACL权限

[root@niesh ~]# dumpe2fs -h /dev/centos_niesh/root
dumpe2fs 1.42.9 (28-Dec-2013)
dumpe2fs: Bad magic number in super-block 当尝试打开 /dev/centos_niesh/root 时
找不到有效的文件系统超级块.

很郁闷,居然报这个错误,查了很多资料,发现dumpe2fs命令为ext文件系统家族的命令,我的系统为CentOS7,文件系统为XFSXFS默认支持ACL:

[root@niesh ~]# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.2.1511 (Core)
Release: 7.2.1511
Codename: Core [root@niesh ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos_niesh-root xfs 18G 8.5G 9.1G 49% /

可以使用 xfs_info /dev/xxx查看'XFS`文件系统信息:

[root@niesh ~]# xfs_info /dev/centos_niesh/root
meta-data=/dev/mapper/centos_niesh-root isize=256 agcount=4, agsize=1144832 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=4579328, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

但是,貌似看不到是否支持ACL权限,我也只能这样了 (谁知道怎么查看请留言告诉我,不胜感激) 

1). 安装ACL

系统默认的是不会安装ACL权限的,因此需要我们自己动手:

centos7 ACL-LMLPHP

2). 开启ACL

首先,我们查看一下我们Linux系统的ACL权限有没有开启:
使用 mount命令:

[root@niesh ~]# mount
/dev/mapper/centos_niesh-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=34,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)

很明显,/dev/mapper/centos_nie-root没有ACL权限,我们需要自己手动开启。
开启的方式有两种:

centos7 ACL-LMLPHP

完成修改后,需要重启或者重新挂载你设置的分区,此处我需要重新挂载根分区:

3). ACL文件设置

最常用的有以下2个命令:

  • setfacl: 设置文件或目录的ACL设置信息
    命令:setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
    参数:

  • 针对我们最开始讨论问题,此处我们进行实战练习。
    首先,我建立一个目录Project:

    [niesh@niesh tmp]$ mkdir -m 770 Project
    [niesh@niesh tmp]$ ll
    总用量 0
    drwxrwx---. 2 niesh niesh 6 7月 28 15:44 Project

    其次,我增加一个新用户叫做Sherry:

    [root@niesh ~]# useradd Sherry
    [root@niesh ~]# passwd Sherry
    [root@niesh ~]#

    再次,查看我和Sherry分别属于哪一个组:

    [root@niesh ~]# groups Sherry
    Sherry : Sherry
    [root@niesh ~]# groups niesh
    niesh : niesh wheel

    很明显我俩不属于同一个组,因此Sherry对我建立的 Project 目录不具备任何权限:

    [Sherry@niesh tmp]$ cd Project/
    bash: cd: Project/: 权限不够
    [Sherry@niesh tmp]$ ^C
    [Sherry@niesh tmp]$ ll Project/
    ls: 无法打开目录Project/: 权限不够

    然后,我增加Sherry的ACL权限:

    [niesh@niesh tmp]$ setfacl -m u:Sherry:rx Project/
    [niesh@niesh tmp]$ ll
    总用量 4
    drwxrwx---+ 2 niesh niesh 6 7月 28 15:44 Project

    看到了吧,以上权限第11位有一个 + 号,代表的就是ACL权限

    4). 查看ACL权限

    我们可以使用 getfacl命令查看刚才设置好的权限:
    设置之前:

    [niesh@niesh tmp]$ getfacl Project/
    # file: Project/
    # owner: niesh
    # group: niesh
    user::rwx
    group::rwx
    other::---

    设置之后:

    [niesh@niesh tmp]$ getfacl Project/
    # file: Project/
    # owner: niesh
    # group: niesh
    user::rwx
    user:Sherry:r-x
    group::rwx
    mask::rwx
    other::---

    多了几行:

    5). 删除ACL

    采用 setfacl -d <dir>命令:

    [niesh@niesh tmp]$ setfacl -b Project/
    [niesh@niesh tmp]$ ll
    总用量 0
    drwxrwx---. 2 niesh niesh 6 7月 28 15:44 Project [niesh@niesh tmp]$ getfacl Project/
    # file: Project/
    # owner: niesh
    # group: niesh
    user::rwx
    group::rwx
    other::---

    删除我刚才建立的Sherry用户:

    [root@niesh ~]# userdel -r Sherry
    [root@niesh ~]# cat /etc/passwd
    05-28 04:11