自主访问控制(Discretionary Access Control, DAC)是指对象(比如程序、文件、进程)的拥有者可以任意修改或者授予此对象相应的权限。Linux的UGO(User, Group, Other)和ACL(Access Control List)权限管理方式就是典型的自主访问控制。UGO将权限信息存储在节点的权限中,ACL将权限位信息存储在节点的扩展属性中。

1、Linux UGO权限管理

1.1 普通权限

当一个文件创建后,它具有读(r)、写(w)、执行(x)三种操作方式。UGO权限管理方式将访问文件的操作者简单分为三类:文件属主(u)、同组用户(g)与其他组用户(o)。

文件的三种操作方式用三个二进制位表示,第一位表示读权限,第二位表示写权限,第三位表示执行权限。一个文件的权限属性就是有三类用户对该文件的权限使能的集合。当我们用ls查看一个文件的时候,会显示如下结果

xlzh@cmos:~$ ls -l test
-rw-rw-r-- xlzh xlzh 3月 : test
xlzh@cmos:~$

最前面的’-’,表示文件为普通类型

第一组的‘rw-’,表示文件属主对文件具有读和写权限,但没有执行权限

第二组的’rw-’,表示同组其他用户对文件具有读和写权限,但没有执行权限

第三组的’r--’,表示其他组用户对文件具有读权限,但没有写和执行权限

上述每一组权限用可以用二进制表示,例如’rw-’,二进制表示是110,十进制数值是6,‘r--’,二进制表示100, 十进制数值是4;所以对每一组权限都可以用十进制来表示。当使用chmod修改文件权限的时候就可以使用十进制代替‘rwx’,例如

xlzh@cmos:~$ ls -l test
-rw-rw-r-- xlzh xlzh 3月 : test
xlzh@cmos:~$ chmod test
xlzh@cmos:~$ ls -l test
-rwxrw-rw- xlzh xlzh 3月 : test
xlzh@cmos:~$

当然也可以通过chmod u+x,o+w test实现与上述同样的功能。具体使用哪种方式,单凭个人喜好。

在linux下一切皆文件,目录也不例外,但目录的读写执行权限与普通文件的读写执行权限含义有所不同,如下所示

权限位 文件 目录
r 可以读文件 可以查看目录中内容
w 可以写文件 可以增删目录中内容
x 可以执行文件 可以进入目录

1.2 特殊权限

1.1节描述了常用的权限位,但还有几个特殊的权限位需要知道,分别是s(suid),s(sgid), t(Sticky Bit)。首先看一下linux下的/usr/passwd文件和/tmp目录

xlzh@cmos:~$ ls -l /usr/bin/passwd
-rwsr-xr-x root root 9月 /usr/bin/passwd
xlzh@cmos:~$ ls -ld /tmp
drwxrwxrwt root root 3月 : /tmp
xlzh@cmos:~$

可以看到/usr/bin/passwd的第一组权限位和上一节有所不同,第三个标志位变成了s。当属主用户对文件设置了suid位后,其他用户在执行该文件的时候则具有等同于属主的权限。

还是以passwd命令为例,普通用户可以用passwd修改自己的密码,而用户密码的hash存储在/etc/shadow文件中,修改密码必然要修改此文件,我们看下此文件

xlzh@cmos:~$ ls -l /etc/shadow
-rw-r----- root shadow 2月 : /etc/shadow
xlzh@cmos:~$

发现只有root用户可以修改此文件,也就是说当普通用户执行passwd命令的时候,其权限变为root的权限,故可以修改/etc/shadow文件。

guid类似

SUID对目录没有影响,SGID对目录有影响,对于设置了SGID的目录,所有用户在该目录下新建的文件属主输入该用户,但GID是该目录所属的组,如下

xlzh@cmos:~$ sudo mkdir -m  test
xlzh@cmos:~$ ls -ld test
drwxrwsrwx root root 3月 : test
xlzh@cmos:~$ cd test
xlzh@cmos:~/test$ touch .txt
-rw-rw-r-- xlzh root 3月 : .txt

