linux中的特殊权限与隐藏属性
本文主要记录一些关于linux系统中特殊权限与隐藏属性的内容
前言
在linux系统中,有文件属性和文件权限两个不同的概念。文件权限指的是用户对文件或目录的操作权限,包括读取、写入和执行。而文件属性则指的是文件的一些特征,例如是否可以被修改或移动。文件属性能够针对所有用户,包括root用户。
但除了以上三个常见的文件权限以外还有另外三个特殊文件权限,以及文件的隐藏属性。
文件的特殊权限
linux文件的三种特殊权限:suid、sgid、sticky。这些权限都可以通过chmod
命令设置,可以使用对应的符号设置也可以使用对应的数字设置。suid和guid对应的符号都是s,ticky对应的符号是t,它们依次对应所有者、用户组、其他用户的权限。suid(u+s)表示所有者权限,其对应的数字是4;sgid(g+s)表示用户组权限,其对应的数字是2;sticky(o+t)表示其他用户权限,其对应的数字是1。通常情况下,使用chmod
命令进行八进制数字语法设置权限时,特殊权限是位于第一个数字位,其余的三个数字位就是对应所有者、用户组、其他用户的读写执行权限。
suid权限
SUID(Set User ID):当设置了SUID位的可执行文件被运行时,任何用户在执行该文件时都会以文件所有者的身份执行,而不是以启动它的用户的身份执行。这意味着当可执行文件属主是root用户时,且该文件设置了suid权限,那么任何用户在执行这个文件时都会临时拥有root权限。这在普通用户执行需要root权限的命令时很有用。
例如,普通用户正常情况下是无法在根目录直接创建文件。
但是可以通过suid权限让普通用户可以在执行touch
命令时,以root的身份执行。
使用以下命令为touch
命令设置suid权限,并在普通用户下在根目录创建文件
1 | # root用户 |
查看命令,可以看到在所有者的权限上出现了s的符号,代表了suid权限。
之后普通用户就可以直接执行具有suid权限的可执行文件或命令,直接在根目录下创建文件。
可通过以下命令查找所有具有suid权限的文件
1 | sudo find / -perm -4000 # 查找所有具有suid权限的可执行文件 |
suid权限和sudo命令的比较
从“以root身份执行”的角度来看,二者具有同样的效果,但实际使用与体验上可能大不一样。
首先,suid通过chmod
命令来设置的一种特殊文件权限(如果要获取root权限,则还必须要求这个可执行文件的所有者是root),而sudo
是一种可以在一定时间内以root身份进行操作的权限命令。
suid是针对可执行文件,只需要使用chmod
命令设置即可,但是获取的权限取决于这个文件的所有者,而并不一定是root。sudo
是针对特定的用户,需要在/etc/sudoers文件中进行配置,便于这些用户使用root权限进行操作。
由此可见,suid可以使得某一个具有该权限的可执行文件能被任何用户执行,但是也仅限于被赋予了suid权限的可执行文件,例如上面的示例中,笔者虽然给touch
命令设置了suid权限,但普通用户根本无法正常地对这个文件进行写入以及删除的操作等,除非把其他一系列相关的可执行文件都设置suid权限,但这样容易导致安全问题(suid提权)。而sudo
命令可以给受信任的用户在一定时间内以root的身份进行操作。
因此在日常中,sudo
可能是相对安全且方便的选择,而suid权限的设置需要用户具有一定的专业知识,实际上在大多数linux发行版中已经预置了一些具有suid权限的可执行文件,例如passwd
命令,方便用户安全地修改自己的密码。这些是经过了专业的设计,内置了安全措施,所以suid权限对于普通用户来说,可能是不怎么被关注的,即使它已经存在于一些日常使用的命令中。大多数普通用户主要了解基础的三个权限即可。
sgid权限
SGID(Set Group ID):当一个目录被设置了sgid权限时,任何用户在该目录下创建的新文件都会继承该目录的属组。这意味着,如果一个目录的属组是test,则在该目录下创建的新文件都会属于test组。sgid权限通常用于设置目录权限,对文件设置sgid权限是没有什么实际意义的。这对团队在linux服务器开发项目时,成员之间共享文件和目录时很有用,每个新添加的文件和目录都会具有与父目录相同的属组。
sgid使用案例
使用以下命令为webapp目录设置sgid权限,并用不同的用户在该目录下创建文件和子目录。
1 | # 准备测试用户、组和目录 |
在没有设置sgid权限的情况下,不同用户创建的文件和目录属于各自的组
在设置sgid权限的情况下,不同用户创建的文件和目录统一为父目录的属组
sgid权限要求父目录组权限至少要有写入执行(g+wx)的权限,否则只能给目录所有者一个用户使用,那么也没有什么实际意义了。
但这样还不能够满足共享文件和目录的基本要求,因为用户可以直接删除其他用户的文件和目录,而sticky权限可以弥补这一个缺点。
sticky权限
sticky(sticky bit):当一个目录被设置了sticky权限时,即使其他用户对该目录具有写入权限,也只能删除自己拥有的文件,这意味着,如果一个目录具有sticky权限,那么任何用户都不能删除该目录中其他用户拥有的文件。sticky权限也是用于目录的权限设置,对文件设置sticky权限没有什么实际意义。这对共享文件和目录时,防止普通用户删除其他用户的文件很有用。
sticky使用案例
使用以下命令,可以直接使用前面sgid案例的测试数据,为目录设置sticky权限,并用不同的用户去测试上传删除自己和其他用户的文件。
1 | # 创建共享目录 |
设置了sticky权限之后,即使拥有父目录的所有权限,只要不是该文件的所有者,就无法删除文件,每个用户只能删除自己创建的文件。另外,root用户无视sticky权限的限制。
linux系统中,创建、删除、重命名文件至少需要父目录的写入执行(wx)权限,因此sticky权限也要至少保证目录的所有者具有相应的权限,否则任何普通用户都无法在目录下创建自己的文件了,那么也没有什么实际意义了。如果考虑和sgid权限配合使用,则还要保证组具有相应的权限。
文件的隐藏属性
linux文件属性包括文件的许多特征,通常有文件类型、文件大小、文件所有者、文件所属组、文件最后修改时间等,而隐藏属性是属于文件的特殊性质。这些隐藏属性在linux中可以通过chattr
命令进行设置,通过lsattr
命令查看。
chattr
chattr
是一个linux命令,用于设置文件的某些隐藏属性,以保护重要文件和文件夹免受意外删除或修改,而且是少有的能够直接限制root用户的命令。
chattr
的语法如下,
1 | chattr [选项] [操作符] [属性] 文件... |
其中操作符有以下几个符号:
+
:将指定的属性添加到现有属性-
:从现有属性中删除指定的属性=
:将指定的属性设置为唯一属性,覆盖原来的属性
操作符后可接多个属性,下面是一些常见属性:
a
:文件只能以追加模式写入。A
:文件的访问时间(atime)记录不会被修改,可以减少磁盘IO。e
:文件使用extents映射磁盘上的块,这个属性无法被chattr
修改,与文件系统有关,例如ext4文件系统。i
:文件不可变,即文件不能被删除或修改。
更多说明内容可以使用man chattr
查询。
lsattr
lsattr
命令主要用于查看文件对应的隐藏属性。
例如
1 | lsattr /etc/passwd |
chattr锁定文件
前面提到chattr
是少有的能够直接限制root用户的命令,但同时它也需要谨慎使用。
可以通过以下命令创建并锁定文件,即使root用户也无法直接删除和修改。
1 | touch ~/immutable.txt |
执行命令可以看到即使使用root权限也无法删除该文件
要删除文件,只能使用chattr
重新取消i
属性。
1 | sudo chattr -i ~/immutable.txt |
chattr
命令虽然可以阻止文件被意外删除或修改,但是它所针对的文件或目录对象,通常是一些内容不会去改动的系统配置文件、日志文件、备份文件等,而且这些文件和目录不应该对其他的文件和目录有依赖关系。例如,你对那些linux命令的可执行文件使用chattr
锁定,那它们大概率会无法正常工作。
总结
以上,主要介绍了suid、sgid、sticky三个特殊权限和文件的隐藏属性。
说明了如何使用sgid权限创建一个能够自动继承父目录属组的共享目录,使用sticky权限来限制共享目录的多个用户对共享文件的删除权限,以及整合sgid和sticky权限来打造一个安全且便于协作的共享文件目录。
最后介绍了如何利用文件的隐藏属性来限制root用户及其他任何用户的误操作以保护重要文件。
参考资料
- 标题: linux中的特殊权限与隐藏属性
- 作者: Entropy Tree
- 创建于 : 2023-08-10 13:27:28
- 更新于 : 2023-08-11 11:23:29
- 链接: https://www.entropy-tree.top/2023/08/10/linux-special-permissions/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。