Skip to content

5. 权限管理

5.1 理解权限模型

Linux 的权限模型是安全的基石。每个文件/目录都有三组权限,分别对应三类用户:

bash
ls -l /etc/shadow
bash
-rw-r----- 1 root shadow 1234 Jun 20 10:00 /etc/shadow

分解 -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/

符号含义: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/
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 images

5.4 特殊权限位

SUID(Set User ID):执行文件时,临时获得文件所有者的权限。

bash
# SUID 示例:passwd 命令需要读写 /etc/shadow
ls -l /usr/bin/passwd
bash
-rwsr-xr-x 1 root root 68208 Mar 23  2023 /usr/bin/passwd

注意 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 Bit

📝 备注: 📝 经典案例:/tmp目录权限是drwxrwxrwt,最后的t就是 Sticky Bit。所有用户都能在 /tmp 写文件,但只能删除自己的文件。

umask — 默认权限掩码

bash
# 查看当前 umask
umask

# 设置 umask(022 表示新建文件 644,新建目录 755)
umask 022

# 设置更严格的 umask
umask 077   # 新建文件 600,新建目录 700
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--)