Linux 文件权限系统详解:基于UGO的权限管理

一、Linux权限基础概念

1.1 UGO权限模型

Linux使用UGO(User/Group/Other) 三级权限模型:

  • U:文件所有者(User)
  • G:文件所属组(Group)
  • O:其他用户(Other)

1.2 权限类型

每种身份都有三种基本权限:
| 权限 | 字符表示 | 数字表示 | 对文件的影响 | 对目录的影响 |
|——|———-|———-|————–|————–|
| | r | 4 | 查看文件内容 | 列出目录内容 |
| | w | 2 | 修改文件内容 | 在目录中创建/删除文件 |
| 执行 | x | 1 | 执行文件(程序/脚本) | 进入目录 |

二、权限表示方法详解

2.1 字符表示法(ls -l 输出)

权限字符串结构

-rwxr-xr--  1 owner group  size date filename
类型UGO权限 链接数 属主 属组 大小 时间 文件名

权限字符分解

- r w x r - x r - -
│ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ └── 其他用户:执行权限
│ │ │ │ │ │ │ │ └──── 其他用户:写权限
│ │ │ │ │ │ │ └────── 其他用户:读权限
│ │ │ │ │ │ └──────── 所属组:执行权限  
│ │ │ │ │ └────────── 所属组:写权限
│ │ │ │ └──────────── 所属组:读权限
│ │ │ └────────────── 文件所有者:执行权限
│ │ └──────────────── 文件所有者:写权限
│ └────────────────── 文件所有者:读权限
└──────────────────── 文件类型(-普通文件,d目录,l链接等)

实际查看示例

$ ls -l /etc/passwd
-rw-r--r-- 1 root root 1500 Dec 25 10:30 /etc/passwd

$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 Dec 25 11:00 /tmp

$ ls -l /bin/ls
-rwxr-xr-x 1 root root 142144 Oct 18 12:30 /bin/ls

2.2 数字表示法(八进制表示)

权限数字计算

rwx r-x r--  →  111 101 100  →  7 5 4
rw- r-- r--  →  110 100 100  →  6 4 4

常见权限组合数字表示

权限组合 数字表示 字符表示 适用场景
完全权限 777 rwxrwxrwx 临时目录,危险!
所有者全权,其他只读 755 rwxr-xr-x 可执行程序,目录
所有者全权,其他无 700 rwx—— 用户私有目录
所有者读写,其他只读 644 rw-r–r– 配置文件,普通文件
所有者读写,其他无 600 rw——- 敏感数据文件

三、权限管理命令详解

3.1 chmod 命令 - 更改权限

基本语法

chmod [选项] 权限 文件/目录...

权限指定方式

1. 数字方式(最常用)

chmod 755 script.sh
chmod 644 config.txt
chmod 700 ~/.ssh

2. 字符方式(UGO+/-权限)

# 添加权限
chmod u+x script.sh        # 给所有者添加执行权限
chmod g+w file.txt         # 给组添加写权限
chmod o+r document.pdf     # 给其他人添加读权限
chmod a+x program          # 给所有人添加执行权限(a=all)

# 移除权限  
chmod u-w secret.txt       # 移除所有者的写权限
chmod go-rwx confidential  # 移除组和其他人的所有权限

# 设置精确权限
chmod u=rwx,g=rx,o= file   # 设置精确权限(相当于750)

常用选项

选项 说明 示例
-R 递归操作目录及其内容 chmod -R 755 /webroot
-v 显示更改信息 chmod -v 644 *.conf
-c 只在有更改时显示信息 chmod -c 600 key.pem

实战示例

# 设置脚本可执行
chmod +x myscript.sh           # 简写,给所有人执行权限
chmod 755 myscript.sh          # 明确设置权限

# 保护敏感文件
chmod 600 ~/.ssh/id_rsa        # 私钥文件,仅自己可读
chmod 644 ~/.ssh/id_rsa.pub    # 公钥文件,可公开

