1. Linux 文件权限概念
在 Linux 中,文件权限是用于控制谁可以对文件或目录进行读取、写入和执行操作的规则。
文件权限分为三种类型:所有者权限、所属组权限和其他用户权限。每种权限又分为读(r)、写(w)和执行(x)三种具体权限:
- 读权限(Read)
- 文件:查看文件内容的权限。
- 目录:查看目录下文件和子目录名的权限。
- 写权限(Write)
- 文件:修改文件内容的权限。
- 目录:创建、删除、重命名目录中的文件和子目录的权限。
- 执行权限(Execute)
- 文件:执行文件的权限。
- 目录:进入目录(即
cd
进入)的权限。
2. Linux 文件属性的详细解读
例:-rw-r--r--
1 root root 0 Jun 27 17:27 a.txt
- 文件类型和权限(
-rw-r--r--
)- 第一个字符(文件类型):
-
:普通文件d
:目录l
:软链接文件c
:字符设备文件,如键盘、鼠标等b
:块设备文件,可供储存的周边设备p
:命名管道文件s
:套接字文件- 文件类型详细介绍:https://pingk.top/linux-file-directory-manage/
- 接下来的九个字符(权限)按三组来表示,每组三个字符,分别表示所有者、组和其他用户的权限。
- 所有者权限(
rw-
):表示 root 用户具有读 (r) 和写 (w) 权限,但没有执行 (x) 权限。 - 组权限(
r--
):表示同组用户具有读 (r) 权限,但没有写 (w) 和执行 (x) 权限。 - 其他用户权限(
r--
):表示其他用户具有读 (r) 权限,但没有写 (w) 和执行 (x) 权限。
- 所有者权限(
- 第一个字符(文件类型):
- 硬链接数量(1)
- 表示到文件的硬链接数目,即有多少个不同的文件名指向这个文件。
- 所有者(root)
- 表示文件的所有者是 root 用户。
- 组(root)
- 表示文件所属的组是 root。
- 文件大小(0)
- 表示文件的大小,单位是字节(Bytes)。此处为 0,表示文件为空。
- 修改时间(Jun 27 17:27)
- 表示文件的最后修改时间。格式为 月 日 时:分。
- 文件名(a.txt)
- 表示文件的名称。
3. Linux 文件权限修改命令
- chgrp:更改文件或目录的组
# 基本语法
chgrp [选项] 组名 文件名
# 常用选项
# -R:递归地改变指定目录及其包含的所有文件和子目录的所属组。
Bash- chown:更改文件或目录的所有者和组
# 基本语法
chown [选项] 所有者[:组] 文件名
# 常用选项
# -R:递归更改指定目录及其包含的所有文件和子目录的所有者(和/或组)。
Bash- chmod:更改文件或目录的访问权限
# 基本语法
chmod [选项] 权限模式 文件名
# 权限模式
# 符号模式:使用字母 r(读取)、w(写入)、x(执行),结合添加 +、删除 -、赋值 = 进行权限设定。
# 数字模式:使用三位数代表所有者、所属组和其他用户的权限。每位数是权限位(读=4,写=2,执行=1)的总和。
# 示例:
# 将文件 example.txt 的权限设置为所有者可读写,组和其他用户只读:
# user(u)、group(g)、others(o)、all(a)
chmod u=rw,go=r example.txt
chmod 644 example.txt
# 常用选项
# -R:递归更改指定目录及其包含的所有文件和子目录的权限。
Bash4. Linux 特殊权限 SUID,SGID,SBIT
setuid 和 setgid 分别是 set uid ID upon execution 和 set group ID upon execution 的缩写。我们一般会再次把它们缩写为 suid 和 sgid。它们是控制文件访问的权限标志(flag),它们分别允许用户以可执行文件的 owner 或 owner group 的权限运行可执行文件。
4.1 SUID
思考:普通用户不是root也不属于root组,因此它对/etc/shadow文件没有任何权限,但是普通用户却可以用passwd命令修改密码,而修改密码都是在修改/etc/shadow文件,如何实现的?
我们查看passwd命令权限可看到该命令有一个 s 权限,该权限为SUID:
[root@localhost ~]# ll `which passwd`
-rwsr-xr-x. 1 root root 32656 May 15 2022 /usr/bin/passwd
BashSUID权限的特点:
- SUID权限仅对二进制可执行文件有效
- 如果执行者对于该二进制可执行文件具有 x 的权限,执行者将具有该文件的所有者的权限
- 本权限仅在执行该二进制可执行文件的过程中有效
示例:
[root@localhost ~]# ll `which cat`
-rwxr-xr-x. 1 root root 36312 Apr 24 2023 /usr/bin/cat
[root@localhost ~]# chmod 4755 `which cat` # 或者 chmod u+s `which cat`
[root@localhost ~]# ll `which cat`
-rwsr-xr-x. 1 root root 36312 Apr 24 2023 /usr/bin/cat
[root@localhost ~]# su - user2 # 切换到普通用户
[root@localhost ~]# cat /etc/passwd # 可以看到内容
Bash4.2 SGID
- 当 SGID 作用于普通文件时和 SUID 类似,在执行文件时,用户将获得该文件所属组的权限。
- 当 SGID 作用于目录时:任何用户在该目录下新创建的文件和子目录将继承该目录的组所有权。
示例:
[root@localhost ~]# mkdir /test
[root@localhost ~]# chmod g+s /test/ # 等同于chmod 2755 /test/
[root@localhost ~]# ll -dl /test/
drwxr-sr-x 2 root root 6 Jul 24 00:47 /test/
[root@localhost ~]# chown :user02 /test/ # 后期任何人在该目录下创建的文件or目录的属组都是user02
Bash4.3 SBIT
SBIT 权限对于文件本身没有直接影响,它只对目录起作用。作用如下:
- 限制删除:SBIT 权限可以防止其他用户删除不属于自己的文件。当一个目录设置了 SBIT 权限后,只有文件的所有者、目录的所有者和超级用户(root)才能删除该文件。其他用户无法删除不属于自己的文件,即使对于目录具有写权限。
- 共享目录:SBIT 权限常用于共享目录,以确保多个用户可以在同一个目录中创建文件,但不允许其他用户删除或修改其他用户的文件。这样可以促进文件的共享和协作,同时保护每个用户的文件安全。
- 临时文件夹:SBIT 权限还常用于临时文件夹,例如
/tmp
目录。设置 SBIT 权限可以确保只有文件的所有者和超级用户才能删除临时文件,防止其他用户意外删除或修改他人的临时文件。