用户权限 - Linux系统特殊权限

1. Linux系统特殊权限概述

Linux系统除了基本的rwx权限外,还有三种特殊权限:SUIDSGIDSticky。这些特殊权限提供了更细粒度的权限控制。

1.1 特殊权限说明

特殊权限 说明 作用位置
SUID 以文件的所属用户身份执行命令, 而不是以当前用户的身份执行命令 文件所有者位置
SGID 将目录设置为sgid后续如果在该目录下创建文件, 都将与该目录的所属组保持一致 文件属组位置
Sticky 任何人都可以在该目录下创建文件以及目录, 但只能删除自己创建的文件和目录 其他用户位置

1.2 特殊权限设置方法

用符号表示:

  • setuid = u+s
  • setgid = g+s
  • sticky = o+t

用数值表示:

  • setuid = 4
  • setgid = 2
  • sticky = 1

组合使用:

1
2
3
4
chmod 4755 file  # SUID
chmod 2755 dir # SGID
chmod 1755 dir # Sticky
chmod 6755 file # SUID + SGID

2. SUID (Set User ID)

2.1 SUID说明

SUID: 文件的执行有效身份为文件的拥有者,而不是执行者的身份。

示例:

1
-rwsr-xr-x. 1 root root 54080 Nov 5 2016 /usr/bin/cat
  • root用户执行cat,最终运行的身份是root
  • bgx用户执行cat,最终运行的身份是bgx(无SUID)

设置SUID后:

  • root用户执行,最终运行的身份是root
  • bgx用户执行,最终运行的身份是root(有SUID)

2.2 SUID演示案例

1
2
3
4
5
6
7
8
9
10
11
12
13
# 检查passwd文件权限,匿名用户没有权限查看
[root@liyanzhao ~]# chmod 640 /etc/passwd
[root@liyanzhao ~]# ll /etc/passwd
-rw-r----- 1 root root 1548 Dec 9 18:45 /etc/passwd

# 使用普通用户无法查看
[liyanzhao@liyanzhao root]$ cat /etc/passwd
cat: /etc/passwd: Permission denied

# 给cat命令赋予suid
[root@liyanzhao ~]# chmod 4755 /bin/cat
[root@liyanzhao ~]# ll /bin/cat
-rwsr-xr-x. 1 root root 48568 Mar 23 2017 /bin/cat

2.3 SUID授权方法

数值方式:

1
chmod 4755 passwd  # 4表示SUID位

符号方式:

1
chmod u+s passwd

2.4 SUID的作用

  1. 让普通用户拥有二进制文件的所属主权限,二进制文件需要有执行权限
  2. 如果设置的二进制文件没有执行权限,那么suid的权限显示就是大S
  3. 特殊权限suid仅对二进制可执行程序有效,其他文件或目录则无效
  4. 如果普通用户需要操作没有权限的文件,为对应的命令赋予Suid权限

注意: suid双刃剑, 是一个比较危险的功能, 对系统安全有一定的威胁。

2.5 SUID权限显示

显示 说明
s 有执行权限,且设置了SUID
S 设置了SUID,但没有执行权限
x 有执行权限,但没有设置SUID

3. SGID (Set Group ID)

3.1 SGID说明

SGID: 将目录设置为sgid后续如果在该目录下创建文件, 都将与该目录的所属组保持一致。

示例:

1
drwxr-srwx. 2 root devops 29 Jun 14 21:01 /opt/

不同用户在该目录下创建文件的情况:

用户 创建文件属主 创建文件属组
bgx用户 bgx devops
xlw用户 xlw devops
root用户 root devops

3.2 SGID演示案例

1
2
3
4
5
6
[root@liyanzhao /]# chmod 777 /opt/
[root@liyanzhao /]# chmod g+s /opt/
[root@liyanzhao /]# su - liyanzhao
[liyanzhao@liyanzhao ~]$ mkdir /opt/sgid_test
[liyanzhao@liyanzhao ~]$ ll /opt/sgid_test -d
drwxrwsr-x. 2 liyanzhao root 4096 Nov 14 00:27 /opt/sgid_test

3.3 SGID授权方法

数值方式:

1
chmod 2755 directory  # 2表示SGID位

符号方式:

1
chmod g+s directory

