Skip to content

Linux 用户·权限与安全扩展

用户和组管理是系统运维的基础操作,涉及用户账号、组账号的创建、修改、删除以及权限控制等。

用户和组的配置文件

  1. 用户信息配置文件 /etc/passwd
shell
# 执行查看命令
cat /etc/passwd

#结果如下:
root:x:0:0:root:/root:/bin/bash
# root           x                  0              0         root          root              /bin/bash
# 用户名         密码位             用户ID           组ID       用户说明       用户家目录        登录shell执行文件
  1. 密码配置文件,可用于设置密码相关 /etc/shadow 只有 root 用户拥有查看权限
shell
# 执行查看命令
cat /etc/shadow

# 结果如下:
user1:加密密码:17214:0:99999:7:::
# user1     加密密码    17214                              0                                99999                   7
# 用户名    加密密码    密码最近更改时间的时间戳(天数)   两次密码的修改时间间隔(天)     密码的有效期(天)      密码到期前的警告时间   密码到期宽限天数 失效时间

# 注意
如果密码是!!或\*代表用户不能登录
可以通过加密密码临时禁用客户:我们可以在密码前加 ! 号,改变加密值,让用户暂时无法登录,达到临时禁用用户的目的,修复时将 ! 去掉保存退出即可
密码最近更改时间的时间戳(天数):将天数时间戳转化成时间,date -d "1970-01-01 17214 days"
两次密码的修改时间间隔:默认 0 ,代表可以随意修改
  1. 组信息配置文件 /etc/group
shell
# 执行查看命令
cat /etc/group

# 结果如下:
user1:x:500:
# user1     x           500
# 组名      组密码位    组id(GID)   此组支持的其他用户

# 注意
初始组:每个用户的初始组只能有一个,一般都是和用户名相同的组作为初始组
附加组:每个用户可以属于多个附加组,要把用户加入组都加入附加组
组密码位:不建议设置组密码,建议只有管理员有最高权限即可

# 组密码配置文件(不建议设置密码)
cat /etc/gshadow
  1. 用户目录所在
shell
/home/用户名/                   # 用户的家目录
/var/spool/mail/用户名/         # 用户的邮箱目录
/home/用户名/         # 用户的家目录
/home/用户名/         # 用户的家目录

用户管理

注解

用户账号用于登录系统并获取相应权限,每个用户有唯一的 UID(用户 ID)

用户 id(UID)的范围:0 是管理员,1~499 是系统用户(伪用户:所有的系统服务都有自己的用户,比如 mysql,appache),500~65535 是普通用户

如果想把普通用户的权限改成管理员权限,直接将用户的 uid 设置为 0 保存退出即可(linux 系统通过 uid 来分配权限)

创建用户

shell
# 基本语法
useradd [选项] 用户名

# 常用选项:
# -m:自动创建用户的家目录(/home/用户名)
# -g:指定用户的初始组(主组,必须已存在)
# -G:指定用户的附加组(可多个,用逗号分隔)
# -s:指定用户的默认shell(如 /bin/bash 或 /sbin/nologin)
# -u:指定自定义UID(需唯一)

# 示例:创建用户 test,自动创建家目录,主组为 users,附加组为 wheel,shell 为 bash
useradd -m -g users -G wheel -s /bin/bash test


# 创建用户 实际执行的是将用户信息写入所有用户配置文件
# /etc/passwd                               写入 存储所有用户的基本信息
# /etc/shadow                               写入 存储用户密码的加密信息(仅 root 可查看)
# /etc/group                                写入 存储所有组的基本信息(组名、GID、成员列表等)
# /etc/gshadow                              写入 存储组密码的加密信息(较少使用)
# /home/用户名/                              创建并写入

# useradd 的默认配置文件,用来修改默认的用户和密码配置
#/etc/default/useradd /etc/login.defs

设置密码|锁定解锁用户

shell
# 基本语法
passwd 用户名

# 示例:为用户 test 设置密码(输入后会提示输入新密码)
passwd test

