5章 权限管理

 

5.1 权限的概念

Linux操作系统最强大的功能之一就是多用户多任务,在这种复杂的工作环境中,如何实现文件、用户、组的权限管理就显示非常关键。根据其安全设计原则,可以定义三种安全形式,即用户、组、其他人(不属于用户、组的第三方用户统称为其他人)。用户是这个安全模型的最小基本单位,不论是文件还是正在运行中的进程,系统都会根据用户帐号的属性,来规定用户能做什么事情,不能做什么事情。因此,权限是我们在本节中重点讨论的知识点。

 

5.2 权限的管理

5.2.1 查看权限

查看文件或目录的权限,使用ls -l命令

 

1

 

 

ls -l命令的返回结果,如上图所示,在这个文件的详细列表中,所有信息一共分成七列,每一列所代表的意义如下:

第一列:表示这个文件的类型与权限

在第一列中显示的信息一共有10个字符,这些字符代表分别代表文件与目录的类型与权限,第一个字符代表文件的类型,如上例中“d”代表目录,“-”代表常规文件;第二个字符到第十个字符代表用户、组、其他人的权限,如下图所示:

 

在上图中,数字第0列代表文件的属性,数字第1-3列代表用户(user)的权限,数字第4-6列代表组(group)的权限,数字第7-9列代表其他人(other)的权限。

系统中的基本权限有四种,即读(read),写(write),执行(eXecute),无权限(nopermission),这四种权限分别用字符“r”,“w”,“x”,“-”表示;分别代表的意义见下表所示:

权限类型

功能

r (read)

拥有读取文件内容或目录清单的权限(在目录内可以执行ls命令);

w (write)

具有更改删除文件或目录清单的权限(在目录内可能新建、删除、改名与移动目录);

x (excute)

文件具有x位代表其有执行权限;针对目录设置x位,代表用户可以进入这个目录,在目录内可以执行ls -l命令查看目录详细内容,也可以执行目录内的命令等;

- (none)

没有任何权限;

 

系统为用户、组、其他定义了权限之后,是如何控制他们的具体权限的呢?请看如下权限匹配流程图所示:

 

从上图可以分析出系统针对权限的应用流程细分为:用户在访问相应的文件时,首先检查该用户的UID是否为0,如果用户的UID0就应用管理员的权限;如果文件的UID与访问该文件用户的UID相同,那么应用用户权限;如果用户的UID与文件的UID不相同,安全机制继续检查文件的GID是否与用户的GID相同,如果相同,就应用文件组的权限;如果前面三个条件都不符合,那么系统将最后应用其他人的权限了。

 

第二列:代表文件的链接个数

每一个文件存储在系统中上都由两个部份组成,即文件头也叫文件的属性;另一部份就是文件的数据内容,也叫文件体;文件头部包含文件的名称、权限等信息。每个文件都会将它的权限与属性存储在文件系统的i节点中,Linux文件系统结构就是使用文件名来组织这个目录中的所有文件。因此,为了方便管理与维护每一个文件,系统都为文件分配有一个i节点,所有的i节点的组合就叫i节点表,i节点表管理着有各个文件所使用的数据块。


第三列与第四列 文件或目录的拥有人与组属性
记录着文件拥有人与文件拥有组的信息。在系统中,一个用户帐号可能会属于多个组,加入共享组的目的就是为了访问共享文件之用。


第五列 文件的容量与目录的目录项属性
代表文件的容量大小,默认以字节为单位,如果是目录的话则代表的是目录项的数据。

 

第六列 文件或目录的最后修改时间,如果用户想要查看每一个文件的详细信息可以使用stat命令或ls命令中的“--full-time”参数。


第七列 文件或目录的具体名称,包含文件名带.”的隐藏文件。

 

5.2.2 设置权限

通过对文件权限与成员关分析,我们了解到在Linux系统中文件的权限对于系统的安全性是多么的重要。如何通过有效的手段设置与管理文件的权限来提高数据的安全性就显得非常重要了。文件权限的更改可以分为用户、组和权限设置三种,其对应命令为chownchgrpchmod

 