而对于t,又叫粘着位,仅对目录生效。在具有t位的目录下,如果用户在该目录下具有w及x权限,则当用户在该目录下建立文件或目录时,只有文件拥有者与root才有权力删除。/tmp目录则是最好的例子,每个应用都可以在tmp目录下新建删除自己的文件,但却不能删除其应用建立的文件。

那么如何修改文件的sst权限呢?还是使用chmod命令,由第一节我们知道可以用十进制数值设置UGO对文件的访问权限,同样对于特殊权限位,也可以使用。只需在原来的数值前面加上sst的十进制数值。有时候我们还会看到大写的SST,那是因为可执行位为0,所以显示为大写,例如

xlzh@cmos:~$ ls -l test
-rw-rw-r-- xlzh xlzh 3月 : test
/*为文件增加sst,仅做演示,实际上t为对文件不生效*/
xlzh@cmos:~$ chmod test
/*为文件加上了suid, sgid, Sticky Bit位*/
xlzh@cmos:~$ ls -l test
-rwsrwsrwt xlzh xlzh 3月 : test
/*去除文件的可执行位*/
xlzh@cmos:~$ chmod test
/*显示为大写*/
xlzh@cmos:~$ ls -l test
-rwSrwSrwT xlzh xlzh 3月 : test
xlzh@cmos:~$

1.3 掩码

先做一个实验,在linux下分别建立一个目录和一个文件,查看其权限位

xlzh@cmos:~$ mkdir dir
xlzh@cmos:~$ touch test
xlzh@cmos:~$ ls -ld dir
drwxrwxr-x xlzh xlzh 3月 : dir
xlzh@cmos:~$ ls -l test
-rw-rw-r-- xlzh xlzh 3月 : test
xlzh@cmos:~$

可以看到,新建的目录全显示775,新建的文件是664,为什么新建的文件和目录权限不是777呢?就是由于掩码的存在,当用户新建一个目录的时候,是777与掩码做与操作,当用户新建一个文件的时候,是666与掩码做与操作。可以用umask命令查看当前系统掩码

xlzh@cmos:~$ umask

xlzh@cmos:~$

新建目录是777与007做掩码,结果正是775,新建文件是666与002做掩码,结果正是664。

当然,还可以通过umask命令修改系统掩码,新建文件的权限位也跟着改变。

2、Linux ACL权限管理

UGO权限管理方式只能对属主、同组用户和其他组用户进行权限管理,很难对每个用户或用户组进行权限管理。ACL就是为了这种局限性而生的。

ACL(Access Control List, 访问控制列表),它是对UGO权限管理的方式进行了扩展、可以对任意的用户/组分配读、写和执行权限。

其常用的命令有getfacl和setfacl。

2.1 设置ACL

首先看一下几种类型

类型 定义
ACL_USER_OBJ 文件属主的权限
ACL_USER 额外用户的权限
ACL_GROUP_OBJ 文件属组的权限
ACL_GROUP 额外组的权限
ACL_MASK ACL_USER、ACL_GROUP_OBJ,ACL_GROUP的最大权限
ACL_OTHER 其他组的权限

设置ACL的命令是setfacl,-m选项表示修改acl规则,使用方式是setfacl  -m {u|g}:{user|group}:rwx;

u表示设置ACL_USER的权限,g表示修改ACL_GROUP的权限

例子如下

