RH214|第七章 控制文件访问权限

介绍linux文件系统权限

目标

完成本节后,你能够列出文件和目录的文件系统权限,并解释这些权限对用户和组访问的影响。

linux文件系统权限

文件的权限控制着对文件的访问。Linux的文件权限系统简单而灵活,使其易于理解和应用,但仍能轻松处理大多数正常的权限情况。

文件有三类用户的权限。该文件由一个用户拥有,通常是创建该文件的用户。文件也是由一个组拥有,通常是创建文件的用户的主组,但这是可以改变的。可以为拥有者用户、拥有者组以及系统上所有其他非该用户或拥有者组成员的用户设置不同的权限。

最具体的权限优先。用户权限优先于组权限,组权限优先于其他权限。

在图7.1中,joshua是组joshua和web的成员,allison是allison、wheel、web组的成员。当joshua和allison需要协作时,文件应该与组web关联,并且组权限应该允许所需的访问。

Figure 7.1: Example group membership to facilitate collaboration

三类权限适用:读、写和执行。下表解释了这些权限如何影响对文件和目录的访问。

权限对文件和目录的影响

权限 对文件的影响 对目录的影响
r (读) 可以读取文件的内容。 可以列出目录的内容(文件名)。
w (写) 文件的内容是可以更改的。 目录中的任何文件都可以被创建或删除。
x (执行) 文件可以作为命令执行。 可以访问目录中的内容。(如果文件的权限允许的话,可以切换到目录中,读取目录中的文件信息,访问目录中的文件)。

注意,用户通常对只读目录有读权限和执行权限,这样就可以列出目录,并对目录内容有完全的只读权限。如果用户只对一个目录有只读权限,则可以列出目录中的文件名,但不能列出其他信息,包括权限或时间戳等,也不能访问这些文件。如果用户只对目录有执行访问权限,则不能列出目录中的文件名,但如果用户已经知道有权限读取的文件名,则可以通过明确指定文件名来访问该文件的内容。

注意,用户通常对只读目录有读权限和执行权限,这样就可以列出目录,并对目录内容有完全的只读权限。如果用户只对一个目录有只读权限,则可以列出目录中的文件名,但不能列出其他信息,包括权限或时间戳等,也不能访问这些文件。如果用户只对目录有执行访问权限,则不能列出目录中的文件名,但如果用户已经知道有权限读取的文件名,则可以通过明确指定文件名来访问该文件的内容。

一个文件可以被任何拥有文件所在目录的写权限的人删除,而不管文件本身的所有权或权限如何。这可以用一个特殊的权限,即粘滞位来覆盖,在本章后面讨论。

Linux文件权限的工作方式与微软Windows的NTFS文件系统所使用的权限系统不同。

在Linux上,权限只适用于被设置的文件或目录。也就是说,目录上的权限不会被目录内的子目录和文件自动继承。但是,目录上的权限可以阻止对目录内容的访问,这取决于权限的限制程度

Linux中对目录的读取权限大致相当于Windows中的List文件夹内容。

Linux中的目录写权限相当于Windows中的Modify,它意味着删除文件和子目录的能力。在Linux中,如果写权限和粘滞位都被设置在一个目录上,那么只有拥有该目录中的文件或子目录的用户才可以删除它,这与Windows中的写权限的行为很接近。

Linux上的root用户对所有文件拥有相当于Windows的完全控制权限。但是,root用户仍然可能会受到系统的SELinux策略和相关进程和文件的安全上下文的限制。SELinux将在后面的课程中讨论。

查看文件和目录的权限和所有权

ls命令的-l选项可以显示关于文件权限和所有权的详细信息。

[user@host~]$ ls -l test
-rw-rw-r--. 1 student student 0 Feb  8 17:36 test

你可以使用 -d 选项来显示一个目录本身的详细信息,而不是目录的内容。

[user@host ~]$ ls -ld /home
drwxr-xr-x. 5 root root 4096 Jan 31 22:00 /home

长列表的第一个字符是文件类型。你可以这样解释:

  • -是一个普通文件。
  • d是一个目录。
  • l是个软链接。
  • 其他字符代表硬件设备(bc)或其他特殊用途文件(ps)。

接下来的9个字符是文件的权限。这些是三组三个字符:适用于拥有该文件的用户、拥有该文件的组和所有其他用户的权限。如果该组显示为 rwx,则表示该类别拥有所有三个权限,即读、写和执行。如果一个字母被替换为-,那么这个类别就没有这个权限。