# 选项:
# -l:暂时锁定用户,禁止登录,仅root用户可用此命令(实际:在/etc/shadow 配置文件的密码前加 !)
# -u:解锁用户,仅root用户可用此命令(实际:去掉/etc/shadow 配置文件的密码前的 !)
# -d:清除用户密码(登录无需密码,不推荐)
# -stdin:通过管道符输出数据作为用户和密码,主要在批量添加用户的时候使用(echo "123" | passwd --stdin user1)

# 常用操作
passwd -l test   # 锁定 test 用户
change -d 0 user1  # 让用户登录就要修改密码(将 shadow 第三字段归 0,即:密码修改日期设置为 0)
# 批量添加用户和设置密码
echo "123" | passwd --stdin user1
echo "456" | passwd --stdin user2
echo "789" | passwd --stdin user3
echo "000" | passwd --stdin user4
# 但是会有记录,需要 history -c 清楚,以确保密码安全
history
history -c

修改密码

shell
# 管理员修改其他用户密码
语法:passwd 用户名
规则:不需要输入旧密码,直接输入新密码,密码设置随意,可不符合密码规则

# 用户自己修改自己的密码
语法:passwd
规则:先输入旧密码,在输入两次新密码,且密码不能太简单,要符合密码原则

删除用户

shell
# 基本语法
userdel [选项] 用户名

# 选项:
# -r:删除用户的同时,删除家目录和邮件目录(推荐)

# 示例:彻底删除 test 用户及其家目录
userdel -r test

# 或者手动删除(不推荐)
vim /etc/passwd
vim /etc/shadow
vim /etc/group
vim /etc/gshadow
rm -rf /home/用户名/

修改用户信息

shell
# 基本语法
usermod [选项] 用户名


-u                                  修改UID
-g                                  修改组名,配置文件/etc/passwd 第四个字段
-G                                  修改附加组
-c                                  修改用户说明,配置文件/etc/passwd 第五个字段
-d                                  修改家目录
-s                                  修改用户登录的shell位置,默认/bin/bash
-e                                  修改用户的失效日期,配置文件/etc/shadow 的第八个字段
-L                                  临时锁定用户
-U                                  解锁用户

# 示例:将 test 用户的附加组添加 docker
usermod -aG docker test  # -a 表示追加,避免覆盖原有附加组

# 示例:修改 test 用户的家目录为 /opt/test,并移动原文件
usermod -d /opt/test -m test

查看用户

shell
# 查看当前登录用户
whoami

# 查看用户详细信息(UID、GID、组等)
id 用户名   # 如 id test

# 查看系统所有用户(/etc/passwd 文件存储用户信息)
cat /etc/passwd | grep 用户名

切换用户身份

注意:超级用户切换到其他用户不需要输入密码,其他用户切换需要输入密码

shell
# 基本语法
su [选项] 用户名

# 选项
-        彻底切换到新用户,使用 exit 命令,退回到原来用户
-c       临时切换到新用户,使用 exit 命令,退回到原来用户

组管理

组用于统一管理用户权限,每个组有唯一的 GID(组 ID),用户可属于一个主组和多个附加组。

创建组

shell
# 基本语法
groupadd [选项] 组名

# 选项:
# -g:指定自定义GID(需唯一)

# 示例:创建组 dev
groupadd dev

# 示例:创建GID为10086的组 test_group
groupadd -g 10086 test_group

修改组属性

shell
# 基本语法
groupmod [选项] 组名

# 选项:
# -g:修改GID
# -n:修改组名

# 示例:将组 dev 改名为 develop
groupmod -n develop dev

# 示例:将组 develop 的GID改为10010
groupmod -g 10010 develop

删除组

shell
# 基本语法(组必须不是任何用户的主组才能删除)
groupdel 组名

# 示例:删除组 test_group
groupdel test_group

管理组内用户

shell
# 基本语法
gpasswd [选项] 组名

# 常用选项:
# -a:添加用户到组
# -d:从组中删除用户
# -M:设置组的成员列表(覆盖原有成员,用逗号分隔)

# 示例:将用户 test 添加到组 develop
gpasswd -a test develop

# 示例:从组 develop 中删除用户 test
gpasswd -d test develop

# 示例:设置组 develop 的成员为 user1,user2,user3
gpasswd -M user1,user2,user3 develop

查看组信息

shell
# 查看用户所属的组
groups 用户名   # 如 groups test