# 目录权限设置
chmod 755 /var/www/html        # Web目录,需要执行权限才能访问
chmod 700 ~/private            # 私有目录,其他人完全无法访问

# 递归修改目录权限
chmod -R 644 /home/user/docs/  # 修改目录下所有文件权限(危险!会去掉执行权限)
chmod -R 755 /usr/local/bin/  # 保持目录可执行权限

# 组合权限操作
chmod u=rw,go= config.conf    # 设置精确权限(600)
chmod a-w important.txt       # 所有人不可写(防止误修改)

3.2 chown 命令 - 更改所有者和所属组

基本语法

chown [选项] 用户名:组名 文件/目录...
chown [选项] 用户名 文件/目录...        # 只改所有者
chown [选项] :组名 文件/目录...         # 只改组

常用选项

选项 说明 示例
-R 递归操作 chown -R user:group /data
-v 显示详细信息 chown -v user file
-c 只在有更改时报告 chown -c user:group *

实战示例

# 更改文件所有者
chown alice document.txt
chown bob:developers script.sh

# 更改目录所有者(递归)
chown -R www-data:www-data /var/www/html

# 只更改所属组
chown :staff /shared/data
chown -R :developers /project/src

# Web服务器文件权限设置
chown -R www-data:www-data /var/www/example.com
chmod -R 755 /var/www/example.com
find /var/www/example.com -type f -exec chmod 644 {} \;  # 文件644
find /var/www/example.com -type d -exec chmod 755 {} \;  # 目录755

3.3 chgrp 命令 - 更改所属组

基本语法

chgrp [选项] 组名 文件/目录...

示例

chgrp staff report.pdf
chgrp -R developers /project/code

四、umask 原理与使用

4.1 umask 概念解析

umask 作用

umask(权限掩码)决定新创建文件/目录的默认权限

umask 计算规则

  • 目录默认权限:777 - umask
  • 文件默认权限:666 - umask(自动去掉执行权限)

常见umask值与对应权限

umask值 目录权限 文件权限 说明
0022 755 (rwxr-xr-x) 644 (rw-r–r–) 默认设置
0002 775 (rwxrwxr-x) 664 (rw-rw-r–) 组可写
0077 700 (rwx——) 600 (rw——-) 完全私有
0000 777 (rwxrwxrwx) 666 (rw-rw-rw-) 完全开放

4.2 umask 使用实战

查看当前umask

# 查看当前umask(数字显示)
umask
# 输出:0022

# 查看当前umask(符号显示)
umask -S
# 输出:u=rwx,g=rx,o=rx

设置umask值

# 临时设置(当前会话有效)
umask 0022

# 永久设置(添加到shell配置文件中)
echo "umask 0022" >> ~/.bashrc
source ~/.bashrc

# 针对特定用户设置
echo "umask 0002" >> /home/developer/.bashrc  # 开发用户,组可写

umask实际效果测试

# 测试不同umask的效果
umask 0022
mkdir test_dir1
touch test_file1
ls -ld test_dir1 test_file1
# 输出:drwxr-xr-x test_dir1, -rw-r--r-- test_file1

umask 0002
mkdir test_dir2  
touch test_file2
ls -ld test_dir2 test_file2
# 输出:drwxrwxr-x test_dir2, -rw-rw-r-- test_file2

umask 0077
mkdir test_dir3
touch test_file3  
ls -ld test_dir3 test_file3
# 输出:drwx------ test_dir3, -rw------- test_file3

五、特殊权限详解

5.1 三种特殊权限

SUID(Set User ID)

  • 数字表示:4000
  • 字符位置:用户执行位(s代替x)
  • 作用:执行文件时以文件所有者身份运行
  • 示例/usr/bin/passwd

SGID(Set Group ID)

  • 数字表示:2000
  • 字符位置:组执行位(s代替x)
  • 目录作用:新建文件继承目录的组
  • 示例/usr/bin/wall