在链接计数后,第一个名字指定了拥有该文件的用户,第二个名字指定了拥有该文件的组。

所以上面的例子中,学生用户的权限是由第一组三个字符指定的。student用户在测试时有读写权限,但不能执行。

student组是由第二组三个字符指定的:它在测试时也有读写,但不能执行。

任何其他用户的权限都是由第三组三个字符指定的:他们只有在测试时才有读取权限。

最具体的一组权限适用。因此,如果student用户的权限与student组内不同,而student用户也是该组的成员,那么用户的权限就是适用的权限。

权限效果示例

下面的例子将帮助说明文件权限如何交互。在这些例子中,我们有四个用户,其组成员如下:

用户
operator1 operator1, consultant1
database1 database1, consultant1
database2 database2, operator2
contractor1 contractor1, operator2

这些用户将在dir目录下工作的文件。这是一个目录中的文件列表:

[database1@host dir]$ ls -la 
total 24 
drwxrwxr-x.  2 database1 consultant1   4096 Apr  4 10:23 . 
drwxr-xr-x. 10 root      root          4096 Apr  1 17:34 .. 
-rw-rw-r--.  1 operator1 operator1     1024 Apr  4 11:02 lfile1
-rw-r--rw-.  1 operator1 consultant1   3144 Apr  4 11:02 lfile2
-rw-rw-r--.  1 database1 consultant1  10234 Apr  4 10:14 rfile1
-rw-r-----.  1 database1 consultant1   2048 Apr  4 10:18 rfile2

选项 -a 显示了隐藏文件的权限,包括用来表示目录及其父目录的特殊文件。在这个例子中,.反映的是dir本身的权限,而..则是其父目录的权限。

rfile1的权限是什么?拥有该文件的用户(database1))有读写权限,但不能执行。拥有该文件的组(consultant1)有读写权限,但不能执行。所有其他用户都有读,但没有写,也没有执行。

下表探讨了这组权限对这些用户的一些影响:

效果 原因
operator1可以改变rfile1的内容。 operator1是consultant1组的成员,该组对rfile1有读写权限。
database1用户可以查看和修改rfile2中的内容。 database1用户拥有该文件,并对rfile2有读写权限。
operator1用户可以查看但不能修改rfile2的内容(不删除它并重新创建它)。 operator1用户是contractor1组的成员,该组只对rfile2有读取权限。
database2用户和contractor1无法访问rfile2的内容。 其他权限适用于用户 database2 和 contractor1,而这些权限不包括读或写权限。
operator1是唯一可以更改lfile1的内容的用户(不删除它并重新创建它)。 用户和组operator1对文件有写权限,其他用户没有。但组操作者1的成员只有用户操作者1。
用户database2可以改变lfile2的内容。 用户database2不是拥有该文件的用户,也不在组consultant1中,所以其他权限适用。这些权限赋予了写权限。
用户database1可以查看lfile2的内容,但不能修改lfile2的内容(不删除它并重新创建)。 用户database1是组consultant1的成员,而该组只有lfile2的读取权限。即使其他用户有写权限,组的权限优先。
用户database1可以可以删除lfile1和lfile2。 用户database1可以对包含这两个文件的目录(用.表示)具有写权限,因此可以删除该目录中的任何文件。即使database1可以对文件本身没有写权限,也是如此。

从命令行管理文件系统权限

模板

完成本节内容后,你能够使用命令行工具更改文件的权限和所有权。

变更文件和目录权限

从命令行改变权限的命令是chmod,意思是 "改变模式"(权限也叫文件的模式)。chmod命令采取的是权限指令,后面是要更改的文件或目录列表。权限指令可以用符号方式(符号方式)或数字方式(数字方式)发出。

使用符号方法更改权限

chmod WhoWhatWhich file|directory
  • 谁是u、g、o、a(对于用户、组、其他、所有)
  • 什么是+,-,=(对于添加、删除、设置恰好是)
  • 其中r、w、x(用于读取、写入、执行)。

改变文件权限的符号化方法用字母来表示不同的权限组:u代表用户,g代表组,o代表其他,a代表所有。

使用符号方法,不需要设置一个完整的新权限组。相反,你可以改变一个或多个现有的权限。分别使用+-来添加或删除权限,或者使用=来替换一组权限的整个集合。