/*新建文件,查看文件权限位和ACL规则*/
root@cmos:/home/xlzh# touch test
root@cmos:/home/xlzh# ls -l test
-rw-r--r-- root root 3月 : test
root@cmos:/home/xlzh# getfacl test
# file: test
# owner: root
# group: root
user::rw-
group::r--
other::r--
/*让xlzh用户对test文件有rwx的权限,并查看文件权限位和ACL规则*/
root@cmos:/home/xlzh# setfacl -m u:xlzh:rwx test
root@cmos:/home/xlzh# ls -l test
-rw-rwxr--+ root root 3月 : test
root@cmos:/home/xlzh# getfacl test
# file: test
# owner: root
# group: root
user::rw-
user:xlzh:rwx
group::r--
mask::rwx
other::r--
/*让dhcpd组对test文件有rwx的权限,并查看文件权限位和ACL规则*/
root@cmos:/home/xlzh# setfacl -m g:dhcpd:rwx test
root@cmos:/home/xlzh# ls -l test
-rw-rwxr--+ root root 3月 : test
root@cmos:/home/xlzh# getfacl test
# file: test
# owner: root
# group: root
user::rw- //ACL_USER_OBJ
user:xlzh:rwx //ACL_USER
group::r-- //ACL_GROUP_OBJ
group:dhcpd:rwx //ACL_GROUP
mask::rwx //ACL_MASK
other::r-- //ACL_OTHER root@cmos:/home/xlzh#

可以看到,当设置ACL规则后,ls 查看权限位,在权限位后增加了一个’+’号。

上述例子演示了如何给指定用户和指定组增加rwx权限,当然rwx权限和UGO权限一样,可以随意修改。

设置完成后,xlzh用户和dhcpd组的用户对该文件具有读、写、执行的权限。

2.2 ACL掩码

再看定义,ACL掩码定义了ACL_USER、ACL_GROUP_OBJ,ACL_GROUP的最大权限。举例如下

/*新建文件*/
root@cmos:/home/xlzh# touch test
root@cmos:/home/xlzh# ls -l test
-rw-rw-r-- root root 3月 : test
/*设置acl规则,使xlzh用户和dhcpd组内的用户具有rwx的权限*/
root@cmos:/home/xlzh# setfacl -m u:xlzh:rwx test
root@cmos:/home/xlzh# setfacl -m g:dhcpd:rwx test
root@cmos:/home/xlzh# getfacl test
# file: test
# owner: root
# group: root
user::rw-
user:xlzh:rwx
group::rw-
group:dhcpd:rwx
mask::rwx
other::r--
/*查看文件的权限位,第二组权限发生变化*/
root@cmos:/home/xlzh# ls -l test
-rw-rwxr--+ root root 3月 : test
/*设置掩码,查看权限位和acl规则*/
root@cmos:/home/xlzh# setfacl -m m:r test
root@cmos:/home/xlzh# ls -l test
-rw-r--r--+ root root 3月 : test
root@cmos:/home/xlzh# getfacl test
# file: test
# owner: root
# group: root
user::rw-
user:xlzh:rwx #effective:r--
group::rw- #effective:r--
group:dhcpd:rwx #effective:r--
mask::r--
other::r-- root@cmos:/home/xlzh#

有上述例子可知两点:

1、当文件设置ACL规则后,权限位的第二组显示的不再是属主同组对该文件的访问权限,而是显示ACL的掩码。所以当ls看到权限位后面有‘+’号时,应该使用getfacl查看文件属主所在组的权限。

2、当修改ACL的掩码后,例如把掩码修改为r--,则可以看到ACL_USER,ACL_GROUP_OBJ和ACL_GROUP三行后面增加了#effective:r—,表示这三种类型实际生效的权限只有读权限,为什么会这样?再看ACL_MASK的定义:ACL_USER、ACL_GROUP_OBJ,ACL_GROUP的最大权限。即当把掩码修改为r--后,也就限制了三种类型最大的权限范围,只能小于掩码,不能大于掩码。

2.3 默认ACL

默认ACL仅对目录有效,如果对一个目录设置了默认ACL规则,则在该目录下建立的所有文件都继承此目录的ACL规则。实例如下