Sticky Bit(粘滞位)

  • 数字表示:1000
  • 字符位置:其他用户执行位(t代替x)
  • 作用:只有文件所有者和root能删除文件
  • 示例/tmp目录

5.2 特殊权限设置示例

# 设置SUID(普通用户执行passwd时可修改/etc/shadow)
chmod u+s /usr/bin/passwd
chmod 4755 /usr/bin/passwd

# 设置SGID(目录下新建文件自动继承组)
chmod g+s /shared/group_dir
chmod 2775 /shared/group_dir

# 设置Sticky Bit(/tmp目录特性)
chmod o+t /tmp
chmod 1777 /tmp

# 查看特殊权限
ls -ld /tmp /usr/bin/passwd
# 输出:drwxrwxrwt /tmp, -rwsr-xr-x /usr/bin/passwd

六、实际应用场景案例

6.1 Web服务器权限配置

典型Web目录结构权限

# Nginx/Apache网站目录配置
chown -R www-data:www-data /var/www/example.com
find /var/www/example.com -type d -exec chmod 755 {} \;    # 目录755
find /var/www/example.com -type f -exec chmod 644 {} \;    # 文件644

# 可写目录(上传、缓存等)
chmod 775 /var/www/example.com/uploads
chmod 775 /var/www/example.com/cache

# 敏感配置文件
chmod 600 /var/www/example.com/config/database.php

6.2 用户家目录安全配置

安全的家目录设置

# 检查当前家目录权限
ls -ld ~/