权限本身用一个字母表示:r代表读,w代表写,x代表执行。当使用 chmod 用符号方法改变权限时,只有在文件是目录或已经为用户、组或其他设置了执行权限的情况下,使用大写的 X 作为权限标志才会增加执行权限。

chmod命令支持-R选项,可以递归设置整个目录树中文件的权限。在使用 -R 选项时,使用 X 选项符号化地设置权限也很有用。这样可以在目录上设置执行权限,这样就可以在不改变大多数文件的权限的情况下访问它们的内容。但是,使用X选项要谨慎,因为如果一个文件有任何执行权限设置,X也会在该文件上设置指定的执行权限。例如,下面的命令递归设置了 demodir 和它的所有子文件的读写权限,但只对已经设置了用户、组或其他执行权限的目录和文件应用了组执行权限。

[root@host opt]# chmod -R g+rwX demodir

删除file1上的组和其他的读写权限。

[user@host ~]$ chmod go-rw file1

为file2上的每个人添加执行权限。

[user@host ~]$ chmod a+x file2

用数字法更改权限

在下面的例子中,#字符代表一个数字。

chmod ### file|directory

每个数字代表一个访问级别的权限:用户、组、其他。

这个数字的计算方法是将你要添加的每个权限的数字相加,4是读,2是写,1是执行。

使用数字方法,权限由3位数(或4位数,当设置高级权限时,由4位数)八进制数字表示。一个八位数可以代表0-7之间的任何一个值。

在权限的3位八位数(数字)表示中,每个数字代表一个访问级别,从左至右依次为:用户、组和其他。为了确定每个数字。

  1. 从0开始。
  2. 如果这个访问级别的读权限存在,请加上4。
  3. 如果写权限应该存在,请加上2。
  4. 4.如果应该有执行权限,则添加 1。

对于用户而言,rwx的计算方式为4+2+1=7。对于组,r-x计算为4+0+1=5,对于其他用户,---用0表示,把这三者放在一起,这些权限的数值表示为750。

这种计算方式也可以反过来进行。看一下权限640。对于用户权限,6代表读(4)和写(2),显示为rw-。对于组部分,4只包括读(4)和写(2),显示为r--。

有经验的管理员通常会使用数字权限,因为它们的键入和发音较短,同时还能完全控制所有权限。

示例

在samplefile上设置用户的读写权限,组和其他的读取权限。

[user@host ~]$ chmod 644 samplefile

在sampledir上设置用户的读取、写入和执行权限,组的读取和执行权限,以及其他的没有权限。

[user@host ~]$ chmod 750 sampledir

更改文件和目录用户或组的所有权

新创建的文件由创建该文件的用户拥有。默认情况下,新文件的组所有权是创建该文件的用户的主组。在 Red Hat Enterprise Linux 中,用户的主群组通常是一个只有该用户作为成员的私有群组。要根据组成员资格授予对文件的访问权,可能需要更改拥有该文件的组。

只有root可以改变拥有文件的用户,但是组的所有权可以由root或文件的所有者来设置。但是,组的所有权可以由root或文件的所有者来设置,root可以将文件的所有权授予任何组,但普通用户只有在他们是该组的成员时,才可以让一个组成为文件的所有者。

文件的所有权可以通过chown(改变所有者)命令来改变。例如,要将test_file文件的所有权授予学生用户,可以使用以下命令。

[root@host ~]# chown student test_file

chown可以和 -R 选项一起使用,递归改变整个目录树的所有权。下面的命令将test_dir和其中的所有文件和子目录的所有权授予学生。

[root@host ~]# chown -R student test_dir

chown命令也可以用来改变文件的组所有权,在组名前加上冒号(:)。例如,下面的命令将test_dir的组改为admins。

[root@host ~]# chown :admins test_dir

chown 命令也可以通过使用 owner:group 语法来同时更改所有者和组。例如,要将**test_dir&&的所有者改为访问者,组改为 visitor ,可以使用下面的命令。

[root@host ~]# chown visitor:guests test_dir

有些用户不使用 chown,而是使用 chgrp 命令来改变组的所有权。这个命令的工作原理和chown一样,只是它只用来改变组的所有权,而且组名前的冒号(:)是不需要的。

你可能会遇到一些chown命令的例子,这些命令使用了替代语法,用句号代替冒号分隔所有者和组:

[root@host ~]# chown owner.group filename