1.改变文件拥有人与组命令:chown

要更改文件的拥有人息就包含两个部份,一个是文件的拥有人;一个是文件的拥有组。 Linux系统中,只有管理员才有权限更改文件拥有人与拥有组,chown命令的用法如下所示:

 

1更改/tmp/file1.txt文件的拥有人为"user2",组为"user2"

[root@server ~]# chown user2:user2 /tmp/file1.txt

[root@server ~]# ll /root/file1.txt

-rw-r--r--. 1 user2 user2 0 Mar 15 00:43 /root/file1.txt

 

2/etc目录复制到/tmp目录内,调整/tmp/etc目录的拥有人为user2,组为user2

[root@server ~]# cp -R /etc/ /tmp/

[root@server ~]# ls -l /tmp

total 8

drwxr-xr-x. 77 root root 4096 Mar 15 01:06 etc

-rw-r--r--.  1 root root    0 Mar  5 05:33 file1

[root@server ~]# chown user2:user2 /tmp/etc/

[root@server ~]# ls -l /tmp/etc

total 1108

-rw-r--r--.  1 root root     16 Mar 15 01:06 adjtime

-rw-r--r--.  1 root root   1518 Mar 15 01:06 aliases

-rw-r--r--.  1 root root  12288 Mar 15 01:06 aliases.db

drwxr-xr-x.  2 root root   4096 Mar 15 01:06 alternatives

-rw-------.  1 root root    541 Mar 15 01:06 anacrontab

-rw-r--r--.  1 root root     55 Mar 15 01:06 asound.conf

drwxr-x---.  3 root root     41 Mar 15 01:06 audisp

drwxr-x---.  3 root root     79 Mar 15 01:06 audit

drwxr-xr-x.  2 root root     33 Mar 15 01:06 avahi

drwxr-xr-x.  2 root root   4096 Mar 15 01:06 bash_completion.d

-rw-r--r--.  1 root root   2835 Mar 15 01:06 bashrc

drwxr-xr-x.  2 root root      6 Mar 15 01:06 binfmt.d

......省略

 

3:使用-R参数,将/tmp/ect目录下的所有文件拥有人与组属性更改为“user2

[root@server ~]# chown -R user2:user2 /tmp/etc/

[root@server ~]# ls -l /tmp/etc/passwd

-rw-r--r--. 1 user2 user2 1104 Mar 15 01:06 /tmp/etc/passwd

 

2、仅更改文件或目录组成员属性命令:chgrp

chown命令可以设置文件拥有人或同时更改文件拥有人与拥有组。如果系统中的某个文件或目录仅需要调整组成员关系,使用这个工具就不是那么有效了。虽然可以使用chown命令重复设置,不过总是会带来些许不便。chgrp命令可以帮助用户非常简单的更改组成员属性.

 

1使用chgrp命令一次性更改/tmp/etc目录及目录内所有文件的组成员为root

[root@server ~]# chgrp -R root /tmp/etc/

[root@server ~]# ls -l /tmp/etc/passwd

-rw-r--r--. 1 user2 root 1104 Mar 15 01:06 /tmp/etc/passwd

 

3、调整文件或目录权限命令:chmod

chmod文件权限更改命令可以使用两种方式设置文件或目录的权限,即字符方式与数字方式;字符方式分为以下几种类型:
1) owner(文件拥有人):用字母“u”代表;
2) group(文件拥有组):用字母“g”代表;
3) other(文件其他人):用字母“o”代表;
4) all(所有人):用字母“a”代表;


数字权限更改方式是使用4210代表“r”,“ w”,“x”,“-”(即“4”代表只读权限“r”,“2”代表写权限“w”,“1”代表执行权限“x”,“0” 代表没有权限),每种身份“ownergroupother”的“rwx”用数字设置的时候,只需要将每种身份的权限值累加即可,如“owner”的权限是“rwx”那么用数字表示即为“4+2+1=7”,其他权限依此类推即可;针对权限的操作同样也有以下几种表示方式,如下所示:
加号+”: 在现有的权限上增加权限;
减号-”: 在现有的权限上去掉某个权限;
等号=”: 忽略现有的权限, 重设文件的权限;

 