3.4 SGID的作用

  1. 针对用户组权限位修改,用户创建的目录或文件所属组和该目录的所属组一致
  2. 当某个目录设置了sgid后,在该目录中新建的文件不在是创建该文件的默认所属组
  3. 使用sgid可以使得多个用户之间共享一个目录的所有文件变得简单

3.5 SGID权限显示

显示 说明
s 有执行权限,且设置了SGID
S 设置了SGID,但没有执行权限
x 有执行权限,但没有设置SGID

4. Sticky粘滞位

4.1 Sticky说明

Sticky: 对目录有写权限的用户仅仅可以删除目录里属于自己的文件,不能删除其他用户的文件

系统中存在的/tmp目录是经典的粘滞位目录,谁都有写权限,因此安全成问题,常常是木马第一手跳板。

示例:

1
drwxrwxrwt. 7 root root 93 Jun 14 21:47 /tmp/

4.2 Sticky授权方法

数值方式:

1
chmod 1755 /tmp  # 1表示Sticky位

符号方式:

1
chmod o+t /tmp

4.3 Sticky的作用

  1. 让多个用户都具有写权限的目录,并让每个用户只能删自己的文件
  2. 特殊sticky目录表现在others的x位,用小t表示,如果没有执行权限是T
  3. 一个目录即使它的权限为”777”如果是设置了粘滞位,除了目录的属主和”root”用户有权限删除,除此之外其他用户都不允许删除该目录

4.4 Sticky权限显示

显示 说明
t 有执行权限,且设置了Sticky
T 设置了Sticky,但没有执行权限
x 有执行权限,但没有设置Sticky

5. 权限属性chattr

chattr用于设置文件属性(权限),针对所有用户,包括root。

5.1 chattr常用属性

属性 说明
a 让文件或目录仅可追加内容
i 不得任意更动文件或目录
A 不更新文件的访问时间
S 同步写入磁盘
u 防止文件被删除

5.2 chattr使用示例

1
2
3
4
5
6
7
8
9
10
11
12
# 创建文件并设置属性
[root@liyanzhao ~]# touch file_a file_i
[root@liyanzhao ~]# lsattr file_a file_i
---------------- file_a
---------------- file_i

# 设置属性
[root@liyanzhao ~]# chattr +a file_a
[root@liyanzhao ~]# chattr +i file_i
[root@liyanzhao ~]# lsattr file_a file_i
-----a---------- file_a
----i----------- file_i

5.3 a权限测试

1
2
3
4
5
6
7
8
# a权限, 无法覆盖写入和删除文件
[root@liyanzhao ~]# echo "aa" > file_a
bash: file_a: Operation not permitted
[root@liyanzhao ~]# rm -f file_a
rm: cannot remove 'file_a': Operation not permitted

# a权限, 只能追加, 适用于日志文件
[root@liyanzhao ~]# echo "aa" >> file_a

5.4 i权限测试

1
2
3
4
5
6
7
# i权限, 无法写入, 无法删除
[root@liyanzhao ~]# echo "i" > file_i
bash: file_i: Permission denied
[root@liyanzhao ~]# echo "i" >> file_i
bash: file_i: Permission denied
[root@liyanzhao ~]# rm -f file_i
rm: cannot remove 'file_i': Operation not permitted

5.5 解除限制

1
2
3
4
5
# 解除a属性
[root@tianyun ~]# chattr -a file100

# 解除i属性
[root@tianyun ~]# chattr -i file200

5.6 chattr常用命令

命令 功能
chattr +a file 添加a属性(仅追加)
chattr +i file 添加i属性(不可变)
chattr -a file 移除a属性
chattr -i file 移除i属性
lsattr file 查看文件属性

6. 进程掩码umask

umask用于控制系统权限, 默认系统权限较大, 需要靠Umask来变更权限。

6.1 默认权限

  • 默认新建文件: 系统默认最大权限为666 (rw-rw-rw-)
  • 默认新建目录: 系统默认最大权限是777 (rwxrwxrwx)

我们在新建文件和目录的默认权限会受到umask的影响, umask表示要减掉的权限。

6.2 权限计算公式

  • 创建目录权限值 = 777 - umask
  • 创建普通文件权限值 = 666 - umask

6.3 umask涉及到的相关文件

  • /etc/bashrc
  • /etc/profile
  • ~/.bashrc
  • ~/.bash_profile