最好不使用这种语法。推荐使用冒号。

句号是用户名中的有效字符,但冒号不是。如果系统中存在用户 enoch.root、用户 enoch 和组 root,那么 chown enoch.root filename 的结果将文件所有者设置为 enoch.root 用户所拥有的文件名。而不是设置为用户 enoch 和组root。

设置用户和组时同时使用chown冒号语法,结果是确定的,不会发生混淆。

管理默认权限和文件访问

目标

完成本节内容后,你能够:

  • 控制用户创建的新文件的默认权限。
  • 了解特殊权限的作用。
  • 使用特殊权限和默认权限来设置在特定目录下创建的文件的组所有者

特殊权限

特殊权限是基本的用户、组和其他类型之外的第四种权限类型。顾名思义,这些权限提供了基本权限类型之外的额外的访问相关功能。本节将详细介绍特殊权限的影响,如下表所示。

特殊权限对文件和目录的影响

特殊权限 对文件的作用 对目录的作用
u+s (suid) 文件以拥有该文件的用户身份执行,而不是运行该文件的用户。 没有影响
g+s (sgid) 文件作为拥有该文件的组执行。 在目录中新创建的文件,其组所有者设置为与目录的组所有者相匹配。
o+t (sticky) 没有影响 对目录有写权限的用户只能删除自己拥有的文件,不能删除或强制保存到其他用户拥有的文件。

可执行文件上的setuid权限意味着命令以拥有文件的用户身份运行,而不是以运行命令的用户身份运行。一个例子是passwd命令:

[user@host ~]$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 35504 Jul 16  2010 /usr/bin/passwd

在一个长的列表中,你可以用一个小写的s来标识setuid权限,通常情况下,x(所有者的执行权限)会在这里。如果所有者没有执行权限,则用大写的S代替。

目录上的特殊权限setgid意味着在目录中创建的文件会从目录中继承其组的所有权,而不是从创建用户那里继承。这通常用在群组协作目录上,用于自动将文件从默认的私有组改成共享组,或者如果一个目录中的文件应该永远属于某个特定的组。这方面的一个例子是/run/log/journal目录:

[user@host ~]$ ls -ld /run/log/journal
drwxr-sr-x. 3 root systemd-journal 60 May 18 09:15 /run/log/journal

如果在一个可执行文件上设置了setgid,那么命令将以拥有该文件的组的身份运行,而不是以运行该命令的用户的身份运行,其工作方式与setuid类似。locate命令就是一个例子:

[user@host ~]$ ls -ld /usr/bin/locate
-rwx--s--x. 1 root slocate 47128 Aug 12 17:17 /usr/bin/locate

在一个长的列表中,你可以用小写的s来标识setgid权限,通常情况下,x(组执行权限)会在这里。如果该组没有执行权限,则用大写的S代替。

最后,对目录的粘性位设置了删除文件的特殊限制。只有文件的所有者和root才能删除目录内的文件。一个例子是/tmp

[user@host ~]$ ls -ld /tmp
drwxrwxrwt. 39 root root 4096 Feb  8 20:52 /tmp

在一个长的列表中,你可以用小写的t来识别粘性权限,在通常情况下,你会期望x(其他执行权限)在哪里。如果其他没有执行权限,则用大写的T代替。

设置特殊权限

  • 符号: setuid = u+s; setgid = g+s; sticky = o+t
  • 数字上(前四位数):setuid = 4; setgid = 2; sticky = 1

示例

在目录上增加setgid位:

[user@host ~]# chmod g+s directory

设置setgid位,在目录上增加用户和组的读/写/执行权限,没有访问对象的权限。

[user@host ~]# chmod 2770 directory

默认文件权限

当你创建一个新的文件或目录时,它被分配了初始权限。有两件事会影响这些初始权限。第一个是你是在创建一个普通文件还是目录。第二个是当前的umask。

如果你创建了一个新的目录,操作系统会在开始时给它分配八进制权限 0777 (drwxrwxrwxrwx)。如果你创建一个新的常规文件,操作系统会给它分配八进制权限0666 (-rw-rw-rw-rw-rw-rw-)。 你总是必须在普通文件中明确地添加执行权限。这使得攻击者更难攻陷网络服务,从而创建一个新文件并立即作为程序执行。