# 查看系统所有组(/etc/group 文件存储组信息)
cat /etc/group | grep 组名   # 过滤特定组

提示

Linux系统遵循 一切皆文件 原则,目录也是文件,读、写、执行权限是文件最基本权限,也是最常用权限,但是要注意权限作用的位置依次是:所有者、所属组、其他人

在 Linux 系统中,chmod 命令用于修改文件或目录的访问权限,权限控制着用户(所有者、组用户、其他用户)对文件的读(r)、写(w)、执行(x)操作

查看文件权限

shell
# 基础语法
ls -l   # 查看文件权限
ls -la  # 查看文件权限(包括隐藏文件)

# 结果
-rw-r--r-- 1 root root 658739200 Jan 10  2025 nvm.tar.gz
drwxr-xr-x 8 root root      4096 Oct 30 10:49 test

# 结果解析 drwxr-xr-x 8 root root      4096 Oct 30 10:49 test
1. 第一个字符代表文件类型
- 代表普通普通文件
d 代表目录文件,linux中所有的文件或目录的一中
b 块设备文件,特殊设备文件,存储设备都是这个文件,比如:/dev/sda1
c 字符设备文件,特殊设备文件,输入设备是这个文件,比如:鼠标、键盘等
i 软连接文件
p 管道符文件,非常少见的特殊设备文件
s 套接字文件,殊设备文件,比如:socket访问会产生这类文件
2. 之后的 9 个字符,代表读写执行权限,每三个为一组用户,共三个组:
第一组:所有者权限(u) ----------------- user 首字母
第二组:所属组的权限(g) ----------------- group 首字母
第三组:其他人的权限(o) ----------------- other 首字母
每一组中的字符功能(有对应字符代表有权限,- 代表无权限):
第一个字符:可读权限(r) ----------------- read 首字母
第二个字符:可写权限(w) ----------------- write 首字母
第三个字符:可执行权限(x) ----------------- eXecute 第二个字母
3. 8 代表硬链接数,普通文件默认 1,目录默认等于子目录数 + 2(.和..)
4. 第一个 root 代表所有者
5. 第二个 root 代表所有者
6. 4096 代表存储大小,单位是字节
7. Oct 30 10:49 代表最后修改时间
8. test 代表文件 / 目录名

chmod 文件权限管理(增、删、改)

shell
# 基础语法
chmod [选项] 权限 文件/目录

# 选项
-R # 递归,如果要修改目录及其中所有文件 / 子目录的权限,需加 -R 选项(递归)

# 三类用户
u 所有者(User):文件的创建者。
g 所属组(Group):所有者所在的用户组。
o 其他用户(Others):既不是所有者也不在所属组的用户。
a 所有用户(all):所有

# 操作符
+ 添加权限
- 移除权限
= 设置权限(覆盖原有权限)

# 三种权限
r(Read,读权限):允许查看文件内容或列出目录内容(值为 4)。
w(Write,写权限):允许修改文件内容或创建 / 删除目录中的文件(值为 2)。
x(Execute,执行权限):允许运行文件(如脚本、程序)或进入目录(值为 1)。

# 数字模式权限(简洁)
4:r--(4) # 核心(读权限)
2:-w-(2) # 核心(写权限)
1:--x(1) # 核心(执行权限)

7:rwx(4+2+1)
6:rw-(4+2)
5:r-x(4+1)
3:-wx(2+1)
0:---(无权限)

# 示例
chmod u+rwx 文件名  # 添加 文件 的所有者的读、写、执行权限
chmod g+rwx 文件名  # 添加 文件 的所属组的读、写、执行权限
chmod o+rwx 文件名  # 添加 文件 的其他人的读、写、执行权限
chmod u+rwx,g+rwx,o+rwx 文件名 # 可联合统一设置

chmod u=rwx 文件名  # 设置 文件 的所有者的读、写、执行权限

chmod u-rw 文件名  # 删除 文件 的所有者的读、写权限

chmod 744 文件名 # 所有者读写执行,组和其他用户只读---------------- 最常用的文件权限
chmod 770 dir/ # 所有者读写执行,组读写执行,其他用户无权限---------------- 最常用的文件权限

rwx 权限的实际意义