注意: umask影响的范围

  • shell (vim,touch) –umask–> 新文件或目录权限
  • vsftpd –umask–> 新文件或目录权限
  • samba –umask–> 新文件或目录权限
  • useradd –umask–> 用户 HOME

6.4 umask计算示例

示例1: umask值为022(所有位为偶数)

1
2
# 文件的起始权限值
6 6 6 - 0 2 2 = 6 4 4

示例2: umask值为045(其他用户组位为奇数)

1
2
# 计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。
6 6 6 - 0 4 5 = 6 2 1

示例3: 默认目录权限计算方法

1
7 7 7 - 0 2 2 = 7 5 5

6.5 umask详细示例

umask 044(所有位全为偶数时)

1
2
3
umask 044
mkdir d044 # 目录733
touch f044 # 文件622

umask 023(umask值的部分或全部位为奇数时)

1
2
3
umask 023
mkdir d023 # 目录754
touch f023 # 文件644

umask 035(umask值的所有位为奇数时)

1
2
3
umask 035
mkdir d035 # 目录742
touch f035 # 文件642

6.6 umask实践示例

示例1: 在shell进程中创建文件

1
2
3
4
5
6
7
8
9
# 查看当前用户的umask权限
[root@liyanzhao ~]# umask
0022

[root@liyanzhao ~]# touch file0022
[root@liyanzhao ~]# mkdir dir0022
[root@liyanzhao ~]# ll -d file0022 dir0022/
drwxr-xr-x 2 root root 6 Jan 24 09:02 dir0022/
-rw-r--r-- 1 root root 0 Jan 24 09:02 file0022

示例2: 修改shell umask值(临时生效)

1
2
3
4
5
6
[root@liyanzhao ~]# umask 000
[root@liyanzhao ~]# mkdir dir000
[root@liyanzhao ~]# touch file000
[root@liyanzhao ~]# ll -d dir000 file000
drwxrwxrwx 2 root root 6 Jan 24 09:04 dir000
-rw-rw-rw- 1 root root 0 Jan 24 09:04 file000

示例3: 修改shell umask值(永久生效, 强烈不建议修改)

1
2
3
4
5
6
7
8
9
[root@liyanzhao ~]# vim /etc/profile
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
umask 002
else
umask 022
fi

# 立即在当前 shell 中生效
[root@liyanzhao ~]# source /etc/profile

示例4: 通过umask决定新建用户HOME目录的权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 设置umask为077
[root@liyanzhao ~]# vim /etc/login.defs
UMASK 077

[root@liyanzhao ~]# useradd dba
[root@liyanzhao ~]# ll -d /home/dba/
drwx------. 4 dba dba 4096 3 月 11 19:50 /home/dba/

# 设置umask为000
[root@tianyun ~]# vim /etc/login.defs
UMASK 000

[root@liyanzhao ~]# useradd sa
[root@liyanzhao~]# ll -d /home/sa/
drwxrwxrwx. 4 sa sa 4096 3 月 11 19:53 /home/sa/

示例5: vsftpd进程配置

1
2
3
4
5
[root@tianyun ~]# yum -y install vsftpd
[root@tianyun ~]# man vsftpd.conf
# 配置项:
anon_umask
local_umask

7. 特殊权限练习题

7.1 实验需求

考试必考: 创建三个用户, 分别为curly、larry、moe,这些用户都是stooges组的成员。

这些用户帐号密码都为password

要求:

  1. 要求以上用户和组可以在/home/stooges目录里访问,创建,删除文件
  2. 其他用户一律不允许访问该目录
  3. 在该目录下新建的文件会自动属于stooges组拥有

7.2 实验步骤

步骤1: 创建用户和组

1
2
3
4
5
6
7
8
9
10
11
12
# 创建组
groupadd stooges

# 创建用户
useradd curly
useradd larry
useradd moe

# 创建密码
echo "password" | passwd --stdin moe
echo "password" | passwd --stdin larry
echo "password" | passwd --stdin curly

步骤2: 将用户加入组

1
2
3
4
5
6
7
8
9
# 将用户加组
gpasswd -a larry stooges
gpasswd -a moe stooges
gpasswd -a curly stooges

# 验证
id curly
id larry
id moe

步骤3: 创建目录并配置权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建目录
mkdir /home/stooges

# 设置目录属组为stooges
chown .stooges /home/stooges
# 或
chown :stooges /home/stooges