权限更改命令使用方式如下所示:

command

who

operater

permission

files/Direcotry

symbolic

digit

chmod

u

g

o

a

+

-

=

r

w

x

-

4

2

1

0

文件或目录

 

1:用字符表示方式将file1.txt文件添加执行权限

[root@server ~]# chmod u+x /root/file1.txt

[root@server ~]# ls -l /root/file1.txt

-rwxr--r--. 1 user2 user2 0 Mar 15 00:43 /root/file1.txt

 

2:用字符表示方式将file1.txt文件去掉组与其他人的可读权限

[root@server ~]# chmod g-r,o-r /root/file1.txt

[root@server ~]# ls -l /root/file1.txt

-rwx------. 1 user2 user2 0 Mar 15 00:43 /root/file1.txt

 

3:用字符表示方式将file1.txt文件权限重新设置为所有成员具有完控制权限

[root@server ~]# chmod a=rwx /root/file1.txt

[root@server ~]# ls -l /root/file1.txt

-rwxrwxrwx. 1 user2 user2 0 Mar 15 00:43 /root/file1.txt

 

4:用数字表示方式将file1.txt文件的写权限取消

[root@server ~]# chmod 555 /root/file1.txt

[root@server ~]# ls -l /root/file1.txt

-r-xr-xr-x. 1 user2 user2 0 Mar 15 00:43 /root/file1.txt

 

5:/tmp/etc目录内所有的文件和目录的权限设置为所有用户只读

[root@server ~]# chmod -R 444 /tmp/etc/

[root@server ~]# ls -l /tmp/etc/passwd

-r--r--r--. 1 user2 root 1104 Mar 15 01:06 /tmp/etc/passwd

 

4.系统默认权限:umask

在了解了Linux系统的安全模型与文件的权限管理知识以后,读者是否存在这样一个疑问?为什么我使用管理员用户帐号在系统中创建的目录权限是755,创建的文件权限都是644;而使用普通用户帐号创建的目录权限却又是775,文件的权限是664呢?
普通用户与管理员用户在系统中创建的文件与目录之所以会存在不同的权限,是由操作系统的默认权限控制的。在 Linux操作系统中,目录权限在设计之初就为每个新建的目录暂定的权限为777,这就意味着在系统中的任何用户对新建的目录都有完全控制权限。如,可以在这些新创建的目录中创建文件、修改、移动、甚至删除文件;同时,针对新建的文件,系统所定义的初始权限是666,这种初始权限非可怕。从前面的知识点中我们了解到,如果某个用户对一个文件具有写权限,表示该用户对这个文件具有修改文件名、修改文件内容、删除文件内容、甚至删除文件的权限(系统中所有新建的文件,默认是强制取消执行权限的,并且可执行文件的属性不是由文件的附件名称规定,而是由文件的可执行权限控制。如果一个纯文本文件中包含一些危害系统安全的命令存在,当用户运行这类文件时,就可能就会产生破坏系统的可能性。如果一个应用程序不具备执行的能力,就算是一个已经封装好的应用程序,在Linux系统中同样是不能被执行的)。为了规避目录与文件在创建之初的初始权限太大而造成的安全问题,Linux系统采用了umask默认权限覆盖机制来消除目录与文件的初始权限在组成员和其他人权限上的不安全设置,用来保护文件系统的安全性。
用户可以使用umask命令查看系统定义的umask值。在红帽的Linux发行版中,管理员的umask值是022;普通用户的umask值是002。如果用户需要调整,可以使用"umask [-p] [-S][mode]"命令重新设置。

同时,每个新创建的文件默认是禁止分配执行权限的,不论当前的umask值是多少。文件的执行权限需要用户使用chmod命令设置,而对于新建的目录,系统会结合用户身份为目录分配一个可执行权限,目的为了用户能够正常使用该目录。下面我们用几个实例来检验系统umask的默认权限覆盖机制。

 

1:使用umask命令查看管理员的umask值,并分析目录与文件经过权限覆盖机制处理之后的权限