shell
# 权限对 文件 的作用
可读 r 权限  # 可对此文件执行:cat、more、less、head、fail 等文件查看命令
可写 w 权限  # 可对此文件执行:vim、echo 等修改文件数据命令,注意:无权删除此文件,如果要删除需要对文件的上级目录拥有可写的权限
可执行 x 权限  # 文件变成执行文件,对文件来说 可执行 权限是最高的

# 权限对 目录 的作用
可读 r 权限  # 可对此目录执行:ls 命令
可写 w 权限  # 可对目录内文件进行 创建、删除、复制、剪切操作,即可执行:touch、rm、cp、mv 命令,对目录来说 可写 权限是最高的
可执行 x 权限  # 可进入,即:拥有 x 权限可以对此目录执行 cd 命令

# 注意:
目录只有以下几个可用权限,因为 x r 权限是必须得给得,否则此目录无意义
0              不给予任何权限
5              进入和查看的权限
7              完全权限

注意事项

  1. 命令之间的空格,可以空多个
  2. 权限对于超级用户 root 来说几乎没意义,权限是超级用户用来限制普通用户得
  3. root 管理员的 UID 是 0,普通用户的 UID > 500
  4. 只有文件的所有者或 root 用户才能使用 chmod 修改权限。
  5. 目录的 x 权限表示 “可进入”(cd),若没有 x 权限,即使有 r 权限也无法查看目录内容。
  6. 谨慎使用 777 权限(所有用户可读写执行),可能导致安全风险。

Linux 文件 / 目录的所有者、所属组和其他人(Other)管理,核心是通过 chown、chgrp、chmod 三个命令分别控制归属权和访问权限,实现文件安全隔离。

chown 修改文件的所有者、所属组

shell
# 基础语法
chown [选项] 新所有者 文件名 # 修改所有者
chown [选项] 新所有者:新所属组 文件名 # 同时修改所有者和所属组

# 选项
-R # 递归,如果要修改目录及其中所有文件 / 子目录的所有文件的所有者,需加 -R 选项(递归)

# 示例
chown user1 text.txt  # 将文件 test.txt 的所有者改为用户 user1
chown user1:group1 test.txt  # 将文件 test.txt 的所有者改为 user1,所属组改为 group1

chgrp 修改文件的所属组

shell
# 基础语法
chgrp [选项] 新所属组 文件名

# 选项
-R # 递归,如果要修改目录及其中所有文件 / 子目录的所有文件的所属组,需加 -R 选项(递归)

# 示例
chgrp [选项] group1 text.txt  # 将文件 test.txt 的所属组改为组 group1

注意事项

  1. 普通用户不能修改文件的所有者,哪怕自己是这个文件的所有者也不行
  2. 普通用户只可以修改所有者是自己的文件的权限
  3. 创建用户后,这个用户自成用户组,用户名和所属组名相同
  4. [选项] 为 -R 是给目录中的所有文件设置权限

在 CentOS 系统中,umask(用户文件创建掩码)用于控制新创建文件和目录的默认权限。它通过从默认最大权限中减去掩码值来确定最终权限,避免新文件 / 目录默认拥有过高权限,增强系统安全性。

默认权限与 umask 的关系

文件默认最大权限:666(即 -rw-rw-rw-,无执行权限 x,避免文件默认可执行)。

目录默认最大权限:777(即 drwxrwxrwx,目录需要执行权限才能进入)。

umask 的值为要禁止的权限,计算方式:最终权限 = 默认最大权限 - umask 权限

umask 命令

shell
# 查看当前 umask
umask # 输出示例:0022(表示默认掩码为 022)

# 临时修改 umask
umask 0002  # 临时将掩码改为 0002

# 永久修改 umask
vim /etc/profile  # 编辑 /etc/profile 或 /etc/bashrc(CentOS 中推荐 /etc/profile)
umask 022 # 在文件中添加或修改 umask 配置
source /etc/profile # 保存后执行 source /etc/profile 使配置立即生效。

# 用户级别修改
vim ~/.bash_profile
umask 007  # 例如设置为 007(禁止其他用户的所有权限)
source ~/.bash_profile # 保存后执行 source ~/.bash_profile 使配置立即生效。

常见的 umask 配置

