认证目标4.01 文件的基本权限
Linux计算机的基本安全是以文件权限为基础的。文件默认的权限可以通过umask命令来设置。通过配置特殊权限,可以给全部用户和/或组配置额外的权限。这些就是所谓的超级用户ID(SUID)、超级组ID(SGID)和粘滞权限位。所有权是是以文件创建者的默认用户ID和组ID为基础的。用chmod、chown和chgrp等命令管理权限和所有权。讨论这些命令之前,必须先理解文件权限和所有权等概念。
4.1.1 文件权限和所有权
Linux文件权限和所有权不难理解。正如相关的RHCSA认证目标所要求的那样,它们就是用户、组和所有其他用户的读、写和执行权限。但是,权限在目录上的效果更隐蔽。表4-1显示了每个权限位的精确含义。
表4-1 文件和目录上的权限
考虑ls -l /sbin/fdisk命令的输出结果:
-rwxr-xr-x. 1 root root 182424 Mar 28 2014 /sbin/fdisk
权限显示在列表的左端,用10个字符来表示。第一个字符决定了它是一个普通文件还是一个特殊文件。其他9个字符分为3组,分别表示文件所有者(user)、组所有者和Linux系统中所有其他用户的权限。以下这些字母也是很容易理解的:r(read)表示读权限、w(write)表示写入权限、x(execute)表示可执行权限。这些权限在表4-2中有详细说明。
表4-2 文件权限说明
我们经常见到,文件的用户(即所有者)与文件的组所有者使用相同的名字。此时root用户是root组的一个成员。但它们并不一定要用相同的名字。例如,专为用户之间的协作而设计的目录可能属于某个特殊组。正如第8章将要指出的,这样的组通常有几个普通用户作为其成员。
记住,授予组的权限要优先于授予所有其他用户的权限。类似地,授予所有者的权限要优先于所有其他权限分类的权限。因此,在下面的例子中,虽然其他每个人都有文件的完整权限,但是组mike的成员未被授予任何权限,因此无法读取、修改或执行文件:
$ ls -l setup.sh -rwx---rwx. 1 root mike 127 Dec 13 07:21 setup.sh
权限中还有一个较新的元素。注意一下ls -l setup.sh命令输出中最后的x后面还有一个点,这个点表明该文件具有SELinux安全上下文。如果在一个文件上配置了ACL权限,就会用加号(+)替代这个点。但该符号不会覆盖SELinux控制。
我们需要考虑另一类权限:特殊权限位。它们不仅是指SUID和SGID位,而且也包括粘滞位(sticky bit)这个特殊权限。表4-3显示了特殊权限位在文件和目录上的效果。
表4-3 特殊权限位
SUID位的一个示例与/usr/bin目录中的passwd命令有关。把ls -l命令应用于此文件得到如下的输出结果:
-rwsr-xr-x. 1 root root 27832 Jan 302014 /usr/bin/passwd
此文件的用户所有者的执行位为s,它就是SUID位。这意味着经文件所有者、root管理员用户授权,其他用户可以执行此文件。但是这并不表示任何用户可以改变其他用户的口令。对passwd命令的访问还受到可插入验证模块(Pluggable Authentication Modules, PAM)的控制。有关可插入验证模块的内容请阅读第10章的内容,它属于RHCE考试范围。SGID位的一个示例可在ssh-agent命令中找到,也可在/usr/bin目录中找到。它有一个SGID位,用来正确保存口令短语(passphrases)。把ls -l命令作用于此文件得到以下的输出结果:
---x--s--x. 1 root nobody 145312 Mar 19 2014 /usr/bin/ssh-agent
此文件的组所有者(group nobody)的执行位为s,它就是SGID位。
最后,粘滞位的示例可以在/tmp目录的权限中找到。它表示用户可以把自己的文件复制到此目录中,但是除了文件的所有者之外,其他人都不可以删除这些文件(因此才称为“粘滞”)。把ls -ld命令作用此目录得到以下结果:
drwxrwxrwt. 22 root root 4096 Dec 15 17:15 /tmp
其他用户的可执行位现在是t,它就是粘滞位。注意,如果没有粘滞位,每个人都能删除/tmp目录中其他每个人的文件,因为写入权限已被授予该目录上的所有用户。
写入权限的漏洞
很容易去掉一个文件的写权限。例如,假如我们想使license.txt文件只有可读权限,则执行下面的命令就可以去掉这个文件的写入权限:
$ chmod a-w license.txt
但是,此文件的所有者仍然可以修改此文件。然而这对于像gedit这样的GUI文本编辑器不起作用,甚至对nano文件编辑器也不起作用。但如果在vi文本编辑中对此文件做修改,此文件的所有者用感叹号会迂回处理缺少写权限的情形。换言之,在vi编辑器中,文件的所有者可以用下面的命令来覆盖缺少的写权限。
w!
实际上,vi编辑器的w!权限并不是绕过Linux的文件权限系统,这可能会让人感到惊讶。w!命令覆盖文件,也就是说,该命令删除现有的文件,并创建一个同名的新文件。从表4-1中可以看到,授予文件的创建和删除权限的权限位是父目录上的写入权限,而不是文件本身的写入权限。因此,如果用户拥有目录的写入权限,就可以覆盖目录中的文件,不管是否对文件设置了写入权限位。
4.1.2 修改权限和所有权的命令
管理文件权限和所有权的主要命令有chmod、chown和chgrp。接下来我们将介绍如何用这些命令修改文件的用户和组的权限,以及如何同时修改一系列文件的权限和所有权。
用-R选项可以修改一系列文件的权限。它是这三个命令的一个递归开关选项。换言之,当我们把上述三个命令之一和选项-R作用于某个目录中,则命令递归地作用于此目录中。这个改变将作用于目录中的所有文件,包括所有的子目录。递归意味着修改可以应用于目录中的每个子目录的所有文件。
1. chmod命令
chmod命令使用所有者用户、组和其他用户的权限的数值。在Linux中,读、写入和可执行权限分别赋给以下数值:r=4, w=2, x=1。数字格式的权限表示为八进制数,每一个数位关联着不同的一组权限。例如,权限数字640表示所有者被赋予权限6(读和写),其中组的权限为4(读),其他每个人都没有权限。chown和chgrp命令调整与该文件关联的用户和组所有者。
chmod命令十分灵活。可以不用数字表示权限。例如,下面的命令给Ch3Lab1文件的所有者用户设置了可执行权限:
# chmod u+x Ch3Lab1
注意,u和x遵循ugo/rwx格式的方式是RHCSA考试的认证目标。这个命令的作用是给Ch3Lab1文件的所有者用户(u)添加(+)了执行权限(x)。
这些符号可以组合使用。例如,下面这个命令(使用-)取消了名为special的本地文件的组所有者(使用g)和和所有其他用户(使用o)的写权限(使用w):
# chmod go-w special
除了使用+和-操作符添加或删除权限以外,可以使用等号操作符(=)设置某权限组的精确模式。例如,下面的命令将special文件的组权限设为读写,如果设置了执行权限,还会清除执行权限:
# chmod g=rw special
虽然在chmod命令中我们可以使用全部三种组权限类型,但是其实没有此必要。正如第3章的实验题介绍的,下面的命令给所有用户分配Ch3Lab2文件的执行权限。
# chmod +x Ch3Lab2
对于SUID、SGID和粘滞位,还可使用一些特殊选项。如果我们选择使用数值位,这些特殊位也被赋予相应的数值,即SUID =4、SGID=2和粘滞位=1。例如,下面的命令配置了SUID位(权限模式中的第一个“4”)。它把名为testfile文件的rwx权限赋给了所有者用户(“7”),把rw权限赋给了组所有者(“6”),以及把r权限赋给其他用户(最后一个“4”)。
# chmod 4764 testfile
如果更喜欢使用ugo/rwx格式,则下面的命令激活了本地testscript文件的SGID位:
# chmod g+s testscript
下面这个命令打开/test目录的粘滞位。
# chmod o+t /test
对于chmod命令,修改并非必须由root管理员用户做出。文件的所有者用户也可以修改该文件的权限。
2. chown命令
chown命令可以用来修改文件的所有者用户。例如,利用ls -l命令分析本章开头创建的图像文件的所有权:
-rw-r--r--. 1 michael examprep 855502 Oct 25 14:07 F04-01.tif
此文件的所有者用户是michael,其组所有者是examprep。用chown命令可以把它的所有者用户改为elizabeth:
# chown elizabeth F04-01.tif
chown命令的作用不止这些。例如,下面的命令将上述文件的用户所有者和组所有者修改为donna用户和supervisors组,这里假定这个用户和组都存在:
# chown donna.supervisors F04-01.tif
只有root管理员用户可以修改文件的用户所有者,组所有权则可被root管理员用户和拥有文件的用户修改。
3. chgrp命令
用chgrp命令可以改变文件的组所有者。例如,下面的命令把F04-01.tif文件的组所有者改为名为project的组(假设这个组是存在的)
# chgrp project F04-01.tif
4.特殊文件属性
除了普通的rwx/ugo权限之外还有文件属性。这些属性可以用来控制用户对不同文件的权限。用lsattr命令可以显示当前文件的属性,而用chattr命令可以帮助修改这些属性。例如,下面的命令可以防止/etc/fstab文件被意外删除,即使root管理员用户也无法删除此文件:
# chattr +i /etc/fstab
有了这个属性后,当我们以root管理员用户的身份删除上述文件时就会看到以下响应:
# rm /etc/fstab rm: remove regular file '/etc/fstab'? y rm: cannot remove '/etc/fstab': Operation not permitted
lsattr命令显示了/etc/fstab文件上活动的不可修改属性:
# lsattr /etc/fstab ----i----------- /etc/fstab
当然,root管理员可以用下面的命令取消这个属性。尽管如此,最初的拒绝删除响应至少可以在删除操作真正发生之前给管理员思考的余地:
# chattr -i /etc/fstab
表4-4列出几个重要的属性。其他属性如c(compressed,压缩)、s(secure deletion,安全删除)和u(undeletable,不可删除)对保存在ext4和XFS文件系统中的文件不起作用。区段格式属性与ext4系统有关。
表4-4 文件属性
4.1.3 用户与组的基本概念
与Unix一样,Linux也配置了用户和组。任何使用Linux的用户都分配了一个用户名,虽然他可能只是一个“游客”(guest)。甚至还有一个名为nobody的标准用户。分析/etc/passwd文件就可以看出。此文件的一个版本如图4-1所示。
图4-1 /etc/passwd文件
可以看到,/etc/passwd文件列出了所有种类的用户名。虽然诸如mail、news、ftp和apache的很多Linux服务都有自己的用户名。任何情况下,/etc/passwd文件都有一个特定的格式,关于该格式的详细内容将在第8章中介绍。现在只需要注意到本文件中显示的两个普通用户(alex和michael)的信息,它们的用户ID(UID)、组ID(GID)分别为1000和1001,它们的主目录与它们的用户名相匹配。下一个用户的UID和GID为1002等。
用户的GID与用户的UID相匹配是基于Red Hat的用户私有组模式(User Private Group Scheme)。现在执行ls -l /home命令,输出结果与下面类似:
drwx------. 4 alex alex 4096 Dec 15 16:12 alex drwx------. 4 michael michael 4096 Dec 16 14:00 michael
注意目录的权限。根据本章前面介绍的rwx/ugo的基本概念,只有指定的用户所有者才可以访问他们主目录中的文件。
1. umask
umask在Red Hat Linux中的工作方式有些与众不同,对于那些来自于不同的Unix环境的用户尤其如此。无法配置umask使新建的文件自动具有可以执行权限。它进一步提高了系统的安全性:具有可执行权限的文件越少,黑帽黑客破解系统可利用的可执行文件也就越少。
每次新建一个文件时,文件的默认权限是由umask的值决定的。当我们输入umask命令时,它输出一个4位的八进制数值如0002。如果umask的某位被设置,在新创建的文件和目录中将禁用对应的权限。例如,值为0245的umask意味着新创建的目录将具有0532八进制权限,等效于下面的权限字符串:
r-x-wx-w-.
过去,umask的值会影响文件上所有权限的值。例如,如果umask的值为000,该用户创建的任何文件的默认权限是777-000=777,对应于所有用户读、写和执行权限。现在是666,因为普通的新文件不能再获得可执行权限。另一方面,目录需要可执行权限,这样其中包含的任何文件就可以被访问。
2.默认的umask值
知道了这些基本事实后,应该知道umask的默认值是由/etc/pofile和/etc/bashrc文件决定,具体来说它是由以下这段代码决定的。这使得umask的值取决于UID的值:
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
umask 002
else
umask 022
fi
从这段代码可以看出,对于UID为200及以上的用户账户,umask为002。相反,UID小于200的用户,其umask为022。在RHEL 7中,像adm、postfix和apache等服务用户使用较小的UID,这主要影响为这些服务创建的日志文件的权限。当然,root管理员用户的UID最小,值为0。默认情况下,为这类用户创建的文件具有644权限,创建的目录具有755权限。
相反,普通用户的UID值为1000或大于1000。这类用户创建的文件通常有664权限,他们创建的目录通常具755权限。用户可在其~/.bashrc或~/.bash_profile中追加umask命令,从而覆盖默认设置。