# 设置目录权限为770(属主和属组可读写执行,其他用户无权限)
chmod 770 /home/stooges

# 设置SGID位,确保新建文件属于stooges组
chmod g+s /home/stooges

# 验证权限
ll -d /home/stooges
# 输出: drwxrws--- 2 root stooges 4096 Feb 3 10:00 /home/stooges

7.3 验证测试

测试1: curly用户创建文件

1
2
3
4
5
6
7
8
9
10
11
# 切换到curly用户
su - curly

# 进入目录并创建文件
cd /home/stooges
touch curly_file.txt
echo "curly's content" > curly_file.txt

# 查看文件权限(应该属于stooges组)
ll
# 输出: -rw-rw-r-- 1 curly stooges 16 Feb 3 10:05 curly_file.txt

测试2: larry用户修改curly创建的文件

1
2
3
4
5
6
7
8
9
10
# 切换到larry用户
exit
su - larry

# 进入目录
cd /home/stooges

# larry可以查看和修改curly创建的文件(因为都属于stooges组)
cat curly_file.txt
echo "modified by larry" >> curly_file.txt

测试3: larry用户删除curly创建的文件

1
2
# larry可以删除curly创建的文件(因为目录有w权限,且文件属于stooges组)
rm -f curly_file.txt

测试4: 其他用户无法访问

1
2
3
4
5
6
7
# 切换到其他用户(非stooges组成员)
exit
su - testuser

# 尝试访问目录(应该失败)
cd /home/stooges
# 输出: bash: cd: /home/stooges: Permission denied

7.4 完整实验脚本

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
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash
# 特殊权限实验脚本

# 创建组
groupadd stooges

# 创建用户
useradd curly
useradd larry
useradd moe

# 设置密码
echo "password" | passwd --stdin moe
echo "password" | passwd --stdin larry
echo "password" | passwd --stdin curly

# 将用户加入组
gpasswd -a larry stooges
gpasswd -a moe stooges
gpasswd -a curly stooges

# 创建目录并配置权限
mkdir /home/stooges
chown :stooges /home/stooges
chmod 770 /home/stooges
chmod g+s /home/stooges

# 验证
echo "=== 用户信息 ==="
id curly
id larry
id moe

echo "=== 目录权限 ==="
ll -d /home/stooges

echo "=== 实验完成 ==="
echo "curly、larry、moe可以使用密码'password'登录系统"
echo "共享目录: /home/stooges"
echo "所有用户可以在该目录下创建、删除文件"
echo "新建文件自动属于stooges组"

8. 特殊权限总结

8.1 特殊权限对比

特殊权限 数值 符号 作用对象 主要用途
SUID 4 u+s 文件 让普通用户以文件所有者身份执行
SGID 2 g+s 目录/文件 目录:新建文件继承目录属组
文件:以文件属组身份执行
Sticky 1 o+t 目录 只允许删除自己的文件

8.2 特殊权限显示

位置 无特殊权限 SUID SGID Sticky
所有者 rwx rws rwx rwx
属组 rwx rwx rws rwx
其他 rwx rwx rwx rwt

8.3 权限组合示例

1
2
3
4
5
6
7
8
# SUID + SGID
chmod 6755 file # rwsr-sr-x

# SGID + Sticky
chmod 2755 dir # rwxr-sr-x

# 所有特殊权限
chmod 7777 file # rwsrwsrwt(不推荐)

8.4 安全建议

  1. SUID: 谨慎使用,只对必要的可执行文件设置
  2. SGID: 适用于共享目录,方便组内协作
  3. Sticky: 适用于临时目录(如/tmp),防止误删他人文件
  4. chattr: 保护重要配置文件,防止误删或误改
  5. umask: 根据安全需求设置合适的默认权限

9. 命令总结

9.1 特殊权限命令

命令 功能 示例
chmod u+s file 设置SUID chmod 4755 file
chmod g+s dir 设置SGID chmod 2755 dir
chmod o+t dir 设置Sticky chmod 1755 dir

9.2 文件属性命令

命令 功能 示例
chattr +a file 设置仅追加属性
chattr +i file 设置不可变属性
chattr -a file 移除a属性
lsattr file 查看文件属性

9.3 umask命令

命令 功能 示例
umask 查看当前umask值
umask 022 设置umask值(临时)
umask -S 以符号方式显示