[root@server ~]# umask

0022

[root@server ~]# mkdir root-dir

[root@server ~]# touch root.txt

[root@server ~]# ll

total 0

drwxr-xr-x. 2 root root 6 Mar 15 02:06 root-dir

-rw-r--r--. 1 root root 0 Mar 15 02:06 root.txt

在上例中的root-dir目录初始目录权限是777,系统结合管理员的umask值022对目录权限进行处理,将root-dir目录的组和其他人权限去掉w的权限位,最终root-dir目录的权限为755;root.txt文件的初始权限是666,系统结合管理员的umask值,去掉文件的组和其他人的w权限,因此,最终得到root.txt文件的权限就是644。

 

2:分析普通用户user2umask值,理解普通用户创建的文件与目录最终权限

[root@server ~]# su - user2

[user2@server ~]$ umask

0002

[user2@server ~]$ mkdir user2-dir

[user2@server ~]$ touch user2.txt

[user2@server ~]$ ll

total 0

drwxrwxr-x. 2 user2 user2 6 Mar 15 02:09 user2-dir

-rw-rw-r--. 1 user2 user2 0 Mar 15 02:10 user2.txt

在上例中的user3-dir目录初始目录权限是777,系统结合普通用户的umask值002对目录权限进行处理,将user3-dir目录的组和其他人权限去掉w的权限位,最终user3-dir目录的权限为775;user3.txt文件的初始权限是666,系统结合普通用户的umask值,去掉文件的组和其他人的w权限,最终user3.txt文件的权限就是664。

为什么系统针对管理员和普通用户的分别使用不同的umask值呢?这种设计的目的为了方便普通用户的权限管理。

那么umask到底是如何工作的呢,针对管理员与普通用户,编者分别用不同的工作原理图为读者进行讲解,如下示例与图解所示:

 

3:管理员的目录最终权限计算原理如下图所示,下图中用反斜线标的部份代表权限被去掉的过程

 

 

4:管理员的文件最终权限计算原理如下图所示,下图中用反斜线标注的部分代表权限被去掉的过程

 

 

5:普通用户的目录最终权限计算原理如下图所示,下图中用反斜线标注的部分代表权限被去掉的过程

 

 

6:普通用户的文件最终权限计算原理如下图所示,下图中用反斜线标注的部分代表权限被去掉的过程

 

 

读者在计算umask值的方法中,切记不要使用很多辅导材料上说的方法,用文件与目录的初始权限减去umask值所得出的结果。虽然大部份情况是可行的,但是当umask值为033的时候,这种计算机制就会出错。所以,读者需要了解umask的工作原理,而不是错误的指导原则(如果umask值是033,用户可以参考上述实例自行计算结果,编者在此不再复述)。 

 

5.3 特殊权限

在标准的Linux文件系统安全模型中,权限分为“读”、“写” 、“执行”及没有任何权限这四种,分别用“r”、“w”、“x”、“-”表示。这四种权限控制着整个Linux文件系统的安全性。
基于这些权限我们不难理解,如果一个用户对某个文件具有“读”的权限,她就可以查看这个文件的内容;如果对一个二进制可执行文件(程序或命令等)具有“执行”权限也就代表这个用户执行这个文件或文件内的可执行元素等。在这种权限设计上我们很容易管理与规划用户与文件系统的安全性,但是在Linux操作系统很多程序或文件是禁止普通用户查看的。举例来说,一个用户如果需要修改用户自己的密码,只需执行passwd命令重设密码之后,操作系统理所当然地就会把该用户设置的新密码信息写入/etc /shadow文件。细心的读者可能会留意到/etc/shadow文件的特殊性,因为它的权限是“-r--------”,这种权限意味着只有管理员才能读取该文件件的内容,普通用户是没有权限查看该文件的,更不用说修改这个文件的内容了!为什么普通用户可以修改密并更新密码呢?其实这是“/usr/bin/passwd”这个命令“作怪”,因为这个命令上设置有特殊权限。
什么是特殊权限呢?特殊权限也叫附加权限是附加在用户、组、其他人基本权限之上的权限,这种权限必须以基本权限为基础进行设置,因此叫特殊权限(附加权限)。
特殊权限有三种,分别是基于用户SUID权限,基于组的SGID权限以及基于其他人的STICKY权限。这三种附加权限分别体现在这三种身份的可执行权限位“x”上,执行权限为依据进行扩展,因“x”位而生,也因“x”位的消失而显示出不同的信息。
针对Linux操作系统中的特殊权限(附加权限)的特殊功能,编者将其如下表,以帮助读者加深理解,如下表所示;