shell
umask 新文件权限(666 - umask)  新目录权限(777 - umask)  说明
000         666(-rw-rw-rw-)      777(drwxrwxrwx)         所有用户可读可写(不安全)
002         664(-rw-rw-r--)      775(drwxrwxr-x)         允许同组用户读写,其他用户只读
022         644(-rw-r--r--)      755(drwxr-xr-x)         仅所有者可写,其他用户只读(默认常用)
077         600(-rw-------)      700(drwx------)         仅所有者有所有权限

注意事项

  1. umask 仅影响新创建的文件 / 目录,对已存在的文件无作用(需用 chmod 修改)。
  2. 不同用户(如 root 和普通用户)可能有不同的默认 umask(例如 root 默认 022,普通用户可能默认 002)。
  3. 若同时配置了系统级和用户级 umask,用户级配置会覆盖系统级。

注解

在 Linux 系统中,ACL(Access Control Lists,访问控制列表)是对传统 Unix 文件权限(用户、组、其他)的扩展,允许对文件 / 目录设置更精细的权限控制。 通过 ACL,你可以为多个用户或组分配不同的权限,而不仅限于文件的所有者、所属组和其他用户三类。

ACL 权限的作用

为特定用户(除所有者外)设置权限

为特定组(除所属组外)设置权限

支持默认 ACL(对目录生效,新创建的文件 / 目录会继承该 ACL)

ACL 权限管理

Linux 中主要通过 getfaclsetfacl 两个命令管理 ACL 权限

shell
# 检查是否安装 ACL
which getfacl setfacl

# 安装 ACL
yum install acl

# 查看文件 / 目录的 ACL 权限
## 基础语法
getfacl 文件 / 目录

## 示例
getfacl test.txt # 查看 test.txt 的 ACL 信息

## 结果解析
## user::rw-                # 所有者权限
## user:alice:r--           # 特定用户 alice 的权限
## group::r--               # 所属组权限
## group:dev:rw-            # 特定组 dev 的权限
## mask::rw-                # 权限掩码(限制除所有者和 other 外的最大权限)
## other::---               # 其他用户权限

# 设置文件 / 目录的 ACL 权限

## 基础语法
setfacl [选项] 权限规则 文件/目录

## 选项
-m:修改 / 添加 ACL 规则
-x:删除指定的 ACL 规则
-b:删除所有 ACL 规则(保留传统权限)
-d:设置默认 ACL(仅对目录有效,新文件 / 目录会继承)
-R:递归应用 ACL(对目录下所有内容生效)

## 示例
setfacl -m u:user1:r test.txt    # 允许 user1 用户,对 test.txt 文件拥有 读 权限
setfacl -m g:group1:rw test.txt  # 允许 group1 组,对 test.txt 文件拥有 读、写 权限
setfacl -x u:user1 test.txt      # 删除用户 user1 的 ACL 权限
setfacl -b test.txt              # 清空所有 ACL 权限:

setfacl -Rm g:group1:rwx dir/    # 允许组 group1 对 dir 目录有读、写、执行权限,并递归应用到子文件/目录
setfacl -d -m u:alice:rw- dir/   # 为 dir 目录设置默认 ACL:新文件自动允许用户 alice 读写

注意

  1. ACL 作用是:用于解决用户身份不足的,即:系统权限无法满足时,单独对目录设置 ACL 权限,
  2. 一旦设置了 ACL 权限,ls -a 看到的权限就不准确了,需要使用 getfacl 文件名 查看 ACL 权限,
  3. 一旦给子目录递归设置权限后权限会溢出,所以建议:能用系统权限解决就不用 ACL 权限做
  4. 默认 ACL 仅对新创建的文件 / 目录生效,已有文件 / 目录需手动设置
  5. ACL 权限不会覆盖传统权限,而是作为补充。例如,传统权限的 other 若为 ---,则 ACL 中即使给其他用户设置权限也无效。

注解

在 CentOS 中,sudo 是用于授予普通用户临时执行管理员权限的工具,通过配置 /etc/sudoers 文件实现权限管理。

普通用户执行 sudo 命令 时,系统会验证该用户是否在 sudoers 配置中被授权,验证通过后(可能需要输入用户自身密码),临时以 root 权限执行命令,执行完毕后权限回收。

sudo 作用

