自主访问控制(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查看一个文件的时候,会显示如下结果
linuxidc@linuxidc:~$ ls -l test -rw-rw-r-- 1 linuxidc xlzh 0 3月 15 15:12 test linuxidc@linuxidc:~$
最前面的’-’,表示文件为普通类型
第一组的‘rw-’,表示文件属主对文件具有读和写权限,但没有执行权限
第二组的’rw-’,表示同组其他用户对文件具有读和写权限,但没有执行权限
第三组的’r--’,表示其他组用户对文件具有读权限,但没有写和执行权限
上述每一组权限用可以用二进制表示,例如’rw-’,二进制表示是110,十进制数值是6,‘r--’,二进制表示100, 十进制数值是4;所以对每一组权限都可以用十进制来表示。当使用chmod修改文件权限的时候就可以使用十进制代替‘rwx’,例如
linuxidc@linuxidc:~$ ls -l test -rw-rw-r-- 1 linuxidc xlzh 0 3月 15 15:12 test linuxidc@linuxidc:~$ chmod 766 test linuxidc@linuxidc:~$ ls -l test -rwxrw-rw- 1 linuxidc xlzh 0 3月 15 15:12 test linuxidc@linuxidc:~$
当然也可以通过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目录
linuxidc@linuxidc:~$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 42824 9月 13 2012 /usr/bin/passwd linuxidc@linuxidc:~$ ls -ld /tmp drwxrwxrwt 16 root root 12288 3月 15 15:31 /tmp linuxidc@linuxidc:~$
可以看到/usr/bin/passwd的第一组权限位和上一节有所不同,第三个标志位变成了s。当属主用户对文件设置了suid位后,其他用户在执行该文件的时候则具有等同于属主的权限。
还是以passwd命令为例,普通用户可以用passwd修改自己的密码,而用户密码的hash存储在/etc/shadow文件中,修改密码必然要修改此文件,我们看下此文件
linuxidc@linuxidc:~$ ls -l /etc/shadow -rw-r----- 1 root shadow 1647 2月 18 09:46 /etc/shadow linuxidc@linuxidc:~$
发现只有root用户可以修改此文件,也就是说当普通用户执行passwd命令的时候,其权限变为root的权限,故可以修改/etc/shadow文件。
guid类似
SUID对目录没有影响,SGID对目录有影响,对于设置了SGID的目录,所有用户在该目录下新建的文件属主输入该用户,但GID是该目录所属的组,如下
linuxidc@linuxidc:~$ sudo mkdir -m 2777 test linuxidc@linuxidc:~$ ls -ld test drwxrwsrwx 2 root root 4096 3月 28 16:23 test linuxidc@linuxidc:~$ cd test linuxidc@linuxidc:~/test$ touch 1.txt -rw-rw-r-- 1 linuxidc root 0 3月 28 16:23 1.txt