# 安全设置(防止其他用户访问)
chmod 750 ~/                    # 目录750
chmod 700 ~/.ssh/               # SSH目录私有
chmod 600 ~/.ssh/*              # 密钥文件私有

# 设置umask保证新文件安全
echo "umask 0077" >> ~/.bashrc   # 或umask 0027(组可读)

6.3 共享目录配置

团队项目目录配置

# 创建共享目录
mkdir /shared/project
chown :developers /shared/project
chmod 2775 /shared/project      # SGID确保文件继承组

# 用户添加到组
usermod -aG developers alice
usermod -aG developers bob

# 设置umask便于协作
echo "umask 0002" >> /etc/profile  # 所有用户新文件组可写

6.4 系统关键文件权限

重要系统文件权限示例

# 密码文件安全
chmod 644 /etc/passwd
chmod 600 /etc/shadow
chmod 600 /etc/gshadow

# 系统日志文件
chmod 640 /var/log/auth.log
chown root:adm /var/log/auth.log

# 定时任务配置
chmod 600 /etc/crontab
chmod 700 /etc/cron.hourly/

七、权限问题排查技巧

7.1 权限检查命令

常用排查命令

# 检查文件权限
ls -l filename
ls -ld directory

# 检查用户身份
id
whoami
groups

# 检查实际权限(测试用户能力)
sudo -u otheruser ls /path/to/file

# 详细权限信息
getfacl filename      # 查看ACL权限(如果设置)

权限问题诊断流程

# 1. 检查文件权限
ls -l problem_file

# 2. 检查文件所有者和组
ls -l problem_file

# 3. 检查当前用户身份和所属组
id

# 4. 检查目录权限(重要!)
namei -l /path/to/problem_file

# 5. 检查SELinux上下文(如果启用)
ls -Z problem_file

7.2 常见权限问题解决

权限被拒绝错误处理

# 问题:无法执行脚本
chmod +x script.sh

# 问题:无法读取文件
chmod o+r file.txt        # 或调整文件所有者

# 问题:无法写入目录
chmod o+w directory/       # 或使用正确用户身份

# 问题:无法删除文件(检查目录写权限和sticky bit)
ls -ld containing_directory/

八、综合课堂练习

练习1:基础权限设置(15分钟)

任务:创建测试环境并设置权限

# 1. 创建测试目录结构
# 2. 设置不同的权限组合
# 3. 测试权限效果
# 4. 理解umask影响

参考答案

# 创建测试环境
mkdir -p /tmp/permission_test/{public,private,shared}
touch /tmp/permission_test/{file1.txt,file2.conf}

# 设置不同权限
chmod 755 /tmp/permission_test/public     # 公共目录
chmod 700 /tmp/permission_test/private    # 私有目录  
chmod 775 /tmp/permission_test/shared     # 共享目录

chmod 644 /tmp/permission_test/file1.txt  # 普通文件
chmod 600 /tmp/permission_test/file2.conf  # 配置文件

# 测试umask影响
umask 0022
touch /tmp/permission_test/umask_test1.txt
umask 0077  
touch /tmp/permission_test/umask_test2.txt
ls -l /tmp/permission_test/umask_test*.txt

练习2:Web服务器权限实战(20分钟)

任务:配置安全的Web目录权限

# 要求:
# 1. 创建Web目录结构
# 2. 设置安全的权限
# 3. 配置可写目录
# 4. 测试权限安全性

参考答案

# 创建Web目录结构
mkdir -p /tmp/webroot/{html,uploads,config,logs}

# 设置所有者和组
chown -R www-data:www-data /tmp/webroot

# 设置目录权限(755)
find /tmp/webroot -type d -exec chmod 755 {} \;

# 设置文件权限(644)
find /tmp/webroot -type f -exec chmod 644 {} \;

# 特殊目录设置
chmod 775 /tmp/webroot/uploads    # 上传目录可写
chmod 750 /tmp/webroot/config     # 配置目录受限
chmod 600 /tmp/webroot/config/db.php  # 数据库配置私有

# 创建测试文件验证
sudo -u www-data touch /tmp/webroot/uploads/test.txt
sudo -u www-data touch /tmp/webroot/html/index.html

# 验证权限
namei -l /tmp/webroot/html/index.html

练习3:权限问题排查(15分钟)

任务:诊断和修复权限问题

# 场景:
# 1. 用户无法访问文件
# 2. 脚本无法执行  
# 3. 目录无法写入
# 4. 特殊权限问题

诊断脚本

#!/bin/bash
check_permission() {
    local file=$1
    echo "=== 检查: $file ==="

    # 检查文件是否存在
    if [ ! -e "$file" ]; then
        echo "错误: 文件不存在"
        return 1
    fi

    # 显示详细信息
    ls -la "$file"
    echo

    # 检查目录权限路径
    if [ -f "$file" ]; then
        echo "路径权限检查:"
        namei -l "$file"
    fi

    # 检查SELinux上下文
    if command -v ls >/dev/null 2>&1 && ls -Z "$file" >/dev/null 2>&1; then
        echo "SELinux上下文:"
        ls -Z "$file"
    fi
}

# 使用示例
check_permission "/path/to/problem/file"

练习4:安全权限配置(10分钟)

任务:编写安全权限配置脚本

# 要求:
# 1. 自动化安全权限设置
# 2. 支持不同场景配置
# 3. 包含错误处理
# 4. 生成权限报告

安全配置脚本框架

#!/bin/bash
# security_permissions.sh

set_secure_permissions() {
    local path=$1
    local type=$2

    case $type in
        "web")
            find "$path" -type d -exec chmod 755 {} \;
            find "$path" -type f -exec chmod 644 {} \;
            ;;
        "config")
            chmod 600 "$path"/*
            ;;
        "scripts")
            find "$path" -name "*.sh" -exec chmod 755 {} \;
            ;;
    esac
    echo "已设置 $path$type 权限模式"
}

# 使用示例
set_secure_permissions "/var/www" "web"
set_secure_permissions "/etc/nginx/conf.d" "config"

通过本教程的深入学习,你应该能够全面掌握Linux UGO权限系统,熟练进行权限管理和故障排查。

作者:严锋  创建时间:2025-11-01 11:27
最后编辑:严锋  更新时间:2025-11-04 21:33