linux中的特殊权限与隐藏属性

Entropy Tree Lv4

本文主要记录一些关于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
2
3
4
5
6
7
# root用户
chmod u+s /bin/touch
ls -l /bin/touch

# test用户
cd /
touch test.txt

查看命令,可以看到在所有者的权限上出现了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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 准备测试用户、组和目录
useradd -m test
useradd -m webappdev
groupadd webappgroup
usermod -aG webappgroup test
usermod -aG webappgroup webappdev
mkdir /webapp
chmod 775 /webapp # 允组内所有用户写入执行,这是多用户共享目录的必要权限

# 设置webapp目录的所有者和组
chown webappdev:webappgroup /webapp
# 设置webapp目录的sgid权限
chmod g+s /webapp
# 查看权限
ls -ld /webapp

# test用户添加文件和目录
su - test
touch test_file
mkdir test_dir
# webappdev用户添加文件和目录
su - webappdev
touch dev_file
mkdir dev_dir

# 查看文件和目录权限
cd /webapp
ls -l

在没有设置sgid权限的情况下,不同用户创建的文件和目录属于各自的组

在设置sgid权限的情况下,不同用户创建的文件和目录统一为父目录的属组

sgid权限要求父目录组权限至少要有写入执行(g+wx)的权限,否则只能给目录所有者一个用户使用,那么也没有什么实际意义了。

但这样还不能够满足共享文件和目录的基本要求,因为用户可以直接删除其他用户的文件和目录,而sticky权限可以弥补这一个缺点。

sticky权限

sticky(sticky bit):当一个目录被设置了sticky权限时,即使其他用户对该目录具有写入权限,也只能删除自己拥有的文件,这意味着,如果一个目录具有sticky权限,那么任何用户都不能删除该目录中其他用户拥有的文件。sticky权限也是用于目录的权限设置,对文件设置sticky权限没有什么实际意义。这对共享文件和目录时,防止普通用户删除其他用户的文件很有用。

sticky使用案例

使用以下命令,可以直接使用前面sgid案例的测试数据,为目录设置sticky权限,并用不同的用户去测试上传删除自己和其他用户的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 创建共享目录
mkdir /webapp
# 设置sticky权限
chmod o+t /webapp
ls -ld /webapp

# 设置所有权,允许所有用户上传文件,但只允许root用户和文件对应的所有者删除对应的文件
chown root:webappgroup /webappgroup
chmod 3777 /webapp # 这里如果使用777则会把前面设置的sticky权限覆盖掉
ls -ld /webapp

# test用户添加文件
su - test
cd /webapp && touch test_file

# webappdev用户添加文件
su - webappdev
cd /webapp && touch dev_file

# 测试用户删除其他用户的文件
su - test
cd /webapp && rm dev_file
su - webappdev
cd /webapp && rm test_file

设置了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
2
3
4
5
touch ~/immutable.txt
sudo chattr +i ~/immutable.txt
lsattr ~/immutable.txt

sudo rm -rf ~/immutable.txt

执行命令可以看到即使使用root权限也无法删除该文件

要删除文件,只能使用chattr重新取消i属性。

1
2
3
sudo chattr -i ~/immutable.txt

rm -rf ~/immutable.txt

chattr命令虽然可以阻止文件被意外删除或修改,但是它所针对的文件或目录对象,通常是一些内容不会去改动的系统配置文件、日志文件、备份文件等,而且这些文件和目录不应该对其他的文件和目录有依赖关系。例如,你对那些linux命令的可执行文件使用chattr锁定,那它们大概率会无法正常工作。

总结

以上,主要介绍了suid、sgid、sticky三个特殊权限和文件的隐藏属性。

说明了如何使用sgid权限创建一个能够自动继承父目录属组的共享目录,使用sticky权限来限制共享目录的多个用户对共享文件的删除权限,以及整合sgid和sticky权限来打造一个安全且便于协作的共享文件目录。

最后介绍了如何利用文件的隐藏属性来限制root用户及其他任何用户的误操作以保护重要文件。

参考资料

Linux chattr命令

Linux - 文件的三种时间之atime、ctime、mtime的区别和简单用法

  • 标题: 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 进行许可。
评论
目录
linux中的特殊权限与隐藏属性