Linux系统是一个多用户系统,每个用户都会创建自己的文件。为了防止其他人擅自改动他人的文件,需要拥有一套完善的文件保护机制。在Linux系统中,这种保护机制就是文件的访问权限。文件的访问权限决定了谁可以访问和如何访问特定的文件。
为了便于读者理解后面的内容,下面首先介绍一些基础知识。
Linux的文件权限分为基本权限和特殊权限,下面分别介绍。
1. 基本权限
Linux系统将文件的基本权限分为3个权限组,分别为文件所有者、文件所属组以及其他用户。所谓文件所有者,一般是指文件的创建者,谁创建了文件,谁就默认成为该文件的所有者。通常情况下,文件所有者对该文件拥有全部权限。文件所属组是指某个用户组对该文件拥有的访问权限。同理,其他用户是指除文件所有者和所属组之外的系统中的其他用户对于该文件的访问权限。这3个权限组分别用u、g和o表示。另外,还要加上一个所有用户,用a表示。
对于每个文件或者目录,都有3种基本权限类型,分别为读、写和执行。所谓读权限,是指用户能够读取文件的内容。写权限是指用户能够写入或修改文件或目录的内容。执行权限是指用户能够执行该文件或者进入某个目录。这3种基本权限分别用字母r、w和x表示。如果没有这种权限,则用连字符-表示。除这种字母表示方法外,Linux还支持一种二进制数字表示法,即分别用二进制100、010和001表示读、写和执行权限,转换成十进制就是4、2和1。
2. 特殊权限
Linux的权限设置非常灵活,除基本权限外,还有3种特殊权限,分别是setuid、setgid和粘滞位。前面两种都是为了使得某个程序在执行时能够得到权限提升而设置的,而后者则是为了保护文件或者目录不被他人删除而设置的。
setuid和setgid分别允许用户以文件所有者和文件所属组的身份执行某个文件。这两种权限适用于某个任务所需的权限高于运行者所拥有的权限,而为了运行这个任务,允许用户暂时提高权限。
首先介绍一下setuid和setgid。setuid的全称是set user ID upon execution,也就是在程序执行时设置其用户ID。那么到底是设置成谁的用户ID呢?当然是程序所有者的用户ID。这意味着无论是哪个用户,只要有执行该程序的权限,那么在该程序执行时,都相当于该程序的所有者在执行。程序所有者所拥有的权限,程序执行者在程序执行的时候也拥有。setgid的全称是set group ID upon execution,其中组ID指的是文件所在组的ID。也就是说,在执行该程序时,只要有执行的权限,那么在程序执行的时候,程序所在组所拥有的权限,执行者同样拥有。
这两种权限通常用在执行某个特殊任务时,需要任务执行者的权限得到临时提升。例如,在Linux系统中,/etc/passwd和/etc/shadow是两个非常关键的文件。前者用来存储账号信息,后者用来存储密码。这两个文件的所有者为root用户,并且只有root用户才有写入权限。但是,我们知道,Linux系统中的每个用户都可以通过passwd命令修改自己的密码,有些非root用户可以在Linux系统中增加或者删除账号。而无论是修改密码还是增删账号都会修改/etc/shadow和/etc/passwd,那么这个功能是如何实现的呢?
实际上,这要归功于setuid权限,Linux系统为passwd命令设置了该权限,并且将passwd命令的所有者设置为root,而系统中其他的有效用户都可以执行passwd命令。这样,在其他用户执行passwd命令的时候,就会拥有root用户的权限,因此就可以修改这两个文件了。
注意:除setuid和setgid外,Linux还提供了其他的安全机制,包括普通用户不能修改其他用户的密码等。
setuid和setgid这两种特殊权限用字符s表示,其中,setuid占用所有者权限的第3个字符,即x所在的位置。setgid占用文件所在组权限的第3个字符,同样是x所在的位置。如果setuid或者setgid和x权限同时拥有,则会两种权限叠加,用小写字符s表示。如果只设置了setuid或者setgid,而没有x权限,则用大写字符S表示。
除字符表示法外,还可以使用数字表示这两种特殊权限,其中setuid在权限的最高位上用十进制数字4表示,而setgid在权限的最高位上用十进制数字2表示。
粘滞位的作用恰恰与刚才介绍的两种权限相反。例如,/tmp目录是Linux为所有的应用程序提供的临时目录,这个目录对于所有的用户来说都是可读、可写的。系统中那么多的应用程序,会不会出现某个应用程序修改或者删除其他应用程序的情况呢?如果这种情况发生的话,必然会导致Linux系统中的应用程序执行错乱。
为了防止上面所讲的现象发生,Linux系统为/tmp目录设置了粘滞位。设置了粘滞位之后,只有文件的所有者才可以修改或者删除/tmp目录中的文件。
粘滞位在文件权限中用字符t表示,占用其他用户权限的第3个字符,即x所在的位置。同样,如果同时设置了粘滞位和执行权限,则用小写字母t表示;如果只有粘滞位,而没有执行权限,则用大写字母T表示。如果用数字来表示粘滞位的话,则最高位上用十进制数字1表示。
本文节选自《Ubuntu Linux系统管理与运维实战》,获出版社和作者授权发布。
《Ubuntu Linux系统管理与运维实战(Linux技术丛书)》(张春晓,肖志健)【摘要 书评 试读】- 京东图书 (jd.com)
标签:setuid,文件,Ubuntu,用户,setgid,Linux,权限 From: https://blog.csdn.net/brucexia/article/details/139673537