给普通用户赋予部分管理员权限,因为 /sbin/和/usr/sbin/目录下的命令只有管理员可以使用 比如:重启服务器、更新文件等权限,普通用户无法使用,所以可以使用 sudu 命令,将管理员权限指定给用户

sudo 权限管理

sudo 的配置文件 /etc/sudoers,必须使用 visudo 命令编辑

shell
# 基础语法
visudo # 进入 /etc/sudoers 文件的编辑模式
# sudo 配置文件 /etc/sudoers 的内容格式
用户/组  主机=(可切换的用户)  允许执行的命令

# 参数解析
用户 /     # 指定用户(如 testuser)或组(组名前加 %,如 %wheel)。
主机          # 指定允许在哪些主机上使用 sudo(ALL 表示所有主机)。
可切换的用户    # 指定可切换到的用户(ALL 表示所有用户,通常为 root)。
允许执行的命令   # 指定可执行的命令(ALL 表示所有命令,需写绝对路径,如 /bin/ls)。

# 示例
用户名或者组名     被管理主机的地址=(可使用的身份)    授权命令(绝对路径)
root             ALL=(ALL)                     ALL   # 让 root 用户拥有所有权限
%root            ALL=(ALL)                     ALL   # 让 root 组拥有所有权限
user1            ALL=(ALL)                     ALL   # 让 user1 拥有管理员权限(需输入自身密码)
user2            ALL=(ALL)                     NOPASSWD: ALL  # 允许用户免密执行所有命令
% userNoPass     ALL=(ALL)                     NOPASSWD: ALL  # 允许 userNoPass组 免密执行所有命令
user3            ALL=(ALL)       /usr/bin/systemctl, /bin/ls  # 仅允许 user3 执行 systemctl 和 ls 命令
user4            ALL=(ALL)       /sbin/shutdown -r now        # 仅允许 user4 执行 shutdown -r now 重启命令

# 查看当前用户可执行的 sudo 权限
sudo -l

注意事项

  1. 避免给普通用户 NOPASSWD: ALL 权限,仅在必要时使用。
  2. 尽量通过 wheel 组管理 sudo 权限,而非直接修改 sudoers 单个用户。
  3. 定期检查 /var/log/secure 日志(sudo 操作记录),排查异常使用。
  4. visudo 保存时提示语法错误,按 e 重新编辑,切勿强制退出。
  5. 若误操作导致无法使用 sudo,可重启进入单用户模式修改 sudoers。

提示

SUID、SGID、SBIT 权限是 Linux 中特殊且重要的权限,它们能让文件或目录在执行时临时获得额外权限

核心结论是:SUID 针对用户、SGID 针对组、SBIT 针对目录,分别解决 “临时提权执行”“继承组权限” 和 “保护目录内文件” 的问题

三者作用

  1. SUID:让用户执行文件时,临时获得文件所有者权限 SUID(Set User ID)是针对可执行文件的特殊权限,作用是让普通用户执行该文件时,临时拥有文件所有者(通常是 root)的权限。
shell
# 场景
/usr/bin/passwd文件默认带有 SUID 权限,普通用户执行它时,会临时获得 root 权限,从而能修改自己的密码(修改/etc/shadow文件)。

# 权限标识(如何查看文件的 SUID 权限)
在文件所有者权限位的执行位(x)处显示为s,如 -rwsr-xr-x;若所有者原本无执行权限,则显示为S(大写)。
  1. SGID:让用户执行文件时,临时获得文件所属组权限或继承目录组
shell
# 作用
多人协作的项目目录,设置 SGID 后,所有人在该目录下创建的文件都属于同一组,方便共享权限。

# 权限标识(如何查看文件的 SGID 权限)
在文件所属组权限位的执行位(x)处显示为s,如 -rwxr-sr-x;若组原本无执行权限,则显示为S。
  1. SBIT:让用户执行文件时,保护目录内文件不被随意删除 仅作用于目录,核心是限制目录内文件的删除权限 —— 只有文件所有者、目录所有者或 root,才能删除该目录下的文件
shell
# 作用
防止普通用户删除他人在公共目录下的文件,典型场景是/tmp目录(系统临时文件目录)

