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 36520 Nov 7 2024 /bin/cat
[root@localhost ~]# su - user1
[user1@localhost ~]$ cat /etc/shadow # 提示没有权限
# 切换到 root 用户,修改 cat 命令权限
[root@localhost ~]# chmod 4755 `which cat` # 或者 chmod u+s `which cat`
[root@localhost ~]# ll `which cat`
-rwsr-xr-x 1 root root 36520 Nov 7 2024 /bin/cat
[root@localhost ~]# su - user1
[user1@localhost ~]$ cat /etc/shadow # 可以看到文件内容
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/ # 后期任何人在该目录下创建的文件或目录的属组都是user02
Bash4.3 SBIT
SBIT 权限对于文件本身没有直接影响,它只对目录起作用。作用如下:
- 限制删除:SBIT 权限可以防止其他用户删除不属于自己的文件。当一个目录设置了 SBIT 权限后,只有文件的所有者、目录的所有者和超级用户(root)才能删除该文件。其他用户无法删除不属于自己的文件,即使对于目录具有写权限。
- 共享目录:SBIT 权限常用于共享目录,以确保多个用户可以在同一个目录中创建文件,但不允许其他用户删除或修改其他用户的文件。这样可以促进文件的共享和协作,同时保护每个用户的文件安全。
- 临时文件夹:SBIT 权限还常用于临时文件夹,例如
/tmp
目录。设置 SBIT 权限可以确保只有文件的所有者和超级用户才能删除临时文件,防止其他用户意外删除或修改他人的临时文件。
5. umask 文件默认权限
umask(User File Creation Mask) 是 Linux/Unix 系统中用来 控制新建文件或目录的默认权限 的一个机制。它决定了文件或目录在创建时 不允许有哪些权限。
- 当用户创建 文件 或 目录 时,系统会先赋予一个 初始权限,然后 减去 umask 指定的权限,得到最终的权限。
- umask 的值 是一个 八进制数(如
0022
),表示要屏蔽的权限位。 - 初始权限:
- 文件:
666
(rw-rw-rw-
,即所有者、组、其他用户都有读写权限,但没有执行权限,因为普通文件默认不需要执行)。 - 目录:
777
(rwxrwxrwx
,因为目录需要执行权限x
才能进入)。
- 文件:
- 实际权限 = 初始权限 – umask,如果
umask=0022
则:- 文件:
666 - 022 = 644
(rw-r--r--
) - 目录:
777 - 022 = 755
(rwxr-xr-x
)
- 文件:
# 查看当前 umask
umask
# 临时修改 umask(仅当前会话有效)
umask 000
# 永久修改 umask(对所有用户或指定用户)
## 全局生效(修改 /etc/profile 或 /etc/bashrc):
echo "umask 0027" >> /etc/profile
source /etc/profile
## 仅对当前用户生效(修改 ~/.bashrc 或 ~/.bash_profile):
echo "umask 0027" >> ~/.bashrc
source ~/.bashrc
Bash6. ACL 权限设置详解
ACL(Access Control List,访问控制列表)是 Linux 文件系统的扩展权限机制,允许更精细地控制文件和目录的访问权限,超越传统的 user/group/others
权限模型。
6.1. ACL 的作用
- 传统权限的局限性:
- 只能设置 所有者、所属组、其他用户 三种权限。
- 无法针对 特定用户或组 设置不同权限。
- ACL 的优势:
- 可以给 单个用户 或 多个组 设置不同的权限。
- 适用于需要 精细化权限管理 的场景(如共享文件夹)。
6.2. ACL 基本命令
setfacl # 设置 ACL 权限
# 给特定用户添加权限
setfacl -m u:username:rwx /path/to/file
# 给特定组添加权限
setfacl -m g:groupname:r-x /path/to/file
# 删除某个用户的 ACL 权限
setfacl -x u:username /path/to/file
# 删除所有 ACL 权限
setfacl -b /path/to/file
getfacl # 查看 ACL 权限
getfacl /path/to/file
# 示例:
# file: data/shar
# owner: root
# group: root
user::rwx
user:alice:rwx
group::r-x
group:developers:r-x
mask::rwx
other::r--
# ps: 使用 chmod 修改基本权限不影响 ACL 权限。
Bash6.3. 默认 ACL(继承权限)
可以设置 目录的默认 ACL,使 新建的子文件和子目录自动继承权限:
setfacl -d -m u:username:rwx /path/to/dir
# 之后在 /path/to/dir 下创建的文件会自动继承 ACL 权限。
Bash6.4. ACL mask 详解
mask
的作用是限制 ACL 用户/组的最高权限。
- 例如:若
mask=r--
,即使某用户被赋予rwx
,实际权限仍是r--
。
修改 mask
方法:
# 方法 1:直接设置 mask
setfacl -m m::r-x /path/to/file
# 方法 2:通过修改 ACL 自动更新 mask
setfacl -m u:bob:rwx /path/to/file # 自动调整 mask 为 rwx
Bash7. chattr 文件属性设置
chattr
是 Linux 系统中用于修改 文件或目录的扩展属性(Extended Attributes) 的命令,这些属性可以赋予文件更底层的保护机制,超越传统的 chmod
和 chown
权限控制。它通常用于增强文件的安全性,防止误删除、修改或篡改。
基本用法:
# 添加属性
sudo chattr +a /etc/passwd
# 常用属性如下:
## a 只能追加内容,不能删除或修改
## i 完全不可修改(禁止删除、写入、链接)
## A 不更新文件的访问时间(atime)
## c 文件写入时自动压缩(需文件系统支持)
## e 文件使用 ext4 的 extent 格式存储
## j 文件数据先写入日志(ext3/ext4)
# 移除属性
sudo chattr -i /etc/passwd # 取消不可变属性
# 查看属性
lsattr /etc/passwd
Bash