但是,shell会话也会设置一个umask来进一步限制初始设置的权限。这是一个八位掩码,用于清除进程创建的新文件和目录的权限。如果在umask中设置了一个位,那么相应的权限就会在新文件上被清除。例如,umask 0002清除其他用户的写位。前面的零表示特殊、用户和组的权限没有被清除。umask为0077可以清除新创建的文件的所有组和其他权限。

没有参数的 umask 命令将显示 shell 的 umask 的当前值。

[user@host ~]$ umask
0002

使用umask命令,用一个数字参数来改变当前shell的umask。数字参数应该是与新的 umask 值相对应的八进制值。您可以省略umask中的前导零。

系统对Bash shell用户的默认umask值定义在/etc/profile/ etc/bashrc文件中。用户可以在其主目录中的.bash_profile.bashrc文件中覆盖系统的默认值。

umask示例

下面的例子解释了umask是如何影响文件和目录的权限的。看一下当前shell中文件和目录的默认umask权限。文件的所有者和组都拥有文件的读写权限,其他的权限被设置为读。拥有者和组在目录上都有读取、写入和执行权限。其他的唯一权限是读。

[user@host ~]$ umask
0002
[user@host ~]$ touch default
[user@host ~]$ ls -l default.txt
-rw-rw-r--. 1 user user 0 May  9 01:54 default.txt
[user@host ~]$ mkdir default 
[user@host ~]$ ls -ld default 
drwxrwxr-x. 2 user user 0 May  9 01:54 default 

通过将umask值设置为0,其他的文件权限从读取变为读取和写入。其他的目录权限由读和执行变为读、写和执行。

[user@host ~]$ umask 0
[user@host ~]$ touch zero.txt
[user@host ~]$ ls -l zero.txt
-rw-rw-rw-. 1 user user 0 May  9 01:54 zero.txt
[user@host ~]$ mkdir zero 
[user@host ~]$ ls -ld zero 
drwxrwxrwx. 2 user user 0 May  9 01:54 zero 

要屏蔽其他的所有文件和目录权限,请将umask值设置为007:

[user@host ~]$ umask 007
[user@host ~]$ touch seven.txt
[user@host ~]$ ls -l seven.txt
-rw-rw----. 1 user user 0 May  9 01:55 seven.txt
[user@host ~]$ mkdir seven 
[user@host ~]$ ls -ld seven 
drwxrwx---. 2 user user 0 May  9 01:54 seven

umask 027确保新文件有用户的读写权限和组的读取权限。新的目录对组有读写权限,对其他目录没有权限。

[user@host ~]$ umask 027
[user@host ~]$ touch two-seven.txt
[user@host ~]$ ls -l two-seven.txt
-rw-r-----. 1 user user 0 May  9 01:55 two-seven.txt
[user@host ~]$ mkdir two-seven [user@host ~]$ ls -ld two-seven drwxr-x---. 2 user user 0 May  9 01:54 two-seven 

用户的默认umask是由shell启动脚本设置的。默认情况下,如果您的帐户的UID为200或更多,并且您的用户名和主群组名称相同,您将被分配给一个002的umask。否则,你的 umask 将为 022。

作为root,你可以通过添加一个名为/etc/profile.d/localumask.sh的shell启动脚本来改变这一点,这个脚本看起来像这个例子中的输出。

[root@host ~]# cat /etc/profile.d/local-umask.sh 
# Overrides default umask configuration 
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
        umask 007 
    else     
        umask 022 
fi

前面的例子将为UID大于199且用户名和主群组名匹配的用户设置为007,其他的用户设置为022。如果你只想将每个人的umask设置为022,那么你可以用下面的内容来创建这个文件。

# Overrides default umask configuration 
umask 022

为了确保全局umask的更改生效,你必须退出shell并重新登录。在这之前,当前shell中配置的umask仍然有效。

总结

  • 文件有三类权限适用。一个文件由一个用户、单个组和其他用户拥有。用户权限优先于组权限,组权限优先于其他权限。
  • 带 -l 选项的 ls 命令扩展了文件列表,以包括文件权限和所有权。
  • chmod命令可以从命令行改变文件的权限。有两种方法来表示权限,符号(字母)和数字(数字)。
  • chown命令可以改变文件的所有权。-R选项递归改变目录树的所有权。
  • 没有参数的umask命令显示当前shell的umask值。系统中的每个进程都有一个umask。Bash的默认umask值在/etc/profile/etc/bashrc文件中定义。

你可能感兴趣的:(RH214|第七章 控制文件访问权限)