# 权限标识(如何查看目录的 SBIT 权限)
在目录其他用户权限位的执行位(x)处显示为t,如 drwxrwxrwt;若其他用户原本无执行权限,则显示为T(大写)。

SUID 权限的增、删、查

此权限只是针对执行文件,设置此权限后任何用户都可临时成为此文件的所属着,即拥有执行此文件的权限

shell
chmod u+s /usr/xxx/file1     # 增加 SUID 权限
chmod u-s /usr/xxx/file1     # 删除 SUID 权限
ls -a                        # 查看SUID权限,在所有者位置显示 s 就是拥有SUID权限

SGID 权限的增、删、查

此权限时针对对执行文件和目录,设置此权限后任何用户在执行此文件时都会变成此文件的所属组,也就拥有了此文件的执行权限

shell
chmod g+s /usr/xxx/file1     # 增加 SGID 权限
chmod g-s /usr/xxx/file1     # 删除 SGID 权限
ls -a                        # 查看SGID权限,在所有者位置显示 s 就是拥有SUID权限

SBIT 权限的增、删、查

此权限只是时针对目录,设置此权限后任何用户对此目录都有rwx权限,但是普通用户只能删除自己建立的文件,无法删除其他用户的文件,哪怕有w权限

shell
chmod o+t /usr/xxx/dir1      # 增加 SBIT 权限
chmod o-t /usr/xxx/dir1      # 删除 SBIT 权限
ls -a                        # 查看SBID权限,在其他人位置显示 s 就是拥有SUID权限

三者的数字权限表示法

shell
chmod 4775 file1 等价于 chmod u+s file1    # 第一位是4,代表赋予用户SUID权限
chmod 2775 file1 等价于 chmod g+s file1    # 第一位是2,代表赋予用户SGID权限
chmod 1777 file1 等价于 chmod o+t file1    # 第一位是1,代表赋予用户SBID权限

注意

一般的系统命令文件都有 SUID、SGID、SBIT权限,作用是让非管理员用户临时具有管理员的权限执行命令


在 Linux 系统中,chattr 命令用于修改文件或目录的扩展属性(extended attributes),这些属性可以限制文件的操作权限, 即使是 root 用户也可能受到这些属性的约束。它常被用于增强文件的安全性,防止误删除、篡改或意外修改

chattr 权限管理

  1. 增删改权限
shell
# 基础语法
chattr [选项] [属性] 文件/目录

# 选项
-R # 递归处理目录及其子内容(对目录操作时常用)。
-v <版本> # 设置文件的版本号(较少用)。
-V # 显示命令执行过程的详细信息。

# 属性
i # 不可修改属性,设置后,文件 / 目录无法被删除、重命名、修改内容,也不能添加 / 删除链接,即使 root 用户也不行(除非移除该属性)
a # 仅追加属性,文件只能被追加内容(如日志文件),无法删除、修改已有内容或截断;目录只能创建新文件 / 目录,不能删除已有文件 / 目录。
u # 可恢复属性,删除文件时,数据会被保留,允许通过 lsattr 等工具恢复
d # 不备份属性,设置后,文件 / 目录不会被 dump 命令备份。
s # 安全删除属性,删除文件时,其数据会被彻底清零(覆盖),防止恢复。
  1. 查看权限
shell
lsattr /etc/passwd  # 查看单个文件
lsattr -R /data/backup  # 递归查看目录

示例

shell
# 防止 /etc/passwd 被篡改
chattr +i /etc/passwd

# 允许再次修改文件
chattr -i /etc/passwd

# 确保 /var/log/messages 只能被追加内容
chattr +a /var/log/messages

# 保护 /data/backup 目录下的所有内容,不可篡改
sudo chattr -R +i /data/backup

# 防止 /etc/passwd 被篡改
chattr +i /etc/passwd

注意事项

  1. chattr 的属性优先级高于普通权限(rwx)和 root 权限,设置后需谨慎操作。
  2. 部分属性(如 u、s)仅支持特定文件系统(如 ext 系列),不支持所有文件系统(如 NFS、tmpfs 等)。
  3. 对目录设置 i 或 a 时,仅影响目录本身的操作,不直接限制目录内文件(需单独为文件设置)。
  4. 使用场景:通过 chattr 可以为关键文件(如配置文件、日志文件)添加额外保护