/*新建目录,查看ACL规则*/
root@cmos:/home/xlzh# mkdir dir
root@cmos:/home/xlzh# getfacl dir
# file: dir
# owner: root
# group: root
user::rwx
group::rwx
other::r-x
/*设置默认ACL规则,使xlzh和dhcpd对该目录下的所有文件具有rwx权限*/
root@cmos:/home/xlzh# setfacl -d -m u:xlzh:rwx dir
root@cmos:/home/xlzh# setfacl -d -m g:dhcpd:rwx dir
root@cmos:/home/xlzh# ls -ld dir
drwxrwxr-x+ root root 3月 : dir
root@cmos:/home/xlzh# getfacl dir
# file: dir
# owner: root
# group: root
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:xlzh:rwx
default:group::rwx
default:group:dhcpd:rwx
default:mask::rwx
default:other::r-x
/*进入文件,新建目录和文件,查看acl规则*/
root@cmos:/home/xlzh# cd dir
root@cmos:/home/xlzh/dir# touch file
root@cmos:/home/xlzh/dir# mkdir dir
/*xlzh和dhcpd对文件具有rwx权限*/
root@cmos:/home/xlzh/dir# getfacl file
# file: file
# owner: root
# group: root
user::rw-
user:xlzh:rwx #effective:rw-
group::rwx #effective:rw-
group:dhcpd:rwx #effective:rw-
mask::rw-
other::r--
/*xlzh和dhcpd对目录具有rwx权限,并且该目录继承了dir的默认权限*/
root@cmos:/home/xlzh/dir# getfacl dir
# file: dir
# owner: root
# group: root
user::rwx
user:xlzh:rwx
group::rwx
group:dhcpd:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:xlzh:rwx
default:group::rwx
default:group:dhcpd:rwx
default:mask::rwx
default:other::r-x root@cmos:/home/xlzh/dir#

上述实例有一点需要注意:

1、当为dir设置完默认ACl规则后,只是说dir目录下的所有文件继承该目录的所有ACL规则,并不是是说该目录已经具备了该ACL规则。例如上述设置完dir的ACl规则后。xlzh和dhcp组内的用户同样没有权限在dir目录下新建删除文件。除非执行以下命令,设置目录本身的ACL规则

root@cmos:/home/xlzh# getfacl dir
# file: dir
# owner: root
# group: root
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:xlzh:rwx
default:group::rwx
default:group:dhcpd:rwx
default:mask::rwx
default:other::r-x /*默认ACL是指继承给该目录下文件的ACL规则,而不是该目录本身的ACL规则*/
root@cmos:/home/xlzh# setfacl -m u:xlzh:rwx dir
root@cmos:/home/xlzh# setfacl -m g:dhcpd:rwx dir
root@cmos:/home/xlzh# getfacl dir
# file: dir
# owner: root
# group: root
user::rwx
user:xlzh:rwx
group::rwx
group:dhcpd:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:xlzh:rwx
default:group::rwx
default:group:dhcpd:rwx
default:mask::rwx
default:other::r-x root@cmos:/home/xlzh#

2.4 总结

1、普通ACL规则可以设置普通文件和目录文件,是对UGO文件权限方式的补充

2、默认ACL规则只对目录生效,且被该目录下的文件继承,而对该目录本身的权限,还需要使用普通ACL规则

3、设置ACl规则后,文件属组的权限位显示的acl规则的掩码,不再是原来的含义

4、ACL规则的掩码限制了ACL_USER、ACL_GROUP、ACL_GROUP_OBJ的最大权限