特殊权限

表现方式

功能

SUID

-rwsr-xr-x

-rwSr-xr-x

SUID权限对文件有效,其权限应用在用户权限的"x"位上,表现为"s""S"(文件对用户没有开放执行权限)

SUID仅针对二进制可执行程序有效,用户拥有该程序的可执行权限;SUID功能仅在程序运行时发生特殊作用,不论哪个用户运行设置有SUID权限的应用程序时(该用户必须允许执行这个程序),执行该程序的用户身份会更换成文件的拥有人(owner)身份;

SGID

-rwxr-sr-x

-rwxr-Sr-x

SGID对文件与目录有效,其权限应用在组权限的"x"位上,表现为"s""S"(目录对组用户没有执行权限);

SGID对二进制可执行程序有用,程序的执行者必须具有执行权限,当用户在运行具有SGID权限的程序时,会以该程序的组成员身份执行;

如果该目录对组开放有写权限,那么用户在这个目录下创建文件的有效组将与目录的有效组相同;

STICKY

-rwxr-xr-t

-rwxr-xr-T

STICKY仅对目录有效,其权限应用在该目录的其他人权限的"x"位上,表现为"t""T"(目录对其他人没有执行权限);

如果一个目录设置有STICKY权限,这个目录内的所有文件仅有管理员和文件拥有者才有权限删除,包括文件的移动、改名等操作

 

 

特殊权限的设置方式分成两种,一种是字符方式另一种是数字方式,具体设置方式如下表所示:

command

who

operater

permission

files/directory

symbolic

digit

chmod

u

g

o

+

-

s

s

t

4

2

1

文件或目录

 

在使用数字的方式设置特殊权限的时候读者需要注意,由于用户、组与其他人分别使用一个数字位表示,已经占用了三组字数位,那么数字特殊权限设置位在哪里呢?相信读者应该还记得设置系统默认权限(umask)的命令吧!在使用umask命令查看用户的默认权限时一共显示有四个数字位,第一个数字位就是系统用来设置特殊权限的,后面的三位数据分别代表用户、组及其他人数字权限设置位,如下所示:

[root@server ~]# umask

0022

特殊权限的数字设置方式与用户、组、其他人的设置方式相同。SUID权限用数字4表示;SGID权限用数字2表示;STICKY权限用数字1表示,读者只需将特殊权限值进行累加就可以了。

