5. 权限管理
5.1 理解权限模型
Linux 的权限模型是安全的基石。每个文件/目录都有三组权限,分别对应三类用户:
bash
ls -l /etc/shadow1
bash
-rw-r----- 1 root shadow 1234 Jun 20 10:00 /etc/shadow1
分解 -rw-r-----:
- 第 1 位-:文件类型(普通文件)
- 第 2-4 位rw-:所有者权限(读+写)
- 第 5-7 位r--:所属组权限(只读)
- 第 8-10 位---:其他人权限(无)
| 权限 | 对文件的含义 | 对目录的含义 | 数字值 |
|---|---|---|---|
| r(read) | 读取文件内容 | 列出目录内容 | 4 |
| w(write) | 修改文件内容 | 在目录中创建/删除文件 | 2 |
| x(execute) | 执行文件(如果是程序) | 进入目录 | 1 |
| - | 无此权限 | 无此权限 | 0 |
💡 提示: 💡 数字计算:将每组权限的数字相加。例如rwxr-xr--= (4+2+1)(4+0+1)(4+0+0) =754
5.2 chmod — 修改权限
bash
# 数字模式(推荐)
chmod 755 script.sh # rwxr-xr-x
chmod 644 config.txt # rw-r--r--
chmod 600 id_rsa # rw-------
chmod 700 ~/.ssh # rwx------
# 符号模式
chmod u+x script.sh # 给所有者添加执行权限
chmod g-w file.txt # 移除组的写权限
chmod o=r file.txt # 设置其他人只有读权限
chmod a+r file.txt # 给所有人添加读权限
# 递归修改目录权限
chmod -R 755 /var/www/html/1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
符号含义:u=所有者(user),g=所属组(group),o=其他人(other),a=所有人(all)。
操作符:+=添加,-=移除,==设置为。
5.3 chown / chgrp — 修改所有者和组
bash
# 修改所有者
sudo chown user1 file.txt
# 修改所有者和组
sudo chown user1:group1 file.txt
# 只修改组
sudo chgrp developers project/
# 递归修改
sudo chown -R www-data:www-data /var/www/html/1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
bash
$ ls -l /var/www/html/
total 12
-rw-r--r-- 1 www-data www-data 405 Jun 20 10:00 index.html
-rw-r--r-- 1 www-data www-data 6.1K Jun 20 10:00 style.css
drwxr-xr-x 2 www-data www-data 4096 Jun 20 10:00 images1
2
3
4
5
2
3
4
5
5.4 特殊权限位
SUID(Set User ID):执行文件时,临时获得文件所有者的权限。
bash
# SUID 示例:passwd 命令需要读写 /etc/shadow
ls -l /usr/bin/passwd1
2
2
bash
-rwsr-xr-x 1 root root 68208 Mar 23 2023 /usr/bin/passwd1
注意 rws 中的 s — 这就是 SUID 标志。
bash
# 设置 SUID
chmod u+s program
chmod 4755 program # 4xxx = SUID
# SGID(Set Group ID)
chmod g+s directory # 目录下新建文件继承组
chmod 2755 directory # 2xxx = SGID
# Sticky Bit(粘滞位)
chmod +t /tmp # 只有文件所有者才能删除自己的文件
chmod 1777 /tmp # 1xxx = Sticky Bit1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
📝 备注: 📝 经典案例:/tmp目录权限是drwxrwxrwt,最后的t就是 Sticky Bit。所有用户都能在 /tmp 写文件,但只能删除自己的文件。
umask — 默认权限掩码
bash
# 查看当前 umask
umask
# 设置 umask(022 表示新建文件 644,新建目录 755)
umask 022
# 设置更严格的 umask
umask 077 # 新建文件 600,新建目录 7001
2
3
4
5
6
7
8
2
3
4
5
6
7
8
bash
$ umask
0022
$ touch test.txt && ls -l test.txt
-rw-r--r-- 1 user user 0 Jun 20 10:00 test.txt
# 文件默认权限 = 0666 - 0022 = 0644 (rw-r--r--)1
2
3
4
5
2
3
4
5