本章将详细讨论Unix中的文件权限和访问模式。
文件所有权是Unix的一个重要特性,保障了文件的存储安全。Unix中的每个文件都有以下属性:
所有者权限 – 所有者权限决定文件所有者可以对文件执行什么操作。
组权限 – 组权限决定文件所属组的用户可以对文件执行什么操作。
其他用户(世界)权限 – 其他用户权限决定所有其他用户可以对文件执行什么操作。
权限标志
当使用ls -l命令列出文件的详细信息时,也会显示文件权限相关的各种信息,如下所示:
[kevin@localhost ~]$ ls -l
总用量 4
drwxrwxr-x. 2 kevin kevin 157 3月 31 18:40 book
-rw-rw-r--. 1 kevin kevin 4 3月 31 21:17 test1
第一列除了首字母,剩余的rwxrwxr-x就表示了文件权限。
权限被分成三个组,组中的每个位置表示一个特定的权限,顺序为:读(r)、写(w)、执行(x):
第一组前三个字符(2-4)表示文件所有者的权限。例如,-rw-rw-r--表示所有者拥有读取(r)、写入(w)权限。
第二组三个字符(5-7)由文件所属组的权限组成。例如,-rw-rw-r--表示该组用户拥有读取(r)、写入(w)权限。
最后一组三个字符(8-10)表示其他所有人的权限。例如,-rw-rw-r--表示其他人只拥有读取(r)权限。
文件权限
文件权限是Unix系统安全性的第一道防线。Unix权限的基本组成是读、写和执行权限,如下所示:
读 – 查看文件内容
写 – 修改或删除文件
执行 – 将文件作为程序运行
目录权限
目录权限与文件权限基本相同。
具体含义:
读 – 用户可以查看目录中的文件名
写 – 用户可以从目录中添加或删除文件
执行 – 执行目录实际上没有意义,目录的执行权限作用是如要执行目录下的文件必须拥有目录执行权限。如为了执行ls或cd命令,用户必须具有这些命令所在目录bin的执行权限。
改变权限
可通过chmod(change mode)命令更改文件权限和目录权限。使用chmod有两种方式:符号模式和数字模式。
符号模式
符号模式比较简单,可通过下表中的操作符修改权限。
序号
chmod 操作符
1
+
将指定权限添加到文件或目录上
2
–
从文件或目录上删除指定权限。
3
=
设置指定的权限
下面用一个实际的例子展示chmod符号模式用法。
测试文件demofile,首先通过命令ls -l查看其现有权限:
[kevin@localhost ~]$ ls -l
total 4
-rw-rw-r--. 1 kevin kevin 4 Apr 1 10:20 demofile
展示上表中的每个操作符用法:
[kevin@localhost ~]$ chmod u+x demofile
[kevin@localhost ~]$ ls -l
total 4
-rwxrw-r--. 1 kevin kevin 4 Apr 1 10:20 demofile
[kevin@localhost ~]$ chmod g=rx demofile
[kevin@localhost ~]$ ls -l
total 4
-rwxr-xr--. 1 kevin kevin 4 Apr 1 10:20 demofile
[kevin@localhost ~]$ chmod o=rwx demofile
[kevin@localhost ~]$ ls -l
total 4
-rwxr-xrwx. 1 kevin kevin 4 Apr 1 10:20 demofile
[kevin@localhost ~]$ chmod o-w demofile
[kevin@localhost ~]$ ls -l
total 4
-rwxr-xr-x. 1 kevin kevin 4 Apr 1 10:20 demofile
上面命令中,o, u, g的含义:
u – user/所有者
g – group/组
o – other/其他用户
可以1次修改3组权限,用逗号分隔:
[kevin@localhost ~]$ chmod u+x,g=rx,o-w demofile
[kevin@localhost ~]$ ls -l
total 4
-rwxr-xr-x. 1 kevin kevin 4 Apr 1 10:20 demofile
数字模式
通过一个小于8的数字(可转为3位二进制,作为rwx的标志位)指定一组权限,3组权限3个数字。
如下表所示:
数字
二进制
对应权限
Ref
0
000
没有权限
—
1
001
执行
–x
2
010
写
-w-
3
011
写、执行
-wx
4
100
读
r–
5
101
读、执行
r-x
6
110
读、写
rw-
7
111
读、写、执行
rwx
使用测试文件demofile展示数字模式用法。先查看demofile文件权限:
[kevin@localhost ~]$ ls -l
total 4
-rwxr-xr-x. 1 kevin kevin 4 Apr 1 10:20 demofile
展示数字模式用法:
[kevin@localhost ~]$ chmod 755 demofile
[kevin@localhost ~]$ ls -l
total 4
-rwxr-xr-x. 1 kevin kevin 4 Apr 1 10:20 demofile
[kevin@localhost ~]$ chmod 743 demofile
[kevin@localhost ~]$ ls -l
total 4
-rwxr---wx. 1 kevin kevin 4 Apr 1 10:20 demofile
[kevin@localhost ~]$ chmod 740 demofile
[kevin@localhost ~]$ ls -l
total 4
-rwxr-----. 1 kevin kevin 4 Apr 1 10:20 demofile
改变文件所有者
chown命令更改文件的所有权。其基本语法如下:
$ chown user filelist
user可以是用户名或用户id(UID)。
示例:
[root@localhost kevin]# chown root demofile
[root@localhost kevin]# ls -l
total 4
-rwxr-----. 1 root kevin 4 Apr 1 10:20 demofile
将文件所有者改为用户root。
注意:超级用户root可以更改任何文件的所有权,普通用户只能更改自己文件的所有权。
改变文件的组
chgrp命令更改文件的组。其基本语法如下:
$ chgrp group filelist
group可以是系统上组的名称,也可以是系统上组的ID (GID)。
示例:
[root@localhost kevin]# chgrp root demofile
[root@localhost kevin]# ls -l
total 4
-rwxr-----. 1 root root 4 Apr 1 10:20 demofile
将文件的组更改为root组。
注意:每个用户都属于一个组,文件所有者的组与文件的组不必是同一个。
SUID和SGID文件权限
通常一些命令会操作某些文件,如passwd命令会修改/etc/shadow文件,但普通用户对这些文件可能没有修改权限,这些命令就会失败。
这意味着,在执行命令时,为了完成任务,命令必须使用额外的权限执行。
通过一种称为Set User ID (SUID)和Set Group ID (SGID)位的机制,程序可以获得额外的权限。
SUID的作用是把可执行程序所有者的权限赋予可执行程序,无论执行程序的是哪位用户,可执行程序都拥有它的所有者的权限。没有设置SUID位的程序在运行时具有启动程序的用户的权限。
以passwd为例,passwd命令设置了SUID,它的所有者是root,passwd程序需要修改/etc/shadow,由于passwd拥有root权限,即使是普通用户执行passwd,也可以修改/etc/shadow。
SGID类似,正常情况下,程序在用户的组权限下执行,设置了SGID,程序将在程序的组权限下执行。
如果被设置,SUID和SGID位将显示为字母“s”,SUID和SGID的位置与可执行标志位重合。
查看passwd的SUID标志位:
[root@localhost bin]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
显示设置了SUID位,并且命令所有者是root用户。如果执行标志位是大写字母S而不是小写字母s表示该文件不可执行,这个设置是错误的。
要为任何目录设置SUID和SGID位,可通过以下命令
$ chmod ug+s dirname
$ ls -l
drwsr-sr-x 2 root root 4096 Jun 19 06:45 dirname
粘滞位标志
粘滞位(Stickybit),或粘着位,是Unix文件系统权限的常用标志。最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件。如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动其中的文件。实际应用中,粘滞位一般用于/tmp目录,以防止普通用户删除或移动其他用户的文件。
给目录设置粘滞位:
$ chmod +t dirname
如果目录上启用了粘性位,只有以下用户才能删除文件
粘滞目录的所有者
被删除文件的所有者
超级用户root