Linux UGO和ACL权限管理的更多相关文章

  1. 【linux日常】 ACL权限管理

    ACL ((Access Control Lists) setfacl命令 这里引用一个非常详细的命令介绍. 要点: getfacl -R        递归获取acl权限,可以存储为文件以备还原 g ...

  2. Linux学习,ACL权限管理

    1.setfacl 得到指定文件的ACL权限 -m       表示后续有参数,不可与 -x参数配合使用 -x         删除后续的acl参数,不可与 -m 配合使用 -b        删除所 ...

  3. Linux课程---10、权限管理(权限有哪几种)

    Linux课程---10.权限管理(权限有哪几种) 一.总结 一句话总结: r 读 w 写 x 执行 1.drwxr-x---  2 root root  4096 Jan 20 19:39 mnt ...

  4. Linux用户和文件权限管理

    本文为原创文章,转载请标明出处 目录 用户管理 系统用户文件 添加用户 useradd 设置用户密码 passwd 删除用户 userdel 用户管理 usermod 用户组管理 系统用户组文件 添加 ...

  5. Linux用户及文件权限管理

    Linux用户及文件权限管理

  6. linux的用户扩充权限管理acl和用户使用系统资源的限制

    用户扩充权限管理 acl 1.扩充权限的方式 文件扩充权限 ACL 磁盘配额 2.文件扩充权限 1.安全位 安全位   ---set位    SUID  SGID   set仅可以加给 u.g, 如: ...

  7. Linux学习之ACL权限详解(十)

    Linux系统ACL权限详解 目录 ACL权限简介与开启 查看与设定ACL权限 最大有效权限与删除ACL权限 默认ACL权限和递归ACL权限 ACL权限简介与开启权限 ACL权限简介 用户权限管理始终 ...

  8. Linux系统文件与目录权限管理

    Linux文件目录权限管理 一.Linux文件属性及权限 1.Linux文件及目录权限及属性说明 (1)权限及属性说明 (2)文件权限说明 三种权限说明:r 读  read w 写  write  x ...

  9. 第3章 Linux上文件的权限管理

    3.1 文件/目录的权限 3.1.1 文件的权限 每个文件都有其所有者(u:user).所属组(g:group)和其他人(o:other)对它的操作权限,a:all则同时代表这3者.权限包括读(r:r ...

随机推荐

  1. 一张图看懂dex

    最近在看dex文件格式,看的是飞虫大大的android软件安全与逆向分析一书,写的条理很清晰.相对于elf文件来说,dex文件格式简单了很多,但是提到某个字段,仍然难以想象其所处位置.所以一直想用思维 ...

  2. http status 源码

    private static readonly String[][] s_HTTPStatusDescriptions = new String[][] { null, new String[] { ...

  3. 流输入练习——寻找Sb.VI codevs 3096

    题目描述 Description 已知某开放授权人员名叫Serb,由于经常修改各种数据,因此开发人员们都喊他SB.现在他和许多人一起过飞机安检,排成了一长队列,请问SB.是否在队列中. 输入描述 In ...

  4. Mysql存储过程分析

    为了搞明白为什么mysql的存储过程是高效的,我们需要理解mysql的执行流程是什么,当输入sql语句之后,mysql会先进行sql语句语法正确性检查,然后再进行编译,然后才执行,最后把结果返回.如下 ...

  5. 【译】神经网络与深度学习 Ch1-Section0

    用神经网络识别手写数字 人类的视觉系统是是大自然的奇迹.考虑下面手写数字序列: 大多数人能够轻易地是识别出是504192.在我们大脑的每个半球都有一个基础的皮质,这就是我们熟知的V1区,它包含了14亿 ...

  6. Oracle11.2.0.4 RAC安装文档

    1 环境配置 参考官方文档<Grid Infrastructure Installation Guide for Linux> 1.1 软件环境 操作系统: [root@howe1 ~]# ...

  7. 慕课linux学习笔记(六)常用命令(3)

    Find 命令 #搜索文件 Find [搜索范围] [搜索条件] e.g. find / -name isnstall.log 搜索速度会非常慢 避免大范围搜索,会非常耗费系统资源 Find是在系统当 ...

  8. php随机获取金山词霸每日一句

    header('Content-Type:text/html; charset=utf-8'); $nowyear=date("Y"); $nowmouth = date('m') ...

  9. pyopenssl

    https://pyopenssl.readthedocs.org/en/stable/ pyopenssl是一个封装了openssl的python模块. 使用它可以方便地进行一些加解密操作. 1.产 ...

  10. Codeforces Round #277 (Div. 2) 解题报告

    题目地址:http://codeforces.com/contest/486 A题.Calculating Function 奇偶性判断,简单推导公式. #include<cstdio> ...