Linux权限完全详解:从原理到实战
Linux权限完全详解:从原理到实战
一、Linux权限概述
1.1 什么是Linux权限?
Linux权限是Linux系统安全的核心机制,用于控制用户对文件和目录的访问权限。每个文件和目录都有三组权限:所有者(Owner)、所属组(Group)、其他用户(Others)。
1.2 为什么要理解Linux权限?
- 安全性:防止未授权访问
- 多用户环境:支持多用户协同工作
- 资源管理:合理分配系统资源
- 故障排查:解决"Permission denied"错误
二、权限的基本概念
2.1 文件类型
在Linux中,文件类型通过第一个字符标识:
| 字符 | 类型 | 说明 |
|---|---|---|
| `-` | 普通文件 | 文本、图片、压缩包等 |
| `d` | 目录 | 文件夹 |
| `l` | 符号链接 | 快捷方式 |
| `c` | 字符设备 | 键盘、鼠标等 |
| `b` | 块设备 | 硬盘、光驱等 |
| `s` | 套接字 | 网络套接字 |
| `p` | 管道 | 进程间通信 |
示例:
$ ls -la /home
drwxr-xr-x 10 root root 4096 Feb 7 10:00 /home
lrwxrwxrwx 1 root root 12 Feb 7 09:00 link -> target
-rw-r--r-- 1 user user 1234 Feb 7 10:00 file.txt
2.2 权限表示方法
#### 字符表示法
r = read(读取) 数值:4
w = write(写入) 数值:2
x = execute(执行) 数值:1
- = 无权限 数值:0
#### 权限位置
rwx rwx rwx
│ │ │
│ │ └── 其他用户权限(Others)
│ └─────── 所属组权限(Group)
└─────────── 文件所有者权限(Owner)
#### 示例说明
-rwxr-xr-x 1 root root 1234 Feb 7 10:00 script.sh
││││││││
││││││││└─ 其他用户:r-x(读+执行)
│││││││└─── 所属组:r-x(读+执行)
││││││└──── 所有者:rwx(读+写+执行)
│││││└───── 文件类型:普通文件(-)
#### 权限详解
| 权限 | 对文件的影响 | 对目录的影响 |
|---|---|---|
| r(读) | 可以读取文件内容 | 可以列出目录内容(ls) |
| w(写) | 可以修改文件内容 | 可以在目录中创建/删除文件 |
| x(执行) | 可以执行文件 | 可以进入目录(cd) |
三、 chmod - 修改权限
3.1 符号模式
使用字符来添加、移除或设置权限:
# 语法
chmod [who][operator][permission] file
# who: u(所有者) g(所属组) o(其他用户) a(所有用户)
# operator: +(添加) -(移除) =(设置)
# permission: r(读) w(写) x(执行)
示例:
# 为脚本添加执行权限
chmod +x script.sh
# 为所有者添加写权限
chmod u+w file.txt
# 移除所属组的写权限
chmod g-w project
# 为所有用户设置只读权限
chmod a=r file.txt
# 同时修改多组权限
chmod u=rwx,g=rx,o=r file.txt
# 递归修改目录权限
chmod -R 755 /var/www/html
3.2 数字模式
使用八进制数字表示权限:
# 语法
chmod [mode] file
# 权限计算
rwx = 4+2+1 = 7
rw- = 4+2+0 = 6
r-x = 4+0+1 = 5
r-- = 4+0+0 = 4
常用权限对照表:
| 数字 | 权限 | 说明 |
|---|---|---|
| 0 | `---` | 无任何权限 |
| 1 | `--x` | 只有执行权限 |
| 2 | `-w-` | 只有写权限 |
| 3 | `-wx` | 写+执行权限 |
| 4 | `r--` | 只有读权限 |
| 5 | `r-x` | 读+执行权限 |
| 6 | `rw-` | 读+写权限 |
| 7 | `rwx` | 读+写+执行权限 |
常用组合:
# 755 - 所有者全权限,组和其他读+执行
chmod 755 file.sh
# 644 - 所有者读写,组和其他只读
chmod 644 document.txt
# 777 - 所有人全权限(不安全!)
chmod 777 shared_folder
# 600 - 只有所有者可读写
chmod 600 private_key
# 700 - 只有所有者可读写执行
chmod 700 secret_folder
3.3 特殊权限
#### SetUID(SUID)
当文件设置了SUID权限时,普通用户执行该文件时会临时获得文件所有者的权限。
# 设置SUID
chmod u+s /usr/bin/passwd
# 查看SUID(文件权限最后一位变为s)
-rwsr-xr-x 1 root root 68208 Jan 15 2024 /usr/bin/passwd
典型应用:
- `/usr/bin/passwd` - 允许普通用户修改自己的密码
- `/usr/bin/su` - 允许切换用户
#### SetGID(SGID)
在目录上设置SGID时,新创建的文件会继承目录的所属组。
# 设置SGID
chmod g+s /project/team
# 查看SGID(组权限最后一位变为s)
drwxr-sr-x 2 root root 4096 Feb 7 10:00 /project/team
#### Sticky Bit(粘滞位)
防止用户删除其他用户的文件,常用于共享目录。
# 设置Sticky Bit
chmod +t /tmp
# 查看Sticky Bit(其他用户权限最后一位变为t)
drwxrwxrwt 10 root root 4096 Feb 7 10:00 /tmp
数字形式设置特殊权限:
# 设置SUID + SGID + Sticky Bit
chmod 4777 file # 4=SUID
chmod 2777 file # 2=SGID
chmod 1777 file # 1=Sticky Bit
chmod 7777 file # 全部特殊权限
四、 chown - 修改所有者和所属组
4.1 基本语法
# 修改文件所有者
chown user file
# 修改文件所属组
chown :group file
# 同时修改所有者和所属组
chown user:group file
4.2 常用示例
# 将文件所有权转移给www-data用户
chown www-data /var/www/html
# 将目录及其内容的所有者改为www-data
chown -R www-data:www-data /var/www/html
# 改变所属组
chown :developers project
# 同时改变所有者和所属组
chown alice:developers report.txt
# 只改变所有者
chown root file
# 只改变所属组
chown :wheel file
4.3 使用参考
# 查看当前用户
whoami
id
# 查看用户所属组
id username
groups username
# 创建新用户
useradd -m -s /bin/bash username
# 创建新组
groupadd groupname
五、ACL - 访问控制列表
5.1 什么是ACL?
ACL提供更细粒度的权限控制,可以为单个用户或组设置权限。
5.2 检查ACL支持
# 检查文件系统是否支持ACL
mount | grep acl
# 如果没有挂载ACL,添加
mount -o remount,acl /dev/sda1
5.3 基本ACL操作
# 查看ACL权限
getfacl file.txt
# 设置用户ACL
setfacl -m u:alice:rw file.txt
# 设置组ACL
setfacl -m g:developers:rw project
# 移除ACL
setfacl -x u:alice file.txt
# 递归设置ACL
setfacl -R -m u:alice:rw /var/www/html
# 设置默认ACL(对新文件生效)
setfacl -d -m u:alice:rw /shared/folder
5.4 ACL示例
# 为特定用户设置权限
setfacl -m u:john:rw- /var/log/app.log
# 为多个用户/组设置权限
setfacl -m u:alice:rw,u:bob:r--,g:devs:r-x file
# 复制ACL到另一个文件
getfacl file1 | setfacl --set-file=- file2
六、 权限掩码(umask)
6.1 什么是umask?
umask决定创建文件或目录时的默认权限。
# 查看当前umask
umask
# 典型umask值
# 文件:666 - umask = 默认权限
# 目录:777 - umask = 默认权限
6.2 常用umask设置
# 设置umask为022(文件644,目录755)
umask 022
# 严格模式(文件640,目录750)
umask 027
# 最严格(文件600,目录700)
umask 077
# 永久设置(添加到.bashrc)
echo "umask 022" >> ~/.bashrc
6.3 umask原理
目录默认权限:777 - umask = 实际权限
文件默认权限:666 - umask = 实际权限
umask 022:
目录:777 - 022 = 755 (rwxr-xr-x)
文件:666 - 022 = 644 (rw-r--r--)
umask 077:
目录:777 - 077 = 700 (rwx------)
文件:666 - 077 = 600 (rw-------)
七、 常见权限问题排查
7.1 Permission Denied错误
# 问题1:没有执行权限
$ cd /var/www
bash: cd: /var/www: Permission denied
# 解决:添加执行权限
sudo chmod +x /var/www
# 问题2:没有读权限
$ cat /etc/shadow
cat: /etc/shadow: Permission denied
# 解决:需要root权限或sudo
sudo cat /etc/shadow
# 问题3:没有写权限
$ touch /opt/app/config
touch: /opt/app/config: Permission denied
# 解决:修改文件所有者或添加写权限
sudo chown $USER:$USER /opt/app
7.2 无法删除文件
# 检查文件属性
ls -la /path/to/file
# 原因1:目录没有写权限
# 解决:修改目录权限
sudo chmod +w /path/to
# 原因2:文件被锁定(Immutable属性)
lsattr /path/to/file
# 如果有 i 属性
sudo chattr -i /path/to/file
# 原因3:属于root的文件
sudo rm /path/to/file
7.3 无法执行脚本
# 检查文件权限
ls -la script.sh
# 解决:添加执行权限
chmod +x script.sh
# 如果仍然无法执行,检查脚本解释器
head -1 script.sh
# 应该类似:#!/bin/bash
# 执行脚本
./script.sh
# 或
bash script.sh
7.4 sudo权限问题
# 检查当前用户是否在sudo组
groups $USER
# 临时获取root权限
sudo -i
# 查看sudoers配置
sudo cat /etc/sudoers
sudo visudo
# 将用户添加到sudo组(需要root)
usermod -aG sudo username
八、 最佳实践
8.1 文件权限建议
| 场景 | 推荐权限 | 说明 |
|---|---|---|
| 脚本文件 | 755 | 所有者可执行,组和其他可读 |
| 配置文件 | 644 | 所有者可读写,组和其他只读 |
| 私钥文件 | 600 | 只有所有者可读写 |
| 网站目录 | 755 | 可读可执行,但不可写 |
| 上传目录 | 775 | 组可写 |
| 临时文件 | 600 | 私有 |
8.2 目录权限建议
| 场景 | 推荐权限 | 说明 |
|---|---|---|
| 系统目录 | 755 | 只有root可写 |
| 共享目录 | 777 | 所有人可访问 |
| 项目目录 | 775 | 组成员可写 |
| 私有目录 | 700 | 只有所有者可访问 |
8.3 安全建议
1. 最小权限原则:只授予必要的最小权限 2. 避免777:永远不要使用777权限 3. 定期检查:定期检查敏感文件权限 4. 使用ACL:需要细粒度控制时使用ACL 5. 日志审计:监控权限变更 6. 特殊权限谨慎使用:SUID/SGID可能带来安全风险
8.4 权限检查脚本
#!/bin/bash
# 检查不安全的文件权限
echo "=== 检查全世界的文件 ==="
find / -perm 777 2>/dev/null | head -20
echo "=== 检查SUID文件 ==="
find / -perm /4000 2>/dev/null | head -20
echo "=== 检查SGID文件 ==="
find / -perm /2000 2>/dev/null | head -20
echo "=== 检查可写目录 ==="
find / -type d -perm -002 2>/dev/null | head -20
九、 实战案例
案例1:配置Web服务器
# 创建Web用户和组
sudo groupadd www-data
sudo useradd -r -s /usr/sbin/nologin -g www-data www-data
# 设置网站目录权限
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
# 上传目录需要可写
sudo chmod 775 /var/www/html/uploads
sudo setfacl -m u:www-data:rwx /var/www/html/uploads
# 配置文件需要特殊权限
sudo chown root:www-data /var/www/html/config.php
sudo chmod 640 /var/www/html/config.php
# 日志目录
sudo chown -R www-data:www-data /var/log/myapp
sudo chmod -R 750 /var/log/myapp
案例2:配置共享目录
# 创建项目目录
sudo mkdir /project/team
sudo groupadd developers
sudo chown root:developers /project/team
sudo chmod 2775 /project/team
# 添加用户到组
sudo usermod -aG developers alice
sudo usermod -aG developers bob
# 设置ACL实现精细控制
setfacl -R -m g:marketing:rx /project/team
setfacl -R -m u:bob:rwx /project/team/bob-project
setfacl -R -m d:u:bob:rwx /project/team/bob-project
案例3:配置SSH密钥
# 生成密钥对
ssh-keygen -t ed25519 -C "user@host"
# 创建.ssh目录
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 创建authorized_keys
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 导入公钥
cat id_ed25519.pub >> ~/.ssh/authorized_keys
# 私钥权限(非常重要!)
chmod 600 ~/.ssh/id_ed25519
十、 总结
核心要点
1. 理解三组权限:所有者(u)、所属组(g)、其他用户(o) 2. 掌握chmod用法:符号模式和数字模式 3. 学会chown:修改所有者和所属组 4. 了解特殊权限:SUID、SGID、Sticky Bit 5. 使用ACL:实现细粒度权限控制 6. umask:理解默认权限的来源
常用命令速查
# 查看权限
ls -la file
# 修改权限
chmod 755 file
chmod +x file
# 修改所有者和所属组
chown user:group file
# ACL操作
getfacl file
setfacl -m u:alice:rw file
# 检查特殊权限
find / -perm 4777
进一步学习
- 深入理解Linux用户和组管理
- 学习SELinux和AppArmor强制访问控制
- 掌握Linux文件系统安全
- 了解容器环境下的权限管理
相关阅读:
- Linux用户和组管理
- SELinux安全机制
- Docker容器权限
- SSH安全配置
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。