例如为一个目录分配所有权限包括特殊权限位的数字设置方式为:用户的全部权限4+2+1=7;组的所有权限4+2+1=7;其他人的所有权4+2+1=7;特殊权限为(SUID+SGID+STICKY4+2+1=7;所有权限值划分好之后,用户只需要执行“chmod 7777目录”就可以设置完成了。

 

1:检验/usr/bin/passwd文件的特殊权限,并验证特殊权限的应用过程:

[root@server ~]# ls -l /usr/bin/passwd

-rwsr-xr-x. 1 root root 27832 Jan 30  2014 /usr/bin/passwd

[root@server ~]# useradd user1

[root@server ~]# passwd user1

Changing password for user user1.

New password:

BAD PASSWORD: The password is shorter than 8 characters

Retype new password:

passwd: all authentication tokens updated successfully.

为用户user1设置密码之后,使用"su - user1"命令切换用户为user1,以检验SUID命令的工作过程:

[root@server ~]# su - user1

[user1@server ~]$ passwd

Changing password for user user1.

Changing password for user1.

(current) UNIX password:

用户user1执行密码重设passwd之后,无需设置密码,目的是为了验证设置有SUID权限的passwd命令真正的用户身份,接下来读者需要打开另一个终端,运行"ps aux |grep -i passwd"命令检查使用passwd命令的真正用户身份,如下所示:

[root@server ~]# ps aux |grep -i passwd

root       2788  0.0  0.1 168820  2004 pts/0    S+   02:03   0:00 passwd

root       2813  0.0  0.0 112644   972 pts/1    S+   02:06   0:00 grep --color=auto -i passwd

通过上面的命令过滤出来的结果显示真正执行passwd命令的用户是"root",而非"user1"

 

2:取消"/usr/bin/passwd"命令的SUID权限,验证用户user1是否可以重设密码

[root@server ~]# chmod u-s /usr/bin/passwd

[root@server ~]# ls -l /usr/bin/passwd

-rwxr-xr-x. 1 root root 27832 Jan 30  2014 /usr/bin/passwd

[root@server ~]# su - user1

-rwxr-xr-x. 1 root root 27832 Jan 30  2014 /usr/bin/passwd

[user1@server ~]$ passwd

Changing password for user user1.

Changing password for user1.

(current) UNIX password:

New password:

Retype new password:

passwd: Authentication token manipulation error

如上所示,虽然用户user1可以执行passwd命令,由于user1没有权限修改/etc/shadow文件的内容,因此系统提示授权维护操作失败。

[root@server ~]# ps aux |grep -i passwd

user1      2883  0.0  0.1 168820  1960 pts/1    S+   02:18   0:00 passwd

root       2888  0.0  0.0 112644   976 pts/0    R+   02:18   0:00 grep --color=auto -i passwd

最后再来检验真正执行命令的用户身份,如上所示。此时在执行passwd命令的用户就是user1,读者记得验证完成之后将/usr/bin/passwd命令的SUID权限还原回去,以免系统中所有的普通用户都无法修改密码了^_^!

4:在当前主机的目录树结构中创建一个目录为/dir,添加一个组,组名为sgid。设置/dir目录有效组为sgid,之后添加两个用户帐号分别为user2user3,并授权user2user3可以在/dir目录新建文件以便测试/dir目录上的SGID权限是否生效,如下所示:

[root@server ~]# mkdir /dir

[root@server ~]# chmod 777 /dir

[root@server ~]# ls -ld /dir

drwxrwxrwx. 2 root root 6 Mar 16 02:21 /dir

[root@server ~]# groupadd sgid

[root@server ~]# chgrp sgid /dir

[root@server ~]# chmod g+s /dir

[root@server ~]# useradd user2

[root@server ~]# useradd user3

[root@server ~]# useradd user4

 

[root@server ~]# su - user2

Last login: Wed Mar 15 02:09:30 CST 2017 on pts/0

[user2@server ~]$ touch /dir/user2

[user2@server ~]$ ll /dir/user2

-rw-rw-r--. 1 user2 sgid 0 Mar 16 02:25 /dir/user2

 

[root@server ~]# su - user3

[user3@server ~]$ touch /dir/user3

[user3@server ~]$ ll /dir/user3

-rw-rw-r--. 1 user3 sgid 0 Mar 16 02:27 /dir/user3

 

5:为/dir目录设置STICKY权限,控制目录内的文件仅允许root和文件拥有者才能删除或修改相应的文件

[root@server ~]# chmod o+t /dir

[root@server ~]# ls -ld /dir

drwxrwsrwt. 2 root sgid 30 Mar 16 02:27 /dir

[root@server ~]# su - user2

Last login: Thu Mar 16 02:36:57 CST 2017 on pts/0

[user2@server ~]$ rm -f /dir/user2

[user2@server ~]$ rm -f /dir/user3

rm: cannot remove /dir/user3: Operation not permitted

 

5.4 练习

1)新建目录:/dir

2)新建用户:user2user3

3)新建组:group1

4)更改/dir目录的组为group1,并且以后在此目录创建的文件或目录都自动继承组身份

5)用户user2user3分别在/dir目录下创建文件,但各自只能删